C ***************************************************************** C Delos est un mailleur automatique "surfacique" qui genere une C triangulation pour la simulation et/ou la visualisation. C C Copyright : (1994-2023) MINES PARIS / ARMINES C Authors : Olivier Stab C Website : https://people.minesparis.psl.eu/olivier.stab/delos C License : BSD-3-clause C C ***************************************************************** C *************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_CHAINE.F C OBJET : AFFICHAGE ET SAISIE INTERACTIVE DES TYPES DE BASE. C FONCT. : C ESLCHA : ATTEND UNE CHAINE (AU CLAVIER) C ESECHA : ECRIT UNE CHAINE SUR LE STANDARD OUTPUT C ESERRO : ECRIT UN MESSAGE D'ERREUR SUR LE STANDARD OUTPUT C ESLINT : ATTEND UN OU PLUSIEURS ENTIER(S) AU CLAVIER C ESEINT : ECRIT UN OU PLUSIEURS ENTIER(S) SUR LE C STANDARD OUTPUT C ESLREA : ATTEND UN OU PLUSIEURS REEL(S) AU CLAVIER C ESEREA : ECRIT UN OU PLUSIEURS REEL(S) SUR LE C STANDARD OUTPUT C AUTEUR : O.STAB C DATE : 05.95 C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 14.09.06, ajout messages ESMESS C ***************************************************************** C INTEGER FUNCTION ESLGCH(CHAINE) C ***************************************************************** C OBJET : RENVOI LA LONGUEUR D'UNE CHAINE C ***************************************************************** CHARACTER*(*) CHAINE C INTEGER I,J,LCH C LCH = LEN(CHAINE) J = LCH DO 10 I=1,LCH IF( CHAINE(J:J).NE.' ' )GOTO 888 J = J - 1 10 CONTINUE 888 ESLGCH = J 999 END C SUBROUTINE ESLCHA(IO,LABEL,NOM) C ***************************************************************** C OBJET : ATTEND UNE CHAINE (AU CLAVIER) C ***************************************************************** CHARACTER*(*) NOM,LABEL INTEGER IO C INTEGER ICLAV,IECR PARAMETER (ICLAV = 5, IECR = 6) INTEGER N,ESLGCH EXTERNAL ESLGCH CHARACTER*256 MESSAG C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- N = ESLGCH(LABEL) IF(N.GT.0) > WRITE ( UNIT = IECR, FMT = *,ERR=100)LABEL(:N) READ ( UNIT = ICLAV, FMT = '(A)',ERR=100,END=100) NOM ELSE IF( IO .EQ. 2 )THEN C --- LECTURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- LECTURE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF GOTO 999 C ---------- TRAITEMENT DES ERREURS ------------ 100 CONTINUE CALL ESMESS(-1,38,1,'CE N EST PAS UNE CHAINE ',MESSAG) CALL ESECHA(1,MESSAG,LABEL) 999 END C SUBROUTINE ESECHA(IO,LABEL,NOM) C ***************************************************************** C OBJET : ECRIT UNE CHAINE SUR LE STANDARD OUTPUT C ***************************************************************** CHARACTER*(*) NOM,LABEL INTEGER IO C INTEGER IECR PARAMETER (IECR = 6) INTEGER ESLGCH EXTERNAL ESLGCH CHARACTER*256 MESSAG C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- WRITE ( UNIT = IECR, FMT = *, ERR = 999) > LABEL(:ESLGCH(LABEL)),NOM(:ESLGCH(NOM)) ELSE IF( IO .EQ. 2 )THEN C --- ECRITURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- AFFICHAGE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF C 10 FORMAT(A) 999 END C C SUBROUTINE ESERRO(IO,NUM,MODULE,IMESS) C ***************************************************************** C OBJET ESERRO : ECRIT UN MESSAGE D'ERREUR POUR L'UTILISATEUR C Obsolet ? C ***************************************************************** CHARACTER*(*) IMESS,MODULE INTEGER NUM INTEGER IO C IF( NUM .EQ. -1 )THEN CALL ESECHA(IO, > '--> ERREUR : DONNEES INCORRECTES, ',MODULE) ELSE IF( NUM .EQ. -2 )THEN CALL ESECHA(IO, > '--> ERREUR : PROBLEME MEMOIRE, ',MODULE) ELSE IF( NUM .EQ. -3 )THEN CALL ESECHA(IO, > '--> ERREUR NON ENCORE IMPLEMENTE,',MODULE) ELSE IF( NUM .EQ. 0 )THEN CALL ESECHA(IO, > '--> ATTENTION,',MODULE) ELSE PRINT *,NUM ENDIF ENDIF ENDIF ENDIF CALL ESECHA(IO,IMESS,' ') END C C SUBROUTINE ESLINT(IO,LABEL,IENTIE,NBE) C ***************************************************************** C OBJET : ATTEND UN OU PLUSIEURS ENTIER(S) AU CLAVIER C ***************************************************************** CHARACTER*(*) LABEL INTEGER IO,NBE,IENTIE(*) C INTEGER ICLAV,IECR PARAMETER (ICLAV = 5, IECR = 6) INTEGER ESLGCH EXTERNAL ESLGCH C INTEGER I CHARACTER*256 MESSAG C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- WRITE ( UNIT = IECR, FMT = *) LABEL(:ESLGCH(LABEL)) READ ( UNIT = ICLAV, FMT = *,ERR = 100,END = 100) > (IENTIE(I),I=1,NBE) ELSE IF( IO .EQ. 2 )THEN C --- LECTURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- LECTURE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF GOTO 999 C ---------- TRAITEMENT DES ERREURS ------------ 100 CONTINUE CALL ESMESS(-1,39,1,'CE N EST PAS UN ENTIER ',MESSAG) CALL ESECHA(1,MESSAG,LABEL) DO 10 I=1,NBE IENTIE(I) = 0 10 CONTINUE 999 END C C SUBROUTINE ESEINT(IO,LABEL,IENTIE,NBI) C ***************************************************************** C OBJET : ECRIT UN OU PLUSIEURS ENTIER(S) SUR LE STANDARD OUTPUT C ***************************************************************** CHARACTER*(*) LABEL INTEGER IO INTEGER IENTIE(*),NBI C INTEGER IECR,J PARAMETER (IECR = 6) INTEGER ESLGCH EXTERNAL ESLGCH C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- WRITE ( UNIT = IECR, FMT = *, ERR = 999) > LABEL(:ESLGCH(LABEL)),(IENTIE(J),J=1,NBI) ELSE IF( IO .EQ. 2 )THEN C --- ECRITURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- AFFICHAGE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF 999 END C SUBROUTINE ESLREA(IO,LABEL,REEL,NBE) C ***************************************************************** C OBJET : ATTEND UN OU PLUSIEURS REEL(S) AU CLAVIER C ***************************************************************** CHARACTER*(*) LABEL INTEGER IO,NBE REAL REEL(*) C INTEGER ICLAV,IECR PARAMETER (ICLAV = 5, IECR = 6) INTEGER ESLGCH EXTERNAL ESLGCH C CHARACTER*256 MESSAG INTEGER I C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- WRITE ( UNIT = IECR, FMT = *) LABEL(:ESLGCH(LABEL)) READ ( UNIT = ICLAV, FMT = *,ERR = 100,END = 100) > (REEL(I),I=1,NBE) ELSE IF( IO .EQ. 2 )THEN C --- LECTURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- LECTURE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF GOTO 999 C ---------- TRAITEMENT DES ERREURS ------------ 100 CONTINUE CALL ESMESS(-1,39,1,'CE N EST PAS UN REEL :',MESSAG) CALL ESECHA(1,MESSAG,LABEL) DO 10 I=1,NBE REEL(I) = 0.0 10 CONTINUE 999 END C SUBROUTINE ESEREA(IO,LABEL,REEL,NBR) C ***************************************************************** C OBJET : ECRIT UN OU PLUSIEURS REEL(S) SUR LE STANDARD OUTPUT C ***************************************************************** CHARACTER*(*) LABEL INTEGER IO REAL REEL(*) INTEGER NBR C INTEGER IECR,J PARAMETER (IECR = 6) INTEGER ESLGCH EXTERNAL ESLGCH C IF( IO.EQ. 1 )THEN C --- STANDARD INPUT --- WRITE ( UNIT = IECR, FMT = *, ERR = 999) > LABEL(:ESLGCH(LABEL)),(REEL(J),J=1,NBR) ELSE IF( IO .EQ. 2 )THEN C --- ECRITURE DANS UN FICHIER ESPION --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ELSE IF( IO.EQ. 3 )THEN C --- AFFICHAGE VIA INTERFACE GRAPHIQUE --- CALL ESERRE(1,-3,' ','NON ENCORE IMPLEMENTE') ENDIF ENDIF ENDIF C 999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_ERREUR.F C OBJET : GESTION DES ERREURS ET AUTRES UTILITAIRES GENERAUX C C FONCT. : C OBJET ESINIT : INITIALISATION DU MODE DE MESSAGE C OBJET ESERRE : ECRIT UN MESSAGE D'ERREUR (EN MODE DEBUG) C C REMARQUE : C chaque librairie a sa procedure d'affichage de message pour le debug C C AUTEUR : O.STAB C DATE : 02.05 C MODIFICATIONS : C AUTEUR, DATE, OBJET : C C C ***************************************************************** C C SUBROUTINE ESINIT(ITRACE) C ***************************************************************** C OBJET ESINIT : INITIALISATION DU MODE DEBUG SI ITRACE > 1 C ***************************************************************** INTEGER ITRACE INTEGER IMODE COMMON /MODEES/IMODE IMODE = ITRACE END C C SUBROUTINE ESERRE(IO,NUM,MODULE,MESSAG) C ***************************************************************** C OBJET ESERRE : ECRIT UN MESSAGE D'ERREUR (EN MODE DEBUG) C SUR LE STANDARD OUTPUT C ***************************************************************** CHARACTER*(*) MESSAG,MODULE INTEGER NUM INTEGER IO C INTEGER IMODE COMMON /MODEES/IMODE IF(IMODE.LT.2)GOTO 9999 C IF( NUM .EQ. -1 )THEN CALL ESECHA(IO, > 'ERR -1 DONNEES INCORRECTES DANS :',MODULE) ELSE IF( NUM .EQ. -2 )THEN CALL ESECHA(IO, > 'ERR -2 PROBLEME MEMOIRE DANS :',MODULE) ELSE IF( NUM .EQ. -3 )THEN CALL ESECHA(IO, > 'ERR -3 NON ENCORE IMPLEMENTE DANS :',MODULE) ELSE PRINT *,NUM ENDIF ENDIF ENDIF CALL ESECHA(IO,MESSAG,' ') 9999 END C C ******************************************************************* C FICHIER : ES_GRANDEUR.F C OBJET : ENTREES /SORTIES POUR DES GRANDEURS C FONCT. : C OBJET ECRGRD : ECRIT FICHIER DE GRANDEURS C OBJET LITGRD : LIT UN FICHIER DE GRANDEURS C C AUTEUR : O. STAB C DATE : 08.97 C TESTS : C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 05.98, EXTRAIT LITDENNOD -> LITTSN C O.STAB, 09.04, Message d'erreur pour LITGRD C AUTEUR, DATE, OBJET : o.stab, 14.09.2006, ajout appel ESMESS !! C ******************************************************************* C SUBROUTINE ECRGRD(NOM,ENTETE,RTVANO,IVADIM,NBVANO,IERR) C ***************************************************************** C OBJET ECRGRD : ECRIT FICHIER DE GRANDEURS C C EN ENTREE : C NOM : NOM DU FICHIER C RTVANO : TABLEAU DES GRANDEURS C NBVANO : NOMBRE TOTAL DE GRANDEURS (I.E. NBRE DE NOEUDS) C IVADIM : DIMENSION DES GRANDEURS C C EN SORTIE : C IER=0 : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER C ***************************************************************** CHARACTER*(*) NOM,ENTETE INTEGER IVADIM,NBVANO REAL RTVANO(*) INTEGER IERR C INTEGER IUNIT,I,J INTEGER ESLGCH EXTERNAL ESLGCH CHARACTER*500 CHAINE INTEGER NBCHAR C si pas de nom => CLAVIER ou ECRAN IF( NOM.EQ."" )THEN IUNIT=6 ELSE CALL GESFIC('O',NOM,0,0,IUNIT,IERR) IF(IERR.NE.0)GOTO 9999 ENDIF IERR = -1 C C I. ECRITURE DES NOEUDS C ---------------------- WRITE(IUNIT,'(A)', ERR = 9999) > '* GRANDEUR 1.0.0 (12 AOUT 97)' WRITE (IUNIT,'(A,A)', ERR = 9999) > '* ',ENTETE(:ESLGCH(ENTETE)) WRITE(IUNIT,'(A)')'DEBGRD' WRITE(IUNIT,*) NBVANO, IVADIM DO 10 I=1,NBVANO WRITE(CHAINE,*) I NBCHAR = ESLGCH(CHAINE) DO 5 J=1,IVADIM WRITE(CHAINE(NBCHAR+1:),*) RTVANO((I-1)*IVADIM+J) NBCHAR = ESLGCH(CHAINE) 5 CONTINUE WRITE(UNIT = IUNIT, FMT = * ) CHAINE(:ESLGCH(CHAINE)) 10 CONTINUE WRITE( IUNIT,'(A)')'FINGRD' IERR = 0 100 IF( IUNIT.NE.6 )CALL GESFIC('F',NOM,0,0,IUNIT,IERR) 9999 END C SUBROUTINE LITGRD(IACTIO,NOM,MAXCRD,RTVANO,IVADIM,NBVANO,IERR) C ***************************************************************** C OBJET LITGRD : LIT UN FICHIER DE GRANDEURS C C EN ENTREE : C NOM : NOM DU FICHIER C C RTVANO : TABLEAU DES GRANDEURS C NBVANO : NOMBRE TOTAL DE GRANDEURS (I.E. NBRE DE NOEUDS) C IVADIM : DIMENSION DES GRANDEURS C C EN SORTIE : C IER=0 : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER C C ***************************************************************** CHARACTER*(*) NOM INTEGER IACTIO,MAXCRD,IVADIM,NBVANO REAL RTVANO(*) INTEGER IERR C INTEGER IN,IT,I,J INTEGER NBLC,NUM CHARACTER*256 MESSAG C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,I) IF(IERR.NE.0.OR.I.NE.0) GOTO 908 CALL GESCOM(IN,'DEBGRD',6,'FINGRD',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)GOTO 909 C ====================================== C ---- LECTURE DES VALEURS ---------- C ====================================== REWIND IN REWIND IT READ(IT,*,ERR=910,END=910) NBVANO,IVADIM IF(NBVANO.LE.0.OR.IVADIM.LE.0) GOTO 910 C --- IL FAUT AU MOINS UN POINT ! IF(IACTIO.EQ.0) GOTO 9995 IF(MAXCRD.LE.0) GOTO 9995 IF(IVADIM*NBVANO.GT.MAXCRD) GOTO 90 DO 30 I=1,NBVANO READ(IT,*,ERR=911,END=911) NUM > ,(RTVANO(IVADIM*(NUM-1)+J),J=1,IVADIM) C ---- UN PEU TARD !!! --- IF( (IVADIM*NUM).GT.MAXCRD ) GOTO 90 30 CONTINUE GOTO 9995 C --- TRAITEMENT DES ERREURS (PROGRAMMATION) --- 80 IERR=-1 GOTO 9995 90 IERR=-2 GOTO 9995 C --------------------------------------------- C --- NOUVEAU TRAITEMENT DES ERREURS (UTILISATEUR)--- C --------------------------------------------- 908 IERR =-1 CALL ESMESS(IERR,14,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 909 CONTINUE CALL ESMESS(IERR,26,1,'DEBUT OU FIN BLOC GRD NON TROUVE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 910 IERR = -1 CALL ESMESS(IERR,27,1,'NOMBRE DE GRANDEURS OU DIM INVALID',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 911 IERR = -1 CALL ESMESS(IERR,28,1,'A LA LECTURE DE LA GRANDEUR : ',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 C --- FIN --- 9995 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 9999 END C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_MESH.F C OBJET : LECTURE ET ECRITURE D'UN MAILLAGE C FONCT. : C LITVIP : LECTURE DES BLOCS COORDONNEES ET MAILLAGE C ECRVIP : ECRITURE DES BLOCS COORDONNEES ET MAILLAGE C OBJET VIPELI : CONVERTI UN ELEMENT EN ELEMENT LINEAIRE C OBJET VIPCOD : NOMBRE DE NEOUD ET DIMENSION EN FONCTION DU CODE C OBJET CODVIP : CODE EN FONCTION DU NOMBRE DE NEOUD ET DIMENSION C C AUTEUR : S-M. TIJANI + O.STAB C DATE : 03.95 C MODIFICATIONS : C AUTEUR, DATE, OBJET : C STAB 12.96 COPIE DE TBVTAB ET KNUTA POUR L'INDEPENDANCE DE ES C STAB 11.97 ESLIFR REMPLACE ESLIT1DFR2D C STAB 07.99 NOUVELLES PROCEDURES : VIPCOD ET VIPELI (A TESTER !!!) C EXTRACTION DE ESLIFR,ESTBVT,ESKNUT (-> ES_GEOMETRIE) C STAB 04.02 : on ne converti plus les elements !!! C STAB 09.04 : Message d'erreur pour LITVIP C STAB 10.04 : LITVIP lit le bloc ARE partiellement (pas les regions) C STAB 01.05 : LITVIP renvoi -4 si bloc ARE ! C STAB,13.07.05, Pas de warning (car ca pose des problemes dans le mode "SILENT") C AUTEUR, DATE, OBJET : o.stab, 14.09.2006, ajout appel ESMESS !! C ***************************************************************** C C SUBROUTINE LITVIP(ACTION,NOM,MAXCRD,MAXITR,MAXRMA,MAXTMA, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE,ITRNOE,NMT,REFMAT,TRIMAT,IERR) C ***************************************************************** C OBJET LITVIP : LECTURE D'UN MAILLAGE AU FORMAT VIPLEF C LECTURE DES BLOCS COORDONNEES ET MAILLAGE DANS LE FICHIER NOM C DU TYPE VIPLEF3D C C EN ENTREE : C ACTION : ENTIER INDIQUANT AU S/PROGRAMME LES ENTITES A LIRE C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C MAXCRD : TAILLE MAXIMALE DU TABLEAU REEL COORD C MAXITR : TAILLE MAXIMALE DU TABLEAU ENTIER ITRNOE C MAXRMA : TAILLE MAXIMALE DU TABLEAU ENTIER REFMAT C MAXTMA : TAILLE MAXIMALE DU TABLEAU ENTIER TRIMAT C DE PLUS, SI ACTION > 0 : C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C C EN SORTIE : C IERR=0 : PAS D'ERREUR C IERR=-1 : PROBLEME D'OUVERTURE DU FICHIER C IERR=-2 : L'UN DES TABLEAUX EST TROP PETIT C IERR=-4 : fichier au format GEOMETRIE (bloc ARE) C SI ACTION = 0 (CALL LITVIP(0,'TOTO',0,0,MAXRMA,0, C IDIMC,NBN,0.,IDE,NBNMAX,NBE,0,NMT,REFMAT,0,IERR) C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBE : NOMBRE D'ELEMENTS C SI MAXRMA EST ASSEZ GRAND C NMT : NOMBRE DE MATERIAUX C LE TABLEAU REFMAT CONTIENDRA LES ENTIERS REFERENCES DES C NMT MATERIAUX. C SI ACTION = 1 C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBE : NOMBRE D'ELEMENTS C SI MAXCRD > 0 C LES IDIMC*NBN (OU MAXCRD) COORDONNEES SERONT MISES DANS C LE TABLEAU REEL COORD. C SI MAXITR > 0 C LES NBNMAX*NBE (OU MAXITR) NUMEROS DES NOEUDS DES ELEMENTS C SERONT MIS DANS ITRNOE. C SI MAXRMA EST ASSEZ GRAND C NMT : NOMBRE DE MATERIAUX C LE TABLEAU REFMAT CONTIENDRA LES ENTIERS REFERENCES DES C NMT MATERIAUX. C SI MAXTMA EST ASSEZ GRAND C LE TABLEAU TRIMAT SERA TEL QUE LES ELEMENTS NUMEROS 1 A C TRIMAT(1) SONT DANS LE MATERIAU 1 ET LES ELEMENTS NUMEROS C TRIMAT(I-1)+1 A TRIMAT(I) SONT DANS LE MATERIAU I (1 A NMT). C C ***************************************************************** CHARACTER*(*) NOM INTEGER ACTION,MAXCRD,MAXITR,MAXRMA,MAXTMA INTEGER IDIMC,NBN,IDE,NBNMAX,NBE,NMT,IERR REAL COORD(*) INTEGER ITRNOE(*),REFMAT(*),TRIMAT(*) C C INTEGER IN,IT,N,I,J,IEL,MM,NEL,M,IC,IM,L(27),IDEE INTEGER IN,IT,N,I,J,IEL,MM,NEL,M,IC,IM,L(527),IDEE INTEGER LENCHR,NBLC INTEGER LM INTEGER MAXCOO PARAMETER (MAXCOO=10) REAL XCOORD(MAXCOO) CHARACTER*256 MESSAG C NBE = 0 NBN = 0 IDE = 0 NMT = 0 IDEE = 0 C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,I) IF(IERR.NE.0.OR.I.NE.0) GOTO 908 CALL GESCOM(IN,'DEBXYZ',6,'FINXYZ',6,'*',IT,NBLC,IERR) IF(IERR.NE.0) GOTO 909 REWIND IN REWIND IT C ====================================== C --- 1. LECTURE DES COORDONNEES DES POINTS --- C ====================================== READ(IT,*,ERR=910,END=910) NBN,N IF(NBN.LE.0.OR.N.LE.0)GOTO 910 IF(N.GT.MAXCOO) GOTO 920 C --- IL FAUT AU MOINS UN POINT ! IF(ACTION.EQ.0) THEN IDIMC=N GOTO 35 ENDIF IF(MAXCRD.LE.0) GOTO 35 C --- erreur a l'appel : Pb de programmation en amont ! IF(N.GT.IDIMC) GOTO 80 IF(IDIMC*NBN.GT.MAXCRD) GOTO 90 C --- on verifie les coordonnees meme si ACTION=0---- ajout 10.11.2004. OStab DO 30 I=1,NBN READ(IT,*,ERR=911,END=911) (XCOORD(J),J=1,MIN(N,MAXCOO)) IF(MAXCRD.GT.0)THEN DO 20 J=1,N COORD(IDIMC*(I-1)+J)=XCOORD(J) 20 CONTINUE ENDIF 30 CONTINUE 35 REWIND IT C ====================================== C --- 2. PRELECTURE DES MAILLES --- C ====================================== C --- MODIF O.STAB 24.05.95 : PAS D'ELEMENTS N'EST PAS UNE ERREUR CALL GESCOM(IN,'DEBILM',6,'FINILM',6,'*',IT,NBLC,IERR) C ---- ajout 10.11.2004. OStab IF(IERR.NE.0) THEN IERR = 0 REWIND IT REWIND IN C --- ON ESSAYE LE BLOC ARE ----- CALL GESCOM(IN,'DEBARE',6,'FINARE',6,'*',IT,NBLC,IERR) C --- PAS D'ELEMENTS N'EST PAR UNE ERREUR BUG-18 ----- IF(IERR.NE.0)THEN NBNMAX = 0 NMT = 0 GOTO 917 ENDIF C --- on sort sans message pour pouvoir reprendre la lecture (si NEL!=0 REWIND IT READ(IT,*,ERR=912,END=912) NEL IF(NEL.NE.0)IERR =-4 GOTO 9995 ENDIF REWIND IT C --- PRELECTURE DES MAILLES --- C ====================================== READ(IT,*,ERR=912,END=912) NEL C --- MODIF O.STAB 24.05.95 : PAS D'ELEMENTS N'EST PAS UNE ERREUR IF(NEL.LE.0)THEN NBNMAX = 0 NMT = 0 GOTO 918 ENDIF MM=0 DO 60 IEL=1,NEL READ(IT,*,ERR=913,END=913) M,(L(J),J=1,MIN(M,527)),IC,IM IF ( M.GT.527 )GOTO 914 C --- on peut verifier que 0 CALL VDENTI(1,M,L,ITRNOE(NBNMAX*(J-1)+1)) 70 CONTINUE GOTO 9995 C --- TRAITEMENT DES ERREURS (PROGRAMMATION) --- 80 IERR=-1 GOTO 9995 90 IERR=-2 GOTO 9995 C --------------------------------------------- C --- NOUVEAU TRAITEMENT DES ERREURS (UTILISATEUR)--- C --------------------------------------------- 908 IERR =-1 CALL ESMESS(IERR,14,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 909 CONTINUE CALL ESMESS(IERR,15,1,'DEBUT, FIN DU BLOC XYZ NON TROUVE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 910 IERR = -1 CALL ESMESS(IERR,16,1,'NOMBRE DE POINTS OU DIM INVALIDE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 911 IERR = -1 CALL ESMESS(IERR,17,1,'A LA LECTURE DU POINT : ',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 912 IERR = -1 CALL ESMESS(IERR,29,1,'NOMBRE D ELEMENTS OU DIM INVALIDE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 913 IERR = -1 CALL ESMESS(IERR,30,1,'A LA LECTURE DE L ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 914 IERR = -2 CALL ESMESS(IERR,31,1,'TROP DE POINTS DANS ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,527,1) GOTO 9995 915 CONTINUE CALL ESMESS(IERR,64,1,'CODE DE L ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,IC,1) CALL ESMESS(IERR,30,1,'A LA LECTURE DE L ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 916 IERR = -1 CALL ESMESS(IERR,32,1,' DIM ELEMENT > DIM ESPACE !',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 917 IERR = 0 C CALL ESERRO(1,IERR,'BLOC ILM OU ARE', C > 'LABEL DE DEBUT OU DE FIN ABSENT') GOTO 9995 918 IERR = 0 C CALL ESERRO(1,IERR,'BLOC ILM OU ARE','ATTENTION PAS D ARETE') GOTO 9995 919 IERR= -1 C IF( L(J).GT.NBN.OR.L(J).LT.0 )GOTO 920 CALL ESMESS(IERR,61,1,'REFERENCE NOEUD INCORRECT ',MESSAG) CALL ESEINT(1,MESSAG,L(J),1) CALL ESMESS(IERR,30,1,'A LA LECTURE DE L ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 920 IERR = -2 CALL ESMESS(IERR,22,1,'BLOC XYZ DIMENSION TROP ELEVEE',MESSAG) CALL ESEINT(1,MESSAG,MAXCOO,1) GOTO 9995 C --- FIN --- 9995 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 9999 END C C SUBROUTINE VIPELI(NCODE,IDE,ITRNOE,NBNE,IERR) C ***************************************************************** C OBJET VIPELI : CONVERTI UN ELEMENT EN ELEMENT LINEAIRE C EN ENTREE : C NCODE : LE CODE DE L'ELEMENT C EN SORTIE : C ITRNOE,NBNE : MODIFIES C ***************************************************************** INTEGER NCODE,IDE,ITRNOE(*),NBNE,IERR C IF(NCODE.EQ.1) NBNE=2 IF(NCODE.EQ.2) THEN NBNE=2 ITRNOE(2)=ITRNOE(3) ENDIF IF(NCODE.EQ.3) NBNE=3 IF(NCODE.EQ.4) THEN NBNE=3 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ENDIF IF(NCODE.EQ.5) NBNE=4 IF(NCODE.EQ.6) THEN NBNE=4 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(4) ITRNOE(4)=ITRNOE(6) ENDIF IF(NCODE.EQ.7.OR.NCODE.EQ.8) THEN NBNE=4 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ENDIF IF(NCODE.EQ.9) NBNE=4 IF(NCODE.EQ.10) THEN NBNE=4 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(10) ENDIF IF(NCODE.EQ.11) NBNE=6 IF(NCODE.EQ.12) THEN NBNE=6 ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(8) ITRNOE(6)=ITRNOE(9) ENDIF IF(NCODE.EQ.13) THEN NBNE=6 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(9) ITRNOE(6)=ITRNOE(11) ENDIF IF(NCODE.EQ.14) THEN NBNE=6 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(10) ITRNOE(5)=ITRNOE(12) ITRNOE(6)=ITRNOE(14) ENDIF IF(NCODE.EQ.15) THEN NBNE=6 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(13) ITRNOE(5)=ITRNOE(15) ITRNOE(6)=ITRNOE(17) ENDIF IF(NCODE.EQ.16) NBNE=8 IF(NCODE.EQ.17) THEN NBNE=8 ITRNOE(5)=ITRNOE(9) ITRNOE(6)=ITRNOE(10) ITRNOE(7)=ITRNOE(11) ITRNOE(8)=ITRNOE(12) ENDIF IF(NCODE.EQ.18) THEN NBNE=8 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(9) ITRNOE(6)=ITRNOE(11) ITRNOE(7)=ITRNOE(13) ITRNOE(8)=ITRNOE(15) ENDIF IF(NCODE.EQ.19) THEN NBNE=8 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(10) ITRNOE(6)=ITRNOE(12) ITRNOE(7)=ITRNOE(14) ITRNOE(8)=ITRNOE(16) ENDIF IF(NCODE.EQ.20) THEN NBNE=8 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(13) ITRNOE(6)=ITRNOE(15) ITRNOE(7)=ITRNOE(17) ITRNOE(8)=ITRNOE(19) ENDIF IF(NCODE.EQ.21) THEN NBNE=8 ITRNOE(2)=ITRNOE(3) ITRNOE(3)=ITRNOE(5) ITRNOE(4)=ITRNOE(7) ITRNOE(5)=ITRNOE(19) ITRNOE(6)=ITRNOE(21) ITRNOE(7)=ITRNOE(23) ITRNOE(8)=ITRNOE(25) ENDIF 9999 END C SUBROUTINE VIPCOD(NCODE,IDE,NBNE,IERR) C ***************************************************************** C OBJET VIPCOD : NOMBRE DE NOEUD ET DIMENSION EN FONCTION DU CODE C ***************************************************************** INTEGER NCODE INTEGER IDE,NBNE,IERR C IDE = 0 IERR = 0 NBNE = 0 IF(NCODE.GE.100) THEN IERR = -1 IDE = 1 C ---- les aretes ---- IF(NCODE.EQ.100)THEN NBNE=2 IERR = 0 ENDIF C ---- les polylignes ---- IF(NCODE.EQ.103)THEN NBNE=-1 IERR = 0 ENDIF C ---- les polygones ---- IF(NCODE.EQ.102) THEN NBNE=-1 IDE = 2 IERR = 0 ENDIF C ---- les sommets isoles ---- IF(NCODE.EQ.101) THEN NBNE= 1 IDE = 0 IERR = 0 ENDIF GOTO 9999 ENDIF IF(NCODE.GT.21) NCODE=NCODE-21 IF(NCODE.LT.1.OR.NCODE.GT.21) GOTO 60 IF(NCODE.GE.1.AND.NCODE.LE.2) IDE=MAX(IDE,1) IF(NCODE.GE.3.AND.NCODE.LE.8) IDE=MAX(IDE,2) IF(NCODE.GE.9) IDE=MAX(IDE,3) IF(NCODE.LE.2) NBNE=2 IF(NCODE.GE.3.AND.NCODE.LE.4) NBNE=3 IF(NCODE.GE.5.AND.NCODE.LE.8) NBNE=4 IF(NCODE.GE.9.AND.NCODE.LE.10) NBNE=4 IF(NCODE.GE.11.AND.NCODE.LE.15) NBNE=6 IF(NCODE.GE.16) NBNE=8 GOTO 9999 60 CONTINUE IERR = -1 9999 END C SUBROUTINE CODVIP(IDE,NBNMAX,ITRNOE,NCODE,NBNE,IERR) C ***************************************************************** C OBJET CODVIP : CODE EN FONCTION DU NOMBRE DE NEOUD ET DIMENSION C PB : il y a un probleme pour IDE=1 et NBNE=3 : comment distinguer C un element quadratique d'une polyligne. C ***************************************************************** INTEGER IDE,NBNMAX,ITRNOE(*) INTEGER NCODE,NBNE,IERR C NBNE = NBNMAX NCODE = -1 10 IF(ITRNOE(NBNE).EQ.0)THEN NBNE = NBNE - 1 IF(NBNE.EQ.0)THEN NCODE = -1 IERR = -1 GOTO 9999 ENDIF GOTO 10 ENDIF C GOTO( 11,12,13,14 ) (IDE+1) NCODE = -1 IERR = -1 GOTO 9999 C --- CAS 0D --- IF(NBNE.EQ.1)NCODE = 101 11 GOTO 9999 C --- CAS 1D --- C 12 NBNE = 2 C NCODE = 1 C --- modif 03.04.02 remplace par : 12 IF(NBNE.EQ.2)NCODE = 1 IF(NBNE.EQ.3)NCODE = 2 IF(NBNE.GT.3)NCODE = 102 GOTO 9999 C --- CAS 2D --- 13 NBNE = NBNMAX IF(NBNE.EQ.3)NCODE = 3 IF(NBNE.EQ.4)NCODE = 5 GOTO 9999 C --- CAS 3D --- 14 NBNE = NBNMAX IF( NBNE.EQ.4 )NCODE = 9 IF( NBNE.EQ.6 )NCODE = 11 IF( NBNE.EQ.8 )NCODE = 16 C 9999 END SUBROUTINE ECRVIP(ACTION,NOM, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE,ITRNOE,NMT,REFMAT,TRIMAT,IERR) C ***************************************************************** C OBJET ECRVIP : ecriture des fichiers maillage au format VIPLEF C LECTURE DES BLOCS COORDONNEES ET MAILLAGE DANS LE FICHIER NOM C DU TYPE VIPLEF3D C C EN ENTREE : C ACTION : C ACTION=1 : ecriture d'un nouveau fichier C ACTION=2 : ecriture d'un nouveau fichier ou ecrasement d'un fichier existant C ACTION=3 : concatenation en fin d'un fichier existant C C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBE : NOMBRE D'ELEMENTS C NMT : NOMBRE DE MATERIAUX C SI NMT = 0 ALORS LE MATERIAU DE TOUS LES ELEMENTS C EST FIXE A 1 C REFMAT : LE TABLEAU REFMAT CONTIENDRA LES ENTIERS REFERENCES DES C NMT MATERIAUX. C TRIMAT : LE TABLEAU TRIMAT SERA TEL QUE TRIMAT(I) EST LE NOMBRE C D'ELEMENTS DU MATERIAU REFMAT(I) (1 A NMT). C COORD : LE TABLEAU REEL COORD. C ITRNOE : TABLEAU DES ELEMENTS C C EN SORTIE : C IER=0 : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER C IER=-2 : L'UN DES TABLEAUX EST TROP PETIT C C ***************************************************************** CHARACTER*(*) NOM INTEGER ACTION INTEGER IDIMC,NBN,IDE,NBNMAX,NBE,NMT,IERR REAL COORD(*) INTEGER ITRNOE(*),REFMAT(*),TRIMAT(*) C INTEGER IUNIT,I,J,K INTEGER NBNE,NCODE,NMAT,IMATD,IMATF CHARACTER*256 MESSAG C GOTO (1,2,3) ACTION 1 CONTINUE C --- Creation d'un nouveau fichier CALL GESFIC('O',NOM,0,0,IUNIT,IERR) IF(IERR.NE.0)GOTO 901 GOTO 9 2 CONTINUE C --- ecriture d'un nouveau fichier ou ecrasement d'un fichier existant CALL GESFIC('O',NOM,3,0,IUNIT,IERR) IF(IERR.NE.0)GOTO 902 GOTO 9 3 CONTINUE C --- concatenation en fin d'un fichier existant IERR = -3 GOTO 904 9 CONTINUE C C I. ECRITURE DES NOEUDS C ---------------------- WRITE(IUNIT,'(A)')'DEBXYZ' WRITE(IUNIT,*) NBN, IDIMC DO 10 I=1,NBN WRITE(IUNIT,*) (COORD((I-1)*IDIMC+J),J=1,IDIMC) 10 CONTINUE WRITE( IUNIT,'(A)')'FINXYZ' C C I. ECRITURE DES ELEMENTS C ------------------------ IF( NBE .EQ. 0 )GOTO 100 WRITE(IUNIT,'(A)')'DEBILM' WRITE(IUNIT,*) NBE C IF(NMT.LT.1)THEN NMAT = 1 DO 70 J=1,NBE CALL CODVIP(IDE,NBNMAX,ITRNOE((J-1)*NBNMAX+1),NCODE,NBNE,IERR) C MODIF 27.10.98 LE FORMAT LIBRE POSE DES PROBLEMES CAR SUR L'O2 C LA LIGNE NE CONTIENT ALORS QUE 73 CARACTERES... IF(IERR.NE.0)GOTO 903 WRITE(UNIT=IUNIT,FMT='(11I10)')NBNE, > (ITRNOE((J-1)*NBNMAX+K),K=1,NBNE), > NCODE,NMAT 70 CONTINUE ELSE C C --- LES MATERIAUX SONT DEFINIS --- IMATD = 1 DO 90 I=1,NMT NMAT = REFMAT(I) IMATF = TRIMAT(I) DO 80 J=IMATD,IMATF CALL CODVIP(IDE,NBNMAX,ITRNOE((J-1)*NBNMAX+1),NCODE,NBNE,IERR) IF(IERR.NE.0)GOTO 903 WRITE(UNIT=IUNIT,FMT='(11I10)')NBNE, > (ITRNOE((J-1)*NBNMAX+K),K=1,NBNE), > NCODE,NMAT 80 CONTINUE IMATD = IMATF + 1 90 CONTINUE ENDIF WRITE( IUNIT,'(A)')'FINILM' C 100 CALL GESFIC('F',NOM,0,0,IUNIT,IERR) GOTO 9999 c ----------- messages d'erreur -------------- 901 CONTINUE CALL ESMESS(IERR,23,1,'ATTENTION LE FICHIER EXISTE DEJA',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 902 CONTINUE CALL ESMESS(IERR,24,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 903 CONTINUE CALL ESMESS(IERR,25,1,'A L ECRITURE D UN ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,J,1) CALL GESFIC('F',NOM,0,0,IUNIT,IERR) GOTO 9999 904 CONTINUE CALL ESMESS(IERR,1,1,'PAS ENCORE IMPLEMENT',MESSAG) CALL ESECHA(1,MESSAG,' ') 9999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_GEOMETRIE.F C OBJET : LECTURE DE LA FRONTIERE D'UN DOMAINE MULTI-REGION C (BREP) C FONCT. : C OBJET LITFRT : LECTURE DE LA FRONTIERE D'UN DOMAINE A MAILLER C OBJET ESLIFR : LIT UN MAILLAGE FRONTIERE (DU MAILLAGE A CALCULER) C OBJET ESTBVT: RENVOI LES VALEURS DISTINCTES D'UN TABLEAU, C OBJET ESKNUT : TRI UN TABLEAU D'ENTIERS DANS L'ORDRE CROISSANT C AUTEUR : O.STAB C DATE : 21.07.99 C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 8/4/2002,remp. de DSERRE par ESERRO C O.STAB,09.04, Message d'erreur pour LITFRT C O.STAB,04.11.04, BUG LITFRT quand pas d'elements C O.STAB,07.01.05, nouveau format d'arete LITGEO C O.STAB,25.05.05, BUG LITFRT quand ITYPE=99 (sommets isoles) C O.STAB,10.06.05, message d'erreur element contenant mauvaises C reference au point C O.STAB,13.07.05, Pas de warning (car ca pose des problemes dans C le mode "SILENT") C AUTEUR, DATE, OBJET : o.stab, 14.09.2006, ajout appel ESMESS !! C O.STAB,25.11.11, MAXNOD=10000 dans LITARE (pour SCILAB) C C ***************************************************************** C SUBROUTINE LITGEO(IT,IDE,INODES,MAXNOD,M,IREGIO,MAXREG,MR,IC,IERR) C ***************************************************************** C OBJET LITGEO : LECTURE D'UNE GEOMETRIE FILAIRE (LIGNE,...) C EN ENTREE : C IT : l'identifiant du fichier C MAXNODE, MAXREG : taille des tableaux INODES et IREGIO C EN SORTIE : C IDE : la dimension de la maille C INODES(M) : tableau contenant les noeuds (ou points de la ligne) C IREGIO(MR) : tableau contenant les regions incidentes a la ligne C IC : le type de ligne : C 99 : noeuds isoles C 100 : noeuds connectes lineairement = ligne brisee C 101 : 3 noeuds connectes par un arc C ***************************************************************** INTEGER IT INTEGER IDE,INODES(*),MAXNOD,M,IREGIO(*),MAXREG,MR,IC,IERR C INTEGER I,J,IDEBUT,IFIN,IPAS,INUM CHARACTER*256 MESSAG C READ(IT,*,ERR=901,END=902)M,(INODES(J),J=1,MIN(ABS(M),MAXNOD)),IC, > MR,(IREGIO(J),J=1,MIN(MR,MAXREG)) C ---- VERIFICATION ---- IDE = 0 IF(MR.GT.10)GOTO 903 IF(M.GT.MAXNOD)GOTO 904 C ---- LISTE DES NOEUDS ---- C --- si M positif : c'est directement la liste des noeuds C --- si M negatif : c'est un intervalle IF( M.LT.0 )THEN IF( M.NE.-3 )GOTO 908 IDEBUT = INODES(1) IFIN = INODES(2) IPAS = INODES(3) M = 0 DO 5 INUM=IDEBUT,IFIN,IPAS M = M + 1 IF(M.GT.MAXNOD)GOTO 904 INODES(M)=INUM 5 CONTINUE IF( M.EQ.0 )GOTO 909 ENDIF C ---- INTERPOLATION ENTRE LES NOEUDS ---- GOTO(10,20,30) IC-98 GOTO 905 C --- un sommet isole : 99 --- 10 CONTINUE IF(M.LT.1)GOTO 906 IF(MR.GT.1)GOTO 906 IDE = 0 GOTO 100 C --- une arete ou une polyligne : 100 --- 20 CONTINUE IF(M.LT.2)GOTO 906 IDE = 1 GOTO 100 C --- un arc de cercle : 101 --- 30 CONTINUE IF(M.NE.3)GOTO 906 GOTO 100 C ---- COPIE DES ELEMENTS ---- 100 CONTINUE GOTO 9999 C ----------------------- C --- TRAITEMENT DES ERREURS --- C ----------------------- 901 IERR=-1 CALL ESMESS(IERR,2,1,' LECTURE D UNE FRONTIERE',MESSAG) CALL ESECHA(1,MESSAG,' ') c > 'ENREGISTREMENTS INCORRECT') GOTO 9999 902 IERR=-1 CALL ESMESS(IERR,3,1,'DEFINITION FRONTIERE INCOMPLETE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 903 IERR=-2 CALL ESMESS(IERR,4,1,'TROP DE REGIONS SUR UNE FRONTIERE >',MESSAG) CALL ESEINT(1,MESSAG,MAXREG,1) GOTO 9999 904 IERR=-1 CALL ESMESS(IERR,5,1,'TROP DE NOEUDS SUR UNE FRONTIERE >',MESSAG) CALL ESEINT(1,MESSAG,MAXNOD,1) GOTO 9999 905 IERR=-1 CALL ESMESS(IERR,6,1,'CODE DE FRONTIERE INCONNU :',MESSAG) CALL ESEINT(1,MESSAG,IC,1) GOTO 9999 906 IERR=-1 CALL ESMESS(IERR,7,1,'NOMBRE DE NOEUDS INCORRECT :',MESSAG) CALL ESEINT(1,MESSAG,M,1) GOTO 9999 907 IERR=-1 CALL ESMESS(IERR,8,1,'NOMBRE DE REGION INCORRECT:',MESSAG) CALL ESEINT(1,MESSAG,MR,1) GOTO 9999 908 IERR=-1 CALL ESMESS(IERR,9,1,'CODE D INTERVALLE INCORRECT (-3):',MESSAG) CALL ESEINT(1,MESSAG,M,1) GOTO 9999 909 IERR=-1 CALL ESMESS(IERR,10,1,'L INTERVAL EST VIDE :',MESSAG) CALL ESEINT(1,MESSAG,M,1) GOTO 9999 C 9999 END C SUBROUTINE LITARE(IT,IDE,IORIG,IEXTR,M,IREGIO,MR,IERR) C ***************************************************************** C OBJET LITARE : LECTURE D'UNE ARETE C ***************************************************************** INTEGER IT INTEGER IDE,IORIG,IEXTR,M,IREGIO(*),MR,IERR C C --- CODE POUR LES ELEMENTS DE TYPE : ARETE DE FRONTIERE INTEGER MAXNOD,MAXREG C PARAMETER (MAXNOD=27,MAXREG=10) C OS. 11.2011 : MAXNOD >> 27 avec des genrateurs (comme SCILAB) PARAMETER (MAXNOD=10000,MAXREG=10) INTEGER L(MAXNOD),LR(MAXREG),I,J,IC INTEGER CODARE PARAMETER (CODARE = 100) CHARACTER*256 MESSAG C READ(IT,*,ERR=901,END=902) M, ( L(J),J=1,MIN(M ,MAXNOD)),IC, > MR,(LR(J),J=1,MIN(MR,MAXREG)) C ---- VERIFICATION ---- IDE = 0 IF(MR.GT.10)GOTO 903 IF((IC.NE.CODARE).OR.(M.NE.2))GOTO 904 C ---- COPIE DES ELEMENTS ---- IDE = 1 IORIG = L(1) IEXTR = L(2) DO 20 J=1,MR IREGIO(J)=LR(J) 20 CONTINUE GOTO 9999 C ----------------------- C --- TRAITEMENT DES ERREURS --- C ----------------------- 901 IERR=-1 CALL ESMESS(IERR,2,1,'LECTURE D UNE FRONTIERE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 902 IERR=-1 CALL ESMESS(IERR,3,1,'DEFINITION FRONTIERE INCOMPLETE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 903 IERR=-2 CALL ESMESS(IERR,4,1,'TROP DE REGION SUR LA FRONTIERE >',MESSAG) CALL ESEINT(1,MESSAG,MAXREG,1) GOTO 9999 904 IERR=-1 CALL ESMESS(IERR,7,1,'NOMBRE DE NOEUDS INCORRECT !',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 9999 END C C SUBROUTINE LITFRT(ACTION,NOM,MAXCRD,MAXITR,MAXRMA,MAXTMA, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE,ITRNOE, > NMT,REFMAT,NBRMAX,TRIMAT,IERR) C ***************************************************************** C OBJET LITFRT : LECTURE DE LA FRONTIERE D'UN DOMAINE A MAILLER C IDEM DS1 MAIS TRIMAT N'EST PLUS LES INTERVALS : C C'EST DIRECTEMENT LES REFERENCES DES ELEMENTS ! C EN ENTREE : C ACTION : ENTIER INDIQUANT AU S/PROGRAMME LES ENTITES A LIRE C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C MAXCRD : TAILLE MAXIMALE DU TABLEAU REEL COORD C MAXITR : TAILLE MAXIMALE DU TABLEAU ENTIER ITRNOE C MAXRMA : TAILLE MAXIMALE DU TABLEAU ENTIER REFMAT C MAXTMA : TAILLE MAXIMALE DU TABLEAU ENTIER TRIMAT C DE PLUS, SI ACTION > 0 : C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBRMAX : NOMBRE MAXIMAL DE REGIONS PAR ELEMENT C C EN SORTIE : C IERR=0 : PAS D'ERREUR C IERR=-1 : PROBLEME D'OUVERTURE DU FICHIER C IERR=-2 : L'UN DES TABLEAUX EST TROP PETIT C ---- LES DIMENSIONS DU MAILLAGE --- C SI ACTION = 0 C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBE : NOMBRE D'ELEMENTS C NBRMAX : NOMBRE MAXIMAL DE REGIONS PAR ELEMENT C SI MAXRMA EST ASSEZ GRAND C NMT : NOMBRE DE REGIONS (DE FACES) C LE TABLEAU REFMAT CONTIENDRA LES ENTIERS REFERENCES DES C NMT FACES. C C SI ACTION = 1 C COORD : SI MAXCRD > 0 C LES IDIMC*NBN (OU MAXCRD) COORDONNEES SERONT MISES DANS C LE TABLEAU REEL COORD. C C ITRNOE : SI MAXITR > 0 C LES NBNMAX*NBE (OU MAXITR) NUMEROS DES NOEUDS DES ELEMENTS C SERONT MIS DANS ITRNOE. C C NMT,REFMAT,TRIMAT: C NMT : NOMBRE DE REGIONS (DE FACE EN 3D) C REFMAT: SI MAXRMA EST ASSEZ GRAND C CONTIENDRA LES ENTIERS REFERENCES DES NMT REGIONS. C C NBRMAX : NOMBRE MAXIMUM DE REGIONS INCIDENTES A UNE ARETE C TRIMAT : SI MAXTMA EST ASSEZ GRAND C LES NBRMAX*NBE REFERNCES ASSOCIEES AUX ELEMENTS C C REMARQUES TRIMAT : C 1. CAS 2D MONO-POLYGONE (NBRMAX =1) C FRONTIERES REELLES (VIDE/PLEIN) C TRIMAT() = (0,+I) OU (+I,0) OU (I) C C 2. CAS 2D MULTI-POLYGONE OU 3D MONO-POLYEDRE (NBRMAX=2) C FRONTIERES INTER-MATERIAUX (MATI/MATJ) C TRIMAT() = (+I,+J) C MATERIAU A DROITE ET A GAUCHE DES ARETES FRONTIERES C (TRIMAT((I-1)*2+1),TRIMAT((I-1)*2+2)) I EST LE NUMERO DE L'ELEMENT C C 3. CAS 3D MULTI-POLYEDRES (NBRMAX > 2) C FRONTIERE INTER-MATERIAUX (MAT1/MAT2/MAT3...) C TRIMAT() = (+I,J,K,...) C ON TOURNE DANS LE SENS DIRECT AUTOUR DE L'ARETE C C (OBSOLET ? UN MATERIAU INCONNU = -1) C C ***************************************************************** CHARACTER*(*) NOM INTEGER ACTION,MAXCRD,MAXITR,MAXRMA,MAXTMA INTEGER IDIMC,NBN,IDE,NBNMAX,NBE,NMT,NBRMAX,IERR REAL COORD(*) INTEGER ITRNOE(*),REFMAT(*),TRIMAT(*) C INTEGER MAXREG,MAXCOO,MAXNOD PARAMETER (MAXREG=10,MAXCOO=10,MAXNOD=10000) INTEGER IN,IT,N,I,J,IEL,NEL,M,MM,MR,MMR INTEGER ISEG,INOD,IDEE INTEGER INODES(MAXNOD),IREGIO(MAXREG),ITYPE INTEGER NBLC REAL XCOORD(MAXCOO) CHARACTER*256 MESSAG C --- le test de la memoire : IF(MAXRMA.GT.0)REFMAT(MAXRMA) = 0 IF(MAXTMA.GT.0)TRIMAT(MAXTMA) = 0 IF(MAXITR.GT.0)ITRNOE(MAXITR) = 0 C IERR = 0 NBE = 0 NBN = 0 IDE = 0 NMT = 0 IDEE = 0 IF(ACTION.LE.0) THEN IDIMC = 0 NBNMAX = 0 NBRMAX = 0 ENDIF C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,I) IF(IERR.NE.0.OR.I.NE.0) GOTO 908 C ====================================== C --- 1. BLOC DES COORDONNEES DES POINTS --- C ====================================== CALL GESCOM(IN,'DEBXYZ',6,'FINXYZ',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)GOTO 909 REWIND IN REWIND IT C --- LECTURE DES COORDONNEES DES POINTS --- C ====================================== READ(IT,*,ERR=910,END=910) NBN,N IF(NBN.LE.0.OR.N.LE.0) GOTO 910 IF(N.GT.MAXCOO) GOTO 920 C --- IL FAUT AU MOINS UN POINT ! IF(ACTION.EQ.0) THEN IDIMC=N ELSE IF(MAXCRD.GT.0)THEN IF(N.GT.IDIMC) GOTO 906 IF(IDIMC*NBN.GT.MAXCRD) GOTO 907 ENDIF ENDIF C --- on verifie les coordonnees meme si ACTION=0 DO 30 I=1,NBN READ(IT,*,ERR=911,END=911) (XCOORD(J),J=1,MIN(N,MAXCOO)) IF(MAXCRD.GT.0)THEN DO 20 J=1,N COORD(IDIMC*(I-1)+J)=XCOORD(J) 20 CONTINUE ENDIF 30 CONTINUE REWIND IT C ====================================== C --- 2. BLOC DES MAILLES --- C ====================================== C --- MODIF O.STAB 24.05.95 : PAS D'ELEMENTS N'EST PAS UNE ERREUR REWIND IN CALL GESCOM(IN,'DEBILM',6,'FINILM',6,'*',IT,NBLC,IERR) C PRINT *,'NBLC DS DEBILM: ',NBLC IF(IERR.NE.0) THEN IERR = 0 REWIND IT REWIND IN C --- ON ESSAYE LE BLOC ARE ----- CALL GESCOM(IN,'DEBARE',6,'FINARE',6,'*',IT,NBLC,IERR) C --- PAS D'ELEMENTS N'EST -A PRIORI- PAR UNE ERREUR BUG-18 ----- IF(IERR.NE.0)THEN NBNMAX = 0 NBRMAX = 0 GOTO 917 ENDIF ENDIF REWIND IT C --- PRELECTURE DES ARETES --- C ====================================== READ(IT,*,ERR=912,END=912) NEL IF(NEL.LE.0)THEN NBNMAX = 0 NBRMAX = 0 GOTO 918 ENDIF MM=0 MMR = 0 NBE = 0 DO 66 IEL=1,NEL C CALL LITARE(IT,IDEE,IORIG,IEXTR,M,IREGIO,MR,IERR) CALL LITGEO(IT,IDEE,INODES,MAXNOD,M,IREGIO,MAXREG,MR,ITYPE,IERR) IF(IERR.NE.0)GOTO 913 C --- on verifie que tout les noeuds sont corrects : DO 45 INOD=1,M IF((INODES(INOD).GT.NBN).OR.(INODES(INOD).LT.1))GOTO 914 45 CONTINUE C --- pour les sommets isoles IF(M.EQ.1)NBE=NBE+1 C --- pour les polylignes et ensemble de noeuds isoles ! BUG O.Stab 26.05.05 IF(M.GT.1)THEN IF(ITYPE.EQ.99)NBE=NBE+M IF(ITYPE.EQ.100)NBE=NBE+(M-1) ENDIF C IF(IDEE.GT.IDIMC)GOTO 916 IDE=MAX(IDE,IDEE) IF( ITYPE.EQ.100 )THEN MM=MAX(MM,2) ELSE IF( ITYPE.EQ.99 )THEN MM=MAX(MM,1) ELSE MM=MAX(MM,M) ENDIF ENDIF MMR=MAX(MMR,MR) C --- ON COMPTE LES REGIONS (LES FACES EN 3D) C --- ON COMPARE IRGDIR --- C ----------------- DO 56 J=1,MR IF(IREGIO(J).EQ.0)GOTO 56 DO 55 I=1,NMT IF(REFMAT(I).EQ.IREGIO(J)) THEN GOTO 56 ENDIF 55 CONTINUE C --- AJOUT D'UNE NOUVELLE REGION NMT = NMT+1 IF(MAXRMA.GE.NMT)REFMAT(NMT)=IREGIO(J) 56 CONTINUE 66 CONTINUE C IF(ACTION.LE.0) THEN NBNMAX=MM NBRMAX=MMR GOTO 9995 ENDIF IF(MAXRMA.GT.0.AND.MAXRMA.LT.NMT) GOTO 907 IF(MAXTMA.GT.0.AND.MAXTMA.LT.(2*NBE)) GOTO 907 IF(MAXITR.GT.0.AND.MAXITR.LT.NBNMAX*NBE) GOTO 907 C REWIND IT READ(IT,*,ERR=912,END=912) NEL C ====================================== C --- 4. LECTURE DES MAILLES --- C ici NBNMAX,NBRMAX doivent etre donnes par l'appelant C MAXITR,MAXTMA doivent etre non nuls ! C ====================================== NBE=0 DO 500 IEL=1,NEL CALL LITGEO(IT,IDEE,INODES,MAXNOD,M,IREGIO,MAXREG,MR,ITYPE,IERR) IF(IERR.NE.0)GOTO 913 C GOTO(100,200,300) ITYPE-98 GOTO 913 C --- des sommets isoles : 99 --- C ------------------------- 100 CONTINUE DO 169 INOD=1,M C --- recopie les noeuds dans la structure de donnees NBE = NBE+1 IF((MAXITR.GE.NBE*NBNMAX).AND.(NBNMAX.GT.0))THEN ITRNOE((NBE-1)*NBNMAX+1)= INODES(INOD) ITRNOE((NBE-1)*NBNMAX+2)= 0 ENDIF C --- recopie les regions dans la structure de donnees IF((MAXTMA.GE.NBE*NBRMAX).AND.(NBRMAX.GT.0))THEN DO 167 J=1,MR TRIMAT((NBE-1)*NBRMAX+J)= IREGIO(J) 167 CONTINUE DO 168 J=MR+1,NBRMAX TRIMAT((NBE-1)*NBRMAX+J)= 0 168 CONTINUE ENDIF 169 CONTINUE GOTO 500 C --- une arete ou une polyligne : 100 --- C -------------------------------- 200 CONTINUE DO 269 ISEG=1,M-1 C --- recopie les noeuds dans la structure de donnees NBE = NBE+1 IF((MAXITR.GE.NBE*NBNMAX).AND.(NBNMAX.GT.0))THEN ITRNOE((NBE-1)*NBNMAX+1)= INODES(ISEG) ITRNOE((NBE-1)*NBNMAX+2)= INODES(ISEG+1) ENDIF C --- recopie les regions dans la structure de donnees IF((MAXTMA.GE.NBE*NBRMAX).AND.(NBRMAX.GT.0))THEN DO 267 J=1,MR TRIMAT((NBE-1)*NBRMAX+J)= IREGIO(J) 267 CONTINUE DO 268 J=MR+1,NBRMAX TRIMAT((NBE-1)*NBRMAX+J)= 0 268 CONTINUE ENDIF 269 CONTINUE GOTO 500 C --- un arc de cercle : 101 --- 300 CONTINUE IERR = -3 CALL ESERRE(1,IERR,'LITFRT',' NON IMPLEMENTE') GOTO 9999 500 CONTINUE GOTO 9995 C --------------------------------------------- C --- NOUVEAU TRAITEMENT DES ERREURS (UTILISATEUR)--- C --------------------------------------------- 906 IERR =-1 CALL ESMESS(IERR,12,1,'DANS BLOC XYZ : DIM INCORRECTE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 907 IERR =-2 CALL ESMESS(IERR,13,1,'INCONNUE : PB ALLOCATION MEMOIRE?',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 908 IERR =-1 CALL ESMESS(IERR,14,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 909 IERR =-1 CALL ESMESS(IERR,15,1,'BLOC XYZ: DEBUT OU FIN ABSENT',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 910 IERR = -1 CALL ESMESS(IERR,16,1,'BLOC XYZ: NB POINTS OU DIM INVALID',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 911 IERR = -1 CALL ESMESS(IERR,17,1,'ERREUR A LA LECTURE DU POINT : ',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 912 IERR = -1 CALL ESMESS(IERR,18,1,'NOMBRE DE FRONTIERE OU DIM INVALID',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 913 IERR = -1 CALL ESMESS(IERR,19,1,'A LA FRONTIERE :',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 914 IERR = -1 CALL ESMESS(IERR,20,1,'POINT ERRONE SUR LA FRONTIERE :',MESSAG) CALL ESEINT(1,MESSAG,IEL,1) GOTO 9995 916 IERR = -1 CALL ESMESS(IERR,21,1,'DIM < DIM ELEMENT !',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 917 IERR = 0 C --- ce n'est plus une erreur ! --- C CALL ESERRO(1,IERR,'BLOC ILM OU ARE', C > 'LABEL DE DEBUT OU DE FIN ABSENT') GOTO 9995 918 IERR = 0 C --- ce n'est plus une erreur ! --- C CALL ESERRO(1,IERR,'BLOC ILM OU ARE','ATTENTION PAS D ARETE') GOTO 9995 920 IERR = -2 CALL ESMESS(IERR,22,1,'BLOC XYZ: DIMENSION TROP ELEVEE<',MESSAG) CALL ESEINT(1,MESSAG,MAXCOO,1) GOTO 9995 C --- FIN --- 9995 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 9999 END C SUBROUTINE ESLIFR(NOMD,IDE,IDIMC,NBNMAX,NBCMAX, > ITRNOE,NBEMAX, > COORD,NBPMAX,NBE,NBN, > IMAT,NMAT, > ITVL,IMAX, > IERR) C ********************************************************************** C OBJET ESLIFR : LIT UN MAILLAGE FRONTIERE (DU MAILLAGE A CALCULER) C ---> UTILISE POUR LE 3D C C 3 TYPES DE FRONTIERES : C FRONTIERES REELLES (VIDE/PLEIN) C IMAT() = (0,+I) OU (+I,0) C FRONTIERES INTER-MATERIAUX (MATI/MATJ) C IMAT() = (+I,+J) C FRONTIERES GEOMETRIQUES (MATI/MATI) C IMAT() = (+I,+I) C UN MATERIAU INCONNU = -1 C C C IMAT : MATERIAU A DROITE ET A GAUCHE DES ARETES FRONTIERES C (MATG(I),MATD(I)) I EST LE NUMERO DE L'ELEMENT C DANS ITRNOE C C EN ENTREE : C NOMD : NOM DU FICHIER CONTENANT LES DONNEES C IDIMC : C NBNMAX : C NBCMAX : C C ---- TABLEAUX DE TRAVAIL -------------------- C ITVL : TABLEAU D'ENTIERS = NBRE DE MATERIAUX C NITRMAX : TAILLE DE ITVL C C EN SORTIE : C IDE,NBNMAX,NBCMAX,ITRNOE,NBN,NBE : LE MAILLAGE C IDIMC,COORD : COORDONNES DES POINTS C IMAT : LE TABLEAU DES REGIONS DROITE ET GAUCHE C IERR : CODE D'ERREUR -1 SI DONNEES INCORRECTES C -2 SI TABLEAUX INSUFFISANTS C ********************************************************************** CHARACTER*(*) NOMD INTEGER IDE,IDIMC INTEGER NBNMAX,NBCMAX INTEGER ITRNOE(*),IMAT(*),ITVL(*),IMAX INTEGER NBPMAX,NBEMAX INTEGER NBE,NBN,NMAT REAL COORD(*) INTEGER IERR C ----------------------------------------------------------------- C MODIF 29.11.99 PROVISOIRE (POUR PASSER ZACK) INTEGER NRGMAX PARAMETER (NRGMAX=1000) INTEGER REFMAT(NRGMAX) INTEGER I,J,IDMAT,IFMAT,MATD,MATG,NMT,ITRIRG INTEGER NBRMAX C ----------------------------------------------------------------- IERR = 0 ITRIRG = 1 C =================================== C --- 1. LECTURE D'UNE FRONTIERE --- C =================================== C DANS L'ANCIENNE VERSION NBRMAX=2 ! NBRMAX = 2 CALL LITFRT(1,NOMD,NBPMAX*IDIMC,NBEMAX*NBNMAX,NRGMAX,NBEMAX, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE, C > ITRNOE,NMT,REFMAT,IMAT,IERR) > ITRNOE,NMT,REFMAT,NBRMAX,IMAT,IERR) C IF( IERR.EQ.0 )GOTO 9999 C --- ON ESSAYE L'ANCIENNE VERSION --- IERR = 0 C ===================================================== C --- 1. LECTURE D'UN MAILLAGE LINEIQUE (ANCIENNE VERSION) --- C ===================================================== CALL LITVIP(1,NOMD,NBPMAX*IDIMC,NBEMAX*NBNMAX,NRGMAX,NBEMAX, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE, > ITRNOE,NMT,REFMAT,ITVL(ITRIRG),IERR) IF( IERR.NE.0 )GOTO 9999 C --- REORGANISATION DES MATERIAUX ------------------- C LES ARETES DE LA FRONTIERE REELLE (MAT > 0) C LES ARETES DES FRONTIERES INTER-MATERIAUX (MAT < 0) C LES ARETES IMPOSEES POUR LES RACCORDS (MAT = 0) C ---------------------------------------------------- IDMAT = 1 DO 20 I=1,NMT IFMAT = ITVL(ITRIRG+I-1) IF( REFMAT(I) .LT.0 )THEN MATG = - REFMAT(I) MATD = - 1 ELSE IF( REFMAT(I) .EQ.0 )THEN MATG = -1 MATD = -1 ELSE MATG = REFMAT(I) MATD = REFMAT(I) ENDIF ENDIF DO 10 J=IDMAT,IFMAT IMAT((J-1)*2+1) = MATG IMAT((J-1)*2+2) = MATD 10 CONTINUE IDMAT = IFMAT+1 20 CONTINUE C =================================================== C --- ON NE PREND QUE LES VALEURS POSITIVES DISTINCTES --- C =================================================== DO 30 I=1,NMT REFMAT(I) = ABS(REFMAT(I)) 30 CONTINUE IF( NMT.GT.1 )THEN CALL ESTBVT(REFMAT,NMT,ITVL,REFMAT,NMAT, > NMT,IERR) ELSE NMAT = NMT ENDIF 9999 END C C SUBROUTINE ESTBVT(ITABRG,NBE,ITVL,IREFRG,NBREF, > NREFMX,IERR) C ********************************************************************** C OBJET ESTBVT: RENVOI LES VALEURS DISTINCTES D'UN TABLEAU, C TRIEES DANS L'ORDRE CROISSANT (COPIE DE TBVTAB) C EN ENTREE : C ITABRG : UN ENSEMBLE DES REFERENCES C (PAR EXEMPLE ITABRG(I) = MATERIAU DE L'ELEMENT I) C NBE : NOMBRE DE REFERENCES C ITVL: TABLEAU DE TRAVAIL DE TAILLE = NBE C C IREFRG : TABLEAU RESULTAT (ON PEUT UTILISER ITABRG) C NREFMX: TAILLE DU TABLEAU RESULTAT C C EN SORTIE : C IREFRG : LES REFERENCES DISTINCTES DE IREFRG TRIEES DANS C L'ORDRE CROISSANT C NBREF : NOMBRE DE REFERENCES DISTINCTES (ON PEUT UTILISER NBE) C IERR : 0 SI OK C -2 SI IREFRG EST TROP PETIT C ********************************************************************** INTEGER ITABRG(*),NBE,IREFRG(*),NBREF,ITVL(*) INTEGER NREFMX,IERR C INTEGER I,IREF,NBREF2 C IREF = 1 DO 10 I=1,NBE ITVL(IREF-1+I) = ITABRG(I) 10 CONTINUE CALL ESKNUT(NBE,ITVL(IREF)) NBREF2 = 1 IF(NREFMX.GT.0)THEN IREFRG(NBREF2) = ITVL(IREF) ELSE IERR = -2 ENDIF DO 20 I=2,NBE IF( ITVL(I-1+IREF).NE.ITVL(NBREF2-1+IREF) ) > NBREF2 = NBREF2+1 IF( NREFMX.GE.NBREF2 )THEN IREFRG(NBREF2) = ITVL(I-1+IREF) ELSE IERR = -2 ENDIF 20 CONTINUE NBREF = NBREF2 999 END C SUBROUTINE ESKNUT(N,NARG) C *************************************************************** C OBJET ESKNUT : TRI UN TABLEAU D'ENTIERS DANS L'ORDRE CROISSANT C TRI PAR INCREMENT DECROISSANT (SHELL SORTING - KNUTH 1973) C (COPIE DE KNUTA) C ON TRIE LES N TERMES NARG(I) POUR I=1,N C C TRI PAR INCREMENT DECROISSANT (SHELL SORTING) C COMPLEXITE EN N PUISSANCE 3/2 ET MEME STATISTIQUEMENT EN N**1.2 C C POUR EN SAVOIR PLUS : KNUTH, "THE ART OF COMPUTER PROGRAMMING", C VOL 3 : SORTING AND SEARCHING, C ADDISON-WESLEY, 1973. C C KNUTA : A COMME ACTIF, C.A.D. QUE LES ARGUMENTS NARG(I) POUR C I=1 A N SONT PHYSIQUEMENT "PERMUTES" (TABLEAU NARG MODIFIE). C VOIR AUSSI KNUTP. C C C REMARQUE : NARG PEUT ETRE DE TOUT TYPE ET TOUTE LOI D'ORDRE C PEUT ETRE INTRODUITE. IL SUFFIT D'INTERVENIR C AUX ENDROITS INDIQUES AINSI : '***** ICI : ...'. C C *************************************************************** INTEGER N,NARG(*) INTEGER NARGJ INTEGER I,J,K,INCR C C ON N'A RIEN A TRIER C IF(N.LE.1) GOTO 9999 C C POUR J=INCR+1,N, LA SOUS-SUITE NARG(J+H*INCR), H=...,-3,-2,-1,0 C SERA ORDONNEE (TRI HABITUEL PAR INSERTION SEQUENTIELLE). C C DES QUE INCR=1 ON A ATTEINT L'OBJECTIF FINAL. C C INCR SUBIT UNE DECROISSANCE PROGRESSIVE DE SORTE QU'AU C DEBUT IL EST GRAND (LA SOUS-SUITE A TRIER A UN CARDINAL FAIBLE) C ENSUITE QUAND INCR DIMINUE LA PROFONDEUR DES PERMUTATIONS C NECESSAIRES RESTE LIMITEE GRACE AU TRI DE LA SOUS-SUITE C CORRESPONDANT A LA VALEUR PRECEDENTE DE L'INCREMENT (LE PAS). C INCR=N C C DECROISSANCE DE L'INCREMENT PAR DIVISION PAR 2 C 10 INCR=INCR/2 C C POUR TOUT J VARIANT DE INCR+1 A N, C LA SOUS-SUITE NARG(J+H*INCR) AVEC H=...,-3,-2,-1,0 C SERA ORDONNEE. C DO 40 J=INCR+1,N C C ON PROCEDE PAR RECURENCE : LE FAIT QUE LES ELEMENTS C NARG(J+H*INCR) DEPUIS LE DEBUT JUSQU'A J+H*INCR=K-INCR C SOIENT DEJA ORDONNES EST UTILISE POUR ALLER JUSTE PLACER C CONVENALEMENT L'ELEMENT NARG(K) : INSERTION SEQUENTIELLE. C C C ***** ICI : SAUVEGARDE DE NARG(J) C NARGJ=NARG(J) K=J DO 20 I=J-INCR,1,-INCR C C ***** ICI : LOI D'ORDRE C COMPARER NARG(I) ET NARGJ=NARG(J) C SI NARG(I) EST AVANT OU EGAL A NARGJ ALLER EN 30 C IF(NARG(I).LE.NARGJ) GOTO 30 C C ***** ICI : AFFECTER LE CONTENU DE NARG(I) A NARG(K) C NARG(K)=NARG(I) K=I 20 CONTINUE C C ***** ICI : AFFECTER LE CONTENU DE NARGJ A NARG(K) C 30 NARG(K)=NARGJ C C FIN DU TRI DE LA SOUS-SUITE ASSOCIEE A J C 40 CONTINUE C C PEUT-ON ENCORE DIMINUER L'INCREMENT (LE PAS) ? C IF(INCR.GT.1) GOTO 10 C C INCR=1, LE TRI FINAL EST ACHEVE. MERCI DE VOTRE VISITE. C 9999 END C SUBROUTINE CODARE(IDE,NBNMAX,ITRNOE,NCODE,NBNE,IERR) C ***************************************************************** C OBJET CODARE : CODE EN FONCTION DU NOMBRE DE NEOUD ET DIMENSION C PB : il y a un probleme pour IDE=1 et NBNE=3 : comment distinguer C un element quadratique d'une polyligne. C ***************************************************************** INTEGER IDE,NBNMAX,ITRNOE(*) INTEGER NCODE,NBNE,IERR C NBNE = NBNMAX NCODE = -1 IERR = -1 IF( IDE.GT.1 )GOTO 9999 10 IF(ITRNOE(NBNE).EQ.0)THEN NBNE = NBNE - 1 IF(NBNE.EQ.0)GOTO 9999 GOTO 10 ENDIF IF( NBNE.EQ.1 )NCODE=99 IF( NBNE.EQ.2 )NCODE=100 9999 IF( NCODE.NE.-1)IERR=0 END C SUBROUTINE ECRFRT(ACTION,NOM, > IDIMC,NBN,COORD,IDE,NBNMAX,NBE,ITRNOE, > ITRIRG,NBRMAX,IERR) C ***************************************************************** C OBJET ECRFRT : ecriture des fichiers maillage au format ARE C C EN ENTREE : C ACTION : C ACTION=1 : ecriture d'un nouveau fichier C ACTION=2 : " " ou ecrasement d'un fichier existant C ACTION=3 : concatenation en fin d'un fichier existant C C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBE : NOMBRE D'ELEMENTS C NMT : NOMBRE DE MATERIAUX C SI NMT = 0 ALORS LE MATERIAU DE TOUS LES ELEMENTS C EST FIXE A 1 C REFMAT : LE TABLEAU REFMAT CONTIENDRA LES ENTIERS REFERENCES DES C COORD : LE TABLEAU REEL COORD. C ITRNOE : TABLEAU DES ELEMENTS C C EN SORTIE : C IER=0 : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER C IER=-2 : L'UN DES TABLEAUX EST TROP PETIT C C ***************************************************************** CHARACTER*(*) NOM INTEGER ACTION INTEGER IDIMC,NBN,IDE,NBNMAX,NBE,IERR REAL COORD(*) INTEGER ITRNOE(*) INTEGER ITRIRG(*),NBRMAX C INTEGER IUNIT,I,J,K INTEGER NBNE,NCODE,NBMAT CHARACTER*256 MESSAG C GOTO (1,2,3) ACTION 1 CONTINUE C --- Creation d'un nouveau fichier CALL GESFIC('O',NOM,0,0,IUNIT,IERR) IF(IERR.NE.0)GOTO 901 GOTO 9 2 CONTINUE C --- ecriture d'un nouveau fichier ou ecrasement d'un fichier existant CALL GESFIC('O',NOM,3,0,IUNIT,IERR) IF(IERR.NE.0)GOTO 902 GOTO 9 3 CONTINUE C --- concatenation en fin d'un fichier existant IERR = -3 GOTO 904 9 CONTINUE C C I. ECRITURE DES NOEUDS C ---------------------- WRITE(IUNIT,'(A)')'DEBXYZ' WRITE(IUNIT,*) NBN, IDIMC DO 10 I=1,NBN WRITE(IUNIT,*) (COORD((I-1)*IDIMC+J),J=1,IDIMC) 10 CONTINUE WRITE( IUNIT,'(A)')'FINXYZ' C C I. ECRITURE DES ELEMENTS C ------------------------ IF( NBE .EQ. 0 )GOTO 100 WRITE(IUNIT,'(A)')'DEBARE' WRITE(IUNIT,*) NBE DO 70 J=1,NBE CALL CODARE(IDE,NBNMAX,ITRNOE((J-1)*NBNMAX+1),NCODE,NBNE,IERR) NBMAT=0 DO 80 K=1,NBRMAX IF(ITRIRG((J-1)*NBRMAX+K).GT.0)NBMAT=NBMAT+1 80 CONTINUE IF(IERR.NE.0)GOTO 903 WRITE(UNIT=IUNIT,FMT='(11I10)')NBNE, > (ITRNOE((J-1)*NBNMAX+K),K=1,NBNE), > NCODE,NBMAT,(ITRIRG((J-1)*NBRMAX+K),K=1,NBMAT) 70 CONTINUE WRITE( IUNIT,'(A)')'FINARE' C 100 CALL GESFIC('F',NOM,0,0,IUNIT,IERR) GOTO 9999 c ----------- messages d'erreur -------------- 901 CONTINUE CALL ESMESS(IERR,23,1,'ATTENTION LE FICHIER EXISTE DEJA',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 902 CONTINUE CALL ESMESS(IERR,24,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 903 CONTINUE CALL ESMESS(IERR,25,1,'A L ECRITURE D UN ELEMENT',MESSAG) CALL ESEINT(1,MESSAG,J,1) CALL GESFIC('F',NOM,0,0,IUNIT,IERR) GOTO 9999 904 CONTINUE CALL ESMESS(IERR,1,1,'PAS ENCORE IMPLEMENT',MESSAG) CALL ESECHA(1,MESSAG,' ') c 9999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_UTIL.F C OBJET : UTILITAIRES POUR LES OPERATIONS : ENTREE/SORTIE C FONCT. : C GESFIC : OUVERTURE ET FERMETURE DES FICHIERS C OBJET FITEST : TESTE L'EXISTANCE DU FICHIER C OBJET GESCOM : ENLEVE LES COMMENTAIRES ENTRE 2 LABELS C VDCHAR : VIDER UN TABLEAU CHARACTER DANS UN AUTRE C VDENTI : VIDER UN TABLEAU INTEGER DANS UN AUTRE C LENCHR : LONGUEUR D'UNE CHAINE DE CARACTERES C MAJUSC : TRANSFORMER EN MAJUSCULES UNE CHAINE C AUTEUR : S-M. TIJANI C DATE : 03.95 C LIMITATIONS : C LIMITATION GESCOM : LIGNE 2560 CARACTERES C LIMITATION GESFIC : OUVERTURE 25 FICHIERS C LIMITATION GESFIC : NOM DE FICHIER 256 CARACTERES C LIMITATION MAJUSC : MOTS DE 256 CARACTERES C MODIFICATIONS : C AUTEUR, DATE, OBJET : C O.STAB, 14.03.2001, MODIFICATION LIMITATION LIGNE 80->256 ET DOC C O.STAB, 20.09.2004, MODIFICATION GESCOM quand IT=0 C O.STAB, 26.05.2005, MODIFICATION GESCOM gestion ' ' avant les labels C O.STAB, 15.11.2013, MODIFICATION GESCOM 2560 caracteres !!! C C ***************************************************************** C SUBROUTINE GESCOM(IN,DEBUT,LD,FIN,LF,LET,IT,NBLC,IERR) C ***************************************************************** C OBJET GESCOM : ENLEVE LES COMMENTAIRES ENTRE 2 LABELS C C EN ENTREE : C IN : FICHIER AVEC COMMENTAIRES C DEBUT : LABEL DE DEBUT DU TRAITEMENT C FIN : LABEL DE FIN DU TRAITEMENT C LET : DE DEBUT D'UNE LIGNE DE COMMENTAIRE C EN SORTIE : C IT : FICHIER SANS COMMENTAIRES C SI IT=0 IL N'Y A PAS DE FICHIER C NBLC : NOMBRE DE LIGNES DE COMMENTAIRES SUPPRIMEES C NBEN : NOMBRE D'ENREGICTREMENTS DU BLOC (A FAIRE) C C 0 : PAS D'ERREUR C -1 : UNE ERREUR, DEBUT OU FIN N'ONT PAS ETE TROUVES C C LIMITATION GESCOM : LIGNE 2560 CARACTERES C C ***************************************************************** INTEGER IN,IT,LD,LF CHARACTER*(*) DEBUT,FIN CHARACTER LET INTEGER NBLC,IERR C INTEGER NBEN INTEGER MAXFICH PARAMETER(MAXFICH=25) C CHARACTER*80 LNG CHARACTER*2560 LNG INTEGER LENCHR,I,ID C IERR = 0 NBLC = 0 NBEN = 0 IF((IT.LT.0).OR.(IT.GT.MAXFICH))GOTO 80 C 10 READ(IN,'(A)',ERR=80,END=80) LNG C CALL MAJUSC(LD,LNG) ID=1 11 IF(LNG(ID:ID).NE.' ') GOTO 12 ID=ID+1 GOTO 11 12 CONTINUE CALL MAJUSC(LD+ID-1,LNG) IF(LNG(ID:LD+ID-1).NE.DEBUT) GOTO 10 C IF(LNG(:LD).NE.DEBUT) GOTO 10 C 20 READ(IN,'(A)',ERR=80,END=80) LNG IF(LNG(:1).EQ.LET)THEN NBLC = NBLC+1 GOTO 20 ENDIF C CALL MAJUSC(LF,LNG) ID=1 21 IF(LNG(ID:ID).NE.' ') GOTO 22 ID=ID+1 GOTO 21 C IF(LNG(:LF).NE.FIN) THEN 22 CONTINUE CALL MAJUSC(LF+ID-1,LNG) IF(LNG(ID:LF+ID-1).NE.FIN) THEN I=LENCHR(LNG) IF(IT.GT.0)WRITE(IT,'(A)') LNG(:I) NBEN = NBEN + 1 GOTO 20 ENDIF GOTO 999 80 IERR = -1 C 999 END C C INTEGER FUNCTION FITEST(NOM,ISTAT,IFORM) C ***************************************************************** C OBJET FITEST : TESTE L'EXISTANCE DU FICHIER C C EN ENTREE : C NOM : NOM DU FICHIER A OUVRIR C ISTAT=0 (NEW), 1 (OLD) C IFORM=0 ('FORMATTED') OU 1 ('UNFORMATTED') C RENVOI : C 0 : PAS D'ERREUR C SI ISTAT=0 ET LE FICHIER N'EXISTE PAS C SI ISTAT=1 ET LE FICHIER EXISTE C -1 : UNE ERREUR C SI ISTAT=0 ET LE FICHIER EXISTE DEJA C SI ISTAT=1 ET LE FICHIER N'EXISTE PAS C C ***************************************************************** CHARACTER*(*) NOM INTEGER ISTAT,IFORM C INTEGER IUNIT,IER C C --- LE TEST : LE CAS CONTRAIRE DOIT PROVOQUER UNE ERREUR --- C FITEST = 0 IF( ISTAT.EQ. 0 )THEN C C --- CREATION : ON TESTE SI LE FICHIER N'EXISTE PAS DEJA C L'OUVERTURE DU FICHIER EXISTANT DOIT PROVOQUER UNE ERREUR C CALL GESFIC('O',NOM,1,IFORM,IUNIT,IER) IF( IER.NE. -2 )FITEST = -1 CALL GESFIC('F',' ',0,0,IUNIT,IER) ELSE C C --- EXISTANT :ON TESTE SI LE FICHIER EXISTE C CALL GESFIC('O',NOM,1,IFORM,IUNIT,IER) IF( IER.NE. 0 )THEN FITEST = -1 ELSE CALL GESFIC('F',' ',0,0,IUNIT,IER) ENDIF ENDIF C CALL GESFIC('O',NOM,0,IFORM,IUNIT,IER) C IF( IER.NE. -1 )GOTO 9999 C ENDIF C FITEST = 0 C 9999 END C C SUBROUTINE GESFIC(FLG,NOM,ISTAT,IFORM,IUNIT,IER) C ***************************************************************** C OBJET GESFIC : GESTION OUVERTURE/FERMETURE DE FICHIERS : C C 1) OUVERTURE C EN ENTREE : C FLAG FLG='O' (CALL GESFIC('O',...) C NOM : NOM DU FICHIER A OUVRIR C ISTAT=0 (NEW), 1 (OLD), 2 (SCRATCH) OU 3 (UNKNOWN) C IFORM=0 ('FORMATTED') OU 1 ('UNFORMATTED') C EN SORTIE : C IUNIT : UNITE LOGIQUE ASSOCIEE AU FICHIER C IER=0 : PAS D'ERREUR C IER=1 : FICHIER DEJA OUVERT PAR GESFIC (FICHIER ASCII) C IER=2 : FICHIER DEJA OUVERT PAR GESFIC (FICHIER BINAIRE) C IER=-1 : ISTAT=0 ET FICHIER EXISTANT C IER=-2 : ISTAT=1 ET FICHIER INEXISTANT C IER=-3 : TROP DE FICHIERS OUVERTS (IUNIT=MAXFICH) C C 2) FERMETURE C EN ENTREE : C FLAG FLG='F' (CALL GESFIC('F',...) C IUNIT : UNITE LOGIQUE ASSOCIEE AU FICHIER (1 A 25) C EN SORTIE : C IER=0 : PAS D'ERREUR C IER=-4 : FICHIER NON OUVERT PAR GESFIC C IER=-5 : PROBLEME AVEC CLOSE C C 3) AUTRE C FLAG FLG INCONNU (NI O NI F) : IER=-6 C C MEMOIRE LOCALE : C NFICH : NOMBRE DE FICHIERS OUVERTS C NOML(I) : NOM DU IEME FICHIER OUVERT PAR GESFIC (I=1,NFICH) C IUNITL(I) : UNITE LOGIQUE ASSOCIEE AU IEME FICHIER C IFORML(I) : 0 (ASCII) OU 1 (BINAIRE) C C LIMITATION GESFIC : OUVERTURE 25 FICHIERS C LIMITATION GESFIC : NOM DE FICHIER 256 CARACTERES C C ***************************************************************** CHARACTER*(*) NOM,FLG INTEGER ISTAT,IFORM,IUNIT,IER C INTEGER MAXFICH PARAMETER(MAXFICH=25) CHARACTER NOML(MAXFICH)*256 INTEGER IUNITL(MAXFICH),IFORML(MAXFICH) CHARACTER F*12,S*7 INTEGER NFICH,I C --- BUG_31 : O.STAB 17.10.97. LES VALEURS POUVAIENT ETRE ECRASEES --- SAVE IUNITL,IFORML,NOML,NFICH C DATA NFICH /0/ C IF(FLG.NE.'O'.AND.FLG.NE.'O') GOTO 30 C LE MAX. DE FICHIERS OUVRABLES EST-IL DEPASSE ? IF(NFICH.GE.MAXFICH) THEN IER=-3 IUNIT=MAXFICH GOTO 999 ENDIF C LE FICHIER N'EST-IL PAS DEJA OUVERT ? IUNIT=1 IF(NFICH.LE.0) GOTO 20 DO 10 I=1,NFICH IF(NOML(I).EQ.NOM) THEN IUNIT=IUNITL(I) IER=1+IFORML(I) GOTO 999 ENDIF 10 CONTINUE C on "ouvre" un nouveau fichier IUNIT=IUNITL(NFICH)+1 20 IF(IFORM.EQ.0) THEN F='FORMATTED' ELSE F='UNFORMATTED' ENDIF IF(ISTAT.EQ.0) S='NEW' IF(ISTAT.EQ.1) S='OLD' IF(ISTAT.EQ.3) S='UNKNOWN' C UNITES RESERVEES 5 (CLAVIER), 6 (ECRAN), 7 (AUTRE) IF(IUNIT.EQ.5) IUNIT=IUNIT+3 IER=-1-ISTAT IF(ISTAT.EQ.2) THEN OPEN(UNIT=IUNIT,STATUS='SCRATCH',FORM=F,ERR=999) NFICH=NFICH+1 WRITE(NOML(NFICH),'(A,I4.4)')'TEMPORAIRE.SCRATCH.',IUNIT ELSE OPEN(UNIT=IUNIT,FILE=NOM,STATUS=S,FORM=F,ERR=999) NFICH=NFICH+1 NOML(NFICH)=NOM ENDIF IUNITL(NFICH)=IUNIT IFORML(NFICH)=IFORM IER=0 GOTO 999 30 IF(FLG.NE.'F'.AND.FLG.NE.'F') GOTO 90 IF(NFICH.LE.0) GOTO 50 DO 40 I=1,NFICH IF(IUNITL(I).EQ.IUNIT) THEN CLOSE(UNIT=IUNIT,ERR=60) CALL VDCHAR(1,NFICH-I,NOML(I+1),NOML(I)) CALL VDENTI(1,NFICH-I,IUNITL(I+1),IUNITL(I)) CALL VDENTI(1,NFICH-I,IFORML(I+1),IFORML(I)) NFICH=NFICH-1 IER=0 GOTO 999 ENDIF 40 CONTINUE C LE FICHIER N'EXISTE PAS 50 IER=-4 GOTO 999 60 IER=-5 GOTO 999 90 IER=-6 999 END C SUBROUTINE VDCHAR(K,N,L,M) C ***************************************************************** C OBJET VDCHAR : COPIE UN TABLEAU DE CHARAC.(L) DANS UN AUTRE (M) C VIDER L(I) DANS M(I) POUR I=1,N. C.A.D. FAIRE M(I)=L(I) C K = 1 : BOUCLE DIRECTE CALL VDCHAR( 1,N,JJJ(12),JJJ(5)) C K = -1 : BOUCLE INVERSE CALL VDCHAR(-1,N,JJJ(5),JJJ(12)) C C ***************************************************************** INTEGER K,N CHARACTER*(*) L(*) CHARACTER*(*) M(*) C INTEGER I C IF(N.LE.0) GOTO 999 IF(K.EQ.-1) GOTO 20 DO 10 I=1,N M(I)=L(I) 10 CONTINUE GOTO 999 20 DO 30 I=N,1,-1 M(I)=L(I) 30 CONTINUE 999 END C SUBROUTINE VDENTI(K,N,L,M) C ***************************************************************** C OBJET VDENTI : COPIE UN TABLEAU D'ENTIERS (L) DANS UN AUTRE (M) C VIDER L(I) DANS M(I) POUR I=1,N. C.A.D. FAIRE M(I)=L(I) C K = 1 : BOUCLE DIRECTE CALL VDENTI( 1,N,JJJ(12),JJJ(5)) C K = -1 : BOUCLE INVERSE CALL VDENTI(-1,N,JJJ(5),JJJ(12)) C C ***************************************************************** INTEGER K,N INTEGER L(*) INTEGER M(*) C INTEGER I C IF(N.LE.0) GOTO 999 IF(K.EQ.-1) GOTO 20 DO 10 I=1,N M(I)=L(I) 10 CONTINUE GOTO 999 20 DO 30 I=N,1,-1 M(I)=L(I) 30 CONTINUE 999 END C C SUBROUTINE MAJUSC(N,C) C ***************************************************************** C OBJET MAJUSC : TRANSFORME DES CARACTERES MINUSCULE -> MAJUSCULE C TRANSFORME EN MAJUSCULES LES N CARACTERES (C(I:I),I=1,N) C C LIMITATION MAJUSC : MOTS DE 26 CARACTERES C C ***************************************************************** INTEGER N CHARACTER C*(*) C CHARACTER*256 MINUS,MAJUS INTEGER I,K,M C DATA MINUS /'abcdefghijklmnopkrstuvwxyz'/ DATA MAJUS /'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ C M=MIN(N,LEN(C)) IF(M.LE.0) GOTO 999 DO 10 I=1,M K=INDEX(MINUS,C(I:I)) IF(K.GE.1) C(I:I)=MAJUS(K:K) 10 CONTINUE 999 END C INTEGER FUNCTION LENCHR(C) C ***************************************************************** C OBJET LENCHR : RENVOI LA VRAI TAILLE DE LA CHAINE C C LENCHR(C) = VRAIE TAILLE DE LA CHAINE C C AUTREMENT DIT : N=LENCHR(C) EST TEL QUE C(N:N) N'EST PAS BLANC C MAIS C(N+1:) EST UNE SOUS-CHAINE BLANCHE. C REMARQUE : SI LA CHAINE C N'EXITE PAS, LENCHR=0 C SI LA CHAINE C EST TOUTE BLANCHE, LENCHR=1 C C ***************************************************************** CHARACTER*(*) C C INTEGER N,I C N=LEN(C) I=0 IF(N.LE.0) GOTO 20 DO 10 I=N,1,-1 IF(C(I:I).NE.' ') GOTO 20 10 CONTINUE I=1 20 LENCHR=I 999 END C C *************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_DENSITE.F C OBJET : LECTURE DES INFORMATIONS DE DENSITE (FONCTION ANALYTIQUES) C C FONCT. : C OBJET DEFDEN : DEFINIE LA DENSITE PAR DEFAUT C OBJET INIDEN : INITIALISE LES DENSITES (A PARTIR D'UN FICHIER) C C FONCT. LOCALES : C OBJET LITDEN : LIT LA DENSITE DANS UN FICHIER C OBJET STRDEN : CONSTRUIT LES FONCTIONS DE DENSITE C C AUTEUR : O. STAB C DATE : 03.95 / 06.95 / 04.97 / 05.98 C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 10.04.97, DENSITE VALEURS NODALES C AJOUT DU PARAMETRE IACTIO DANS INIDEN C AUTEUR, DATE, OBJET : O.STAB, 22.10.97, STRDEN (VERIF ENTREES) C AUTEUR, DATE, OBJET : O.STAB, 28.05.98, RESTRUCTURATION IMPORTANTE C AUTEUR, DATE, OBJET : O.STAB, 8/4/2002,remp. de DSERRE par ESERRO C AUTEUR, DATE, OBJET : O.STAB, 17/9/2004, messages pour LITDEN en plus ! C C *************************************************************** C C SUBROUTINE LITDEN(IACTIO,NOM,COORD,IDIMC,NBPT,NBPTMX, > ISUI,FSUI,NBSUI,NBSUMX,IDEN,NBDEN,NBDNMX, > MODGEN,IERR) C *************************************************************** C OBJET LITDEN : LIT LA DENSITE DANS UN FICHIER (LOCAL) C C EN ENTREE : C IACTIO : ENTIER INDIQUANT AU S/PROGRAMME LES ENTITES A LIRE C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C NBPTMX : NOMBRE MAXI. DE POINTS (COORD) C NBSUMX : NOMBRE MAXI. DE SUITES (ISUI,FSUI) C NBDNMX : NOMBRE MAXI. DE DENSITES (IDENS) C C EN SORTIE : C IER=O : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER / OU DE FORMAT C IER=-2 : L'UN DES TABLEAUX EST TROP PETIT C SI IACTIO = 0 C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBSUI : NOMBRE DE SUITES (NUMERO MAXIMUM) C NBPT : NOMBRE TOTAL DES POINTS (NUMERO MAXIMUM) C NBDEN : NOMBRE DE DENSITES (NUMERO MAXIMUM) C MODGEN : (1=DIRECT,2=ITERATIF,3=ITERATIF+REGULARISATION) C SINON C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C ISUI(I) : TYPE DE LA SUITE I (1=GEOMETRIQUE, 2 = ARITHMETIQUE) C FSUI((I-1)*2+1) : VALEUR INITIALE DE LA SUITE I C FSUI((I-1)*2+2) : RAISON DE LA SUITE I C NBSUI : NOMBRE DE SUITES C IDEN((I-1)*4+1) : TYPE DE CONCENTRATION (1=PONCTUELLE,2=AXIALE) C IDEN((I-1)*4+2) : NUMERO DE LA DENSITE (INUTILISE) C IDEN((I-1)*4+3) : NUMERO DU 1IER POINT C IDEN((I-1)*4+4) : NUMERO DU 2IEME POINT (SI CONCENTRATION AXIALE) C COORD() : TABLEAU DES COORDONNEES DES POINTS C NBPT : NOMBRE TOTAL DES POINTS C NBDEN : NOMBRE DE DENSITES C MODGEN : (1=DIRECT,2=ITERATIF,3=ITERATIF+REGUL.) C C C *************************************************************** INTEGER IACTIO CHARACTER*(*) NOM REAL COORD(*) INTEGER IDIMC,NBPT,NBPTMX INTEGER ISUI(*),NBSUI,NBSUMX REAL FSUI(*) INTEGER IDEN(*),NBDEN,NBDNMX,MODGEN,IERR C INTEGER IOLDFI,IFORFI,IUNITC,ISCRFI,IUNIT,NBLC INTEGER I,J,NUMSUI,NUMPT,NUMDEN,ITYPE,NBREF INTEGER ITBNUM(4),NBRFMX,IERR2 REAL XYZ(3),TAILLE,RAISON C INTEGER NUSUMX, NUPOMX, NUDEMX CHARACTER*256 MESSAG C NBPT = 0 NUPOMX = 0 NBSUI = 0 NUSUMX = 0 NBDEN = 0 NUDEMX = 0 MODGEN = 0 C NBRFMX = 4 IERR = -1 IOLDFI = 1 ISCRFI = 2 IFORFI = 0 CALL GESFIC('O',NOM,IOLDFI,IFORFI,IUNITC,IERR) IF( IERR.NE. 0 )GOTO 908 CALL GESFIC('O',' ',ISCRFI,IFORFI,IUNIT,IERR) IF( IERR.NE.0 ) GOTO 908 C ==================================== C --- LECTURE DES POINTS ET DES VECTEURS ----------------- C ==================================== C --- ON ENLEVE LES COMMENTAIRES DU BLOC --- CALL GESCOM(IUNITC,'DEBGEO',6,'FINGEO',6,'*',IUNIT,NBLC,IERR) IF(IERR.NE.0)GOTO 909 REWIND IUNITC REWIND IUNIT IERR = -1 C --- LECTURE DU CORPS ----------------- NUPOMX = 0 READ(IUNIT,*,ERR=910,END=910) NBPT, IDIMC IF((IDIMC.LT.1 ).OR.(IDIMC.GT.3))GOTO 910 DO 10 I=1,NBPT READ(IUNIT,*,ERR=911,END=911) NUMPT,(XYZ(J),J=1,IDIMC) IF( IACTIO.EQ. 0 )THEN NUPOMX = MAX( NUMPT,NUPOMX ) GOTO 10 ENDIF IF( NUMPT.GT.NBPTMX )THEN IERR = -2 GOTO 9999 ENDIF DO 9 J=1,IDIMC COORD((NUMPT-1)*IDIMC+J) = XYZ(J) 9 CONTINUE 10 CONTINUE C =================== C --- LECTURE DES SUITES ------------------ C =================== REWIND IUNIT CALL GESCOM(IUNITC,'DEBSUI',6,'FINSUI',6,'*',IUNIT,NBLC,IERR) IF(IERR.NE.0)GOTO 912 REWIND IUNIT C C --- LECTURE DU CORPS ----------------- READ(IUNIT,*,ERR=913,END=913) NBSUI NUSUMX = 0 DO 20 I=1,NBSUI READ(IUNIT,*,ERR=914,END=914) NUMSUI,ITYPE,TAILLE,RAISON IF( IACTIO.EQ. 0 )THEN NUSUMX = MAX( NUMSUI,NUSUMX ) GOTO 20 ENDIF IF( NUMSUI.GT. NBSUMX )THEN IERR = -2 GOTO 9999 ENDIF ISUI(NUMSUI) = ITYPE FSUI((NUMSUI-1)*2+1) = TAILLE FSUI(NUMSUI*2)= RAISON 20 CONTINUE C =========================== C --- LECTURE DES DENSITES ----------------- C =========================== C --- ON ENLEVE LES COMMENTAIRES DU BLOC --- REWIND IUNIT CALL GESCOM(IUNITC,'DEBDEN',6,'FINDEN',6,'*',IUNIT,NBLC,IERR) IF(IERR.NE.0)GOTO 915 REWIND IUNIT C C --- RECHERCHE D'UN ENTETE ------------- C IERR = 0 C 30 READ(IUNIT,' (A)',ERR=888,END=888) LNG C CALL MAJUSC(6,LNG) C IF(LNG(:6).NE.'DEBDEN')GOTO 30 IERR = -1 C C --- LECTURE DU CORPS ----------------- READ(IUNIT,*,ERR=916,END=916) NBDEN, MODGEN NUDEMX = 0 DO 40 I=1,NBDEN READ(IUNIT,*,ERR=917,END=917) > NUMDEN,ITYPE,NBREF,(ITBNUM(J),J=1,NBREF) IF( IACTIO.EQ. 0 )THEN NUDEMX = MAX( NUMDEN,NUDEMX ) GOTO 40 ENDIF IF( NUMDEN.GT. NBDNMX )THEN IERR = -2 GOTO 9999 ENDIF IDEN((NUMDEN-1)*NBRFMX+1)=ITYPE CALL VDENTI(1,NBREF,ITBNUM,IDEN((NUMDEN-1)*NBRFMX+2)) 40 CONTINUE C --- FIN ET FERMETURES --- IERR = 0 GOTO 9995 C --------------------------------------------- C --- NOUVEAU TRAITEMENT DES ERREURS (UTILISATEUR)--- C --------------------------------------------- CALL ESMESS(IERR,14,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) 908 IERR =-1 CALL ESMESS(IERR,14,1,'IMPOSSIBLE D OUVRIR LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9999 909 CONTINUE CALL ESMESS(IERR,46,1,'DEBUT, FIN DU BLOC GEO MANQUANT',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9995 910 IERR = -1 CALL ESMESS(IERR,47,1,'NOMBRE DE POINTS OU DIM INVALIDE',MESSAG) CALL ESECHA(1,MESSAG,NOM) GOTO 9995 911 IERR = -1 CALL ESMESS(IERR,48,1,'AU POINT',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 C 912 CONTINUE CALL ESMESS(IERR,49,1,'DEBUT, FIN DU BLOC SUI MANQUANT',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 913 IERR = -1 CALL ESMESS(IERR,50,1,'NOMBRE DE SUITE INVALIDE',MESSAG) CALL ESEINT(1,MESSAG,NBSUI,1) GOTO 9995 914 IERR = -1 CALL ESMESS(IERR,51,1,'A LA LECTURE DE LA SUITE',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 C 915 CONTINUE CALL ESMESS(IERR,52,1,'DEBUT, FIN DU BLOC DEN MANQUANT',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9995 916 IERR = -1 CALL ESMESS(IERR,53,1,'NOMBRE DE CONCENTRATIONS INVALIDE',MESSAG) CALL ESEINT(1,MESSAG,NBDEN,1) GOTO 9995 917 IERR = -1 CALL ESMESS(IERR,54,1,'A LA LECTURE DE LA DENSITE : ',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 9995 C 9995 CALL GESFIC('F',NOM,IOLDFI,IFORFI,IUNITC,IERR2) CALL GESFIC('F',' ',IOLDFI,IFORFI,IUNIT,IERR2) IF( IACTIO.EQ.0 )THEN NBPT = NUPOMX NBSUI = NUSUMX NBDEN = NUDEMX ENDIF 9999 END C C SUBROUTINE STRDEN(IDENS,COORD,IDIMC,NBPT, > ISUI,FSUI,NBSUI,IDEN,NBDEN, > ITYPSU,RAISON,TAILLE,ITYPDN,XPTDEN,IERR) C *************************************************************** C OBJET STRDEN : CONSTRUIT LES FONCTIONS DE DENSITE C C EN ENTREE : C IDENS : NUMERO DE LA DENSITE A LIRE C --- LOCALISATION DES CONCENTRATIONS ---- C COORD : C IDIMC : C NBPT : C --- SUITE DEFINISSANT LA PROGRESSION --- C ISUI : NUMERO C FSUI : C NBSUI : C --- DEFINITION DE LA DENSITE ----------- C IDEN : C NBDEN : C C EN SORTIE : C ITYPSU,RAISON,TAILLE,ITYPDN,XPTDEN : LES INFO DE DENSITE C *************************************************************** REAL COORD(*) INTEGER IDENS,IDIMC,NBPT INTEGER ISUI(*),NBSUI REAL FSUI(*), RAISON,TAILLE INTEGER IDEN(*),NBDEN INTEGER ITYPSU,ITYPDN,IERR REAL XPTDEN(*) C INTEGER NUMPT,I,J,NUMSUI,NBPODN CHARACTER*256 MESSAG C IERR = -1 IF((IDENS .GT. NBDEN).OR.(IDENS.LE.0))GOTO 901 C NUMSUI = IDEN((IDENS-1)*4+2) IF((NUMSUI.GT.NBSUI).OR.(NUMSUI.LE.0))GOTO 902 ITYPSU = ISUI(NUMSUI) RAISON = FSUI((NUMSUI-1)*2+2) TAILLE = FSUI((NUMSUI-1)*2+1) GOTO (10,20) ITYPSU C --- SUITE GEOMETRIQUE --- 10 CONTINUE IF( RAISON .LE. 0 )GOTO 903 IF( TAILLE .LE. 0 )GOTO 904 GOTO 50 20 CONTINUE IF((RAISON.LE.0).AND.(TAILLE.LE.0))GOTO 905 50 CONTINUE C ITYPDN = IDEN((IDENS-1)*4+1) GOTO (110,120,130) ITYPDN GOTO 906 C ---- CONCENTRATION PONCTUELLE ---- 110 CONTINUE NBPODN = 1 GOTO 150 C ---- CONCENTRATION SUR UNE DROITE ---- 120 CONTINUE NBPODN = 2 GOTO 150 C ---- CONCENTRATION SUR UNE SEGMENT ---- 130 CONTINUE NBPODN = 2 GOTO 150 150 CONTINUE C DO 310 I=1,NBPODN NUMPT = IDEN((IDENS-1)*4+2+I) IF((NUMPT.GT.NBPT).OR.(NUMPT.LE.0))GOTO 907 DO 300 J=1,IDIMC XPTDEN((I-1)*IDIMC+J) = COORD((NUMPT-1)*IDIMC+J) 300 CONTINUE 310 CONTINUE IERR = 0 GOTO 9999 C ---- messages d'erreur ---- 901 IERR=-1 CALL ESMESS(IERR,55,1,'NUMERO DE CONCENTRATION',MESSAG) CALL ESEINT(1,MESSAG,IDENS,1) GOTO 9999 902 IERR=-1 CALL ESMESS(IERR,56,1,'NUMERO DE LA SUITE',MESSAG) CALL ESEINT(1,MESSAG,NUMSUI,1) GOTO 9999 903 IERR=-1 CALL ESMESS(IERR,57,1,'RAISON NEGATIVE OU NULLE',MESSAG) CALL ESEREA(1,MESSAG,RAISON,1) GOTO 9999 904 IERR=-1 CALL ESMESS(IERR,58,1,'TAILLE NEGATIVE OU NULLE',MESSAG) CALL ESEREA(1,MESSAG,TAILLE,1) GOTO 9999 905 IERR=-1 CALL ESMESS(IERR,59,1,'TAILLE & RAISON NEGATIVE OU NULLE',MESSAG) CALL ESEREA(1,MESSAG,RAISON,1) GOTO 9999 906 IERR=-1 CALL ESMESS(IERR,60,1,'TYPE DE CONCENTRATION INCONNUE',MESSAG) CALL ESEINT(1,MESSAG,ITYPDN,1) GOTO 9999 907 IERR=-1 CALL ESMESS(IERR,61,1,'REFERENCE AU POINT INCORRECTE',MESSAG) CALL ESEINT(1,MESSAG,NUMPT,1) C 9999 END C SUBROUTINE DEFDEN(MODGEN,IADEC,NIADEC,RADEC,NRIDEC,NBFDEC) C *************************************************************** C OBJET DEFDEN : DEFINIE LA DENSITE PAR DEFAUT C C EN ENTREE : C EN SORTIE : C MODGEN : 1 (DEFAUT) C C IADEC((I-1)*NIADEC+1) : PARAMETRES ENTIERS DU IEME RAFFINEMENT C NIADEC : NOMBRE MAX. DE PARAMETRES ENTIERS C RADEC((I-1)*NIADEC+1) : PARAMETRES REELS DU IEME RAFFINEMENT C NRIDEC : NOMBRE MAX. DE PARAMETRES REELS C NBFDEC : NOMBRE DE RAFFINEMENTS C C IADEC(1) = 1 C RADEC(2) = 1.1 C NIADEC = 2 C IRIDEC = 6 C NBFDEC = 1 C C *************************************************************** INTEGER MODGEN,IADEC(*),NIADEC,NRIDEC,NBFDEC REAL RADEC(*) C IADEC(1) = 1 RADEC(2) = 1.1 MODGEN = 1 NIADEC = 2 NRIDEC = 6 C NBFDEC = 0 C --- REMPLACER PAR : NBFDEC = 1 END C C C SUBROUTINE INIDEN(IACTIO,NOM,MODDEF,MODGEN, > IADEC,NIADEC,RADEC,IRIDEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) C *************************************************************** C OBJET INIDEN : INITIALISE LES DENSITES (A PARTIR D'UN FICHIER) C C EN ENTREE : C IACTIO : 0 RENVOI LES TAILLES NECESSAIRES C 1 REMPLI LES TABLEAUX C NOM : NOM DU FICHIER DE DEFINITION DE LA DENSITE C NDECMX : - INUTILISE - C C EN SORTIE : C MODDEF : LA DEFINITION DE LA DENSITE PEUT ETRE INCOMPLETE C 0 NON DEFINI (ERREUR) C 1 INCOMPLET (UNE SUITE SEULEMENT) C 2 COMPLET (UNE CONCENTRATION) C MODGEN : MODE DE GENERATION DES NOEUDS C 0 NON DEFINI C 1 DIRECT C 2 ITERATIF C 3 ITERATIF + LISSAGE C C IADEC((I-1)*NIADEC+1) : PARAMETRES ENTIERS DU IEME RAFFINEMENT C NIADEC : NOMBRE MAX. DE PARAMETRES ENTIERS C RADEC((I-1)*NIADEC+1) : PARAMETRES REELS DU IEME RAFFINEMENT C IRIDEC : NOMBRE MAX. DE PARAMETRES REELS C NBFDEC : NOMBRE DE RAFFINEMENTS C C IERR : 0 SI OK C -1 SI LA LECTURE DU FICHIER A PROVOQUE UNE ERREUR C -2 SI ON A PAS IL Y A TROP DE DENSITE, DE SUITES... C C *************************************************************** INTEGER IACTIO INTEGER IADEC(*),NIADEC,IRIDEC,MODDEF,MODGEN INTEGER NBFDEC,NDECMX,ITVL(*),NITMAX,NRTMAX REAL RADEC(*), RTVL(*) INTEGER ITRACE,IERR CHARACTER*(*) NOM C INTEGER NBSUMX,NBDNMX,NBPTMX INTEGER NBSUI,NBPT,IDIMC,I,ITZERO(1) INTEGER IDEN,ISUI,ICOORD,IFSUI REAL RSGMAX,RSAMAX REAL TRZERO(1) CHARACTER*256 MESSAG C TRZERO(1) = 0.0 ITZERO(1) = 0 MODDEF = 0 MODGEN = 0 C ========================= C --- 1.LECTURE DE LA DENSITE --- C ========================= NIADEC = 2 C --- TAILLE, RAISON, 2PT IRIDEC = 6 NBFDEC = 0 C --- LECTURE DES TAILLES NECESSAIRES --- CALL LITDEN(0,NOM,TRZERO,IDIMC,NBPT,0, > ITZERO,TRZERO,NBSUI,0,ITZERO,NBFDEC,0,MODGEN,IERR) IF( IERR .NE. 0 )GOTO 999 IF( NBFDEC .LE. 0 )THEN MODDEF = 1 ELSE MODDEF = 2 ENDIF IF(IACTIO.EQ.0)GOTO 999 C LE FICHIER EXISTE ET A UN FORMAT CORRECT MAIS NE CONTIENT C NI SUITE NI DENSITE IF((NBFDEC .LE. 0 ).AND.( NBSUI.EQ. 0 ))THEN MODDEF = 1 MODGEN = 1 IADEC(1) = 1 RADEC(2) = 1.1 IF( ITRACE.GT. 0 )THEN CALL ESMESS(0,62,1,'PAS DE CONCENTRATION',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF GOTO 999 ENDIF C --- ALLOCATION ET LECTURE REELLE ---- NBPTMX = NBPT NBDNMX = NBFDEC NBSUMX = NBSUI C ISUI = 1 IDEN = NBSUMX + ISUI ICOORD = 1 IFSUI = NBPTMX * IDIMC + ICOORD IF(( NITMAX.LT. (NBDNMX*4 + NBSUMX)).OR. > ( NRTMAX.LT. (NBPTMX*IDIMC + 2*NBSUMX)))THEN IERR = -2 GOTO 999 ENDIF C CALL LITDEN(1,NOM,RTVL(ICOORD),IDIMC,NBPT,NBPTMX, > ITVL(ISUI),RTVL(IFSUI),NBSUI,NBSUMX, > ITVL(IDEN),NBFDEC,NBDNMX,MODGEN,IERR) C C LE FICHIER EXISTE ET A UN FORMAT CORRECT MAIS NE CONTIENT C PAS DE DENSITE, SEULEMENT UNE SUITE IF(( NBFDEC .LE. 0 ).AND.( NBSUI.EQ. 1 ))THEN MODDEF = 1 MODGEN = 1 IADEC(1) = ITVL(ISUI) RADEC(2) = RTVL(IFSUI+1) IF( ITRACE.GT. 0 )THEN CALL ESMESS(0,62,1,'PAS DE CONCENTRATION',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF GOTO 999 ENDIF C ============================ C --- 2.TRANSFORMATION DU FORMAT --- C ============================ IF( ITRACE.GT. 0 )THEN CALL ESMESS(101,6,1,'NOMBRE DE CONCENTRATION',MESSAG) CALL ESEINT(1,MESSAG,NBFDEC,1) CALL ESMESS(101,7,1,'MODE DE GENERATION',MESSAG) CALL ESEINT(1,MESSAG,MODGEN,1) ENDIF MODDEF = 2 C RSGMAX = 0.0 RSAMAX = 0.0 DO 10 I=1,NBFDEC CALL STRDEN(I,RTVL(ICOORD),IDIMC,NBPT, > ITVL(ISUI),RTVL(IFSUI), > NBSUI,ITVL(IDEN),NBFDEC, > IADEC((I-1)*NIADEC+1),RADEC((I-1)*IRIDEC+1), > RADEC((I-1)*IRIDEC+2),IADEC((I-1)*NIADEC+2), > RADEC((I-1)*IRIDEC+3),IERR) C IF( IERR .NE. 0 )THEN CALL ESMESS(IERR,54,1,'A LA CONCENTRATION ',MESSAG) CALL ESEINT(1,MESSAG,I,1) GOTO 999 ENDIF IF( IADEC((I-1)*NIADEC+1).EQ. 1 )THEN RSGMAX = MAX(RSGMAX,RADEC((I-1)*IRIDEC+1)) ELSE RSAMAX = MAX(RSAMAX,RADEC((I-1)*IRIDEC+1)) ENDIF 10 CONTINUE C --- ON CALCUL LA RAISON MAXIMUM --- IF(RSGMAX.EQ.0)THEN IADEC(NBFDEC*NIADEC+1) = 2 RADEC(NBFDEC*IRIDEC+1) = RSAMAX ELSE IADEC(NBFDEC*NIADEC+1) = 1 RADEC(NBFDEC*IRIDEC+1) = RSGMAX ENDIF C ---- POUR LA CONVERGENCE (REGULARISATION LISSAGE) ------ IF(MODGEN.EQ.3)RADEC(NBFDEC*IRIDEC+2) = 0.05 C 999 END C C *************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_RAFFINE.F C OBJET ES_RAFFINE.F : LECTURE DES INFORMATIONS POUR LE RAFFINEMENT C C FONCT. : C OBJET LITRAF : LIT LES INFOS POUR LE RAFFINEMENT C C FONCT. LOCALES : C OBJET LITTSN : LIT LA DENSITE (VALEURS NODALES) C OBJET TYFIDE : DONNE LE TYPE DU FICHIER DE DENSITE C C AUTEUR : O. STAB C DATE : 05.98 C C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 8/4/2002, suppression de ARGRAF C suppr ARGRAF : ARGUMENTS DES PROGRAMMES DE RAFFINEMENT C AUTEUR, DATE, OBJET : O.STAB, 8/4/2002,remp. de DSERRE par ESERRO C AUTEUR, DATE, OBJET : O.STAB, 20.09.2004, AJOUT TYFIDE C *************************************************************** C SUBROUTINE TYFIDE(NOM,ITYPRA,IERR) C *************************************************************** C OBJET TYFIDE : DONNE LE TYPE DU FICHIER DE DENSITE INTEGER ITYPRA,IERR CHARACTER*(*) NOM C INTEGER IOLDFI,IFORFI,IUNITC,NBLC,IERR2 ITYPRA =-1 IOLDFI = 1 IFORFI = 0 CALL GESFIC('O',NOM,IOLDFI,IFORFI,IUNITC,IERR) IF( IERR.NE. 0 )GOTO 9999 CALL GESCOM(IUNITC,'DEBGEO',6,'FINGEO',6,'*',0,NBLC,IERR) C FICHIER DENSITE IF(IERR.EQ.0)THEN ITYPRA = 1 GOTO 9995 ENDIF IERR = 0 REWIND IUNITC CALL GESCOM(IUNITC,'DEBGRD',6,'FINGRD',6,'*',0,NBLC,IERR) C FICHIER GRANDEURS IF(IERR.EQ.0)THEN ITYPRA = 2 GOTO 9995 ENDIF ITYPRA =-1 9995 CALL GESFIC('F',NOM,IOLDFI,IFORFI,IUNITC,IERR2) 9999 END C C SUBROUTINE LITTSN(IACTIO,NOM,MODGEN, > IADEC,NIADEC,RADEC,NRIDEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) C *************************************************************** C OBJET LITTSN : LIT LA DENSITE (VALEURS NODALES) C C EN ENTREE : C IACTIO : 0 RENVOI LES TAILLES NECESSAIRES C 1 REMPLI LES TABLEAUX C NOM : NOM DU FICHIER DE DEFINITION DE LA DENSITE C NDECMX : TAILLE DU TABLEAU RADEC C C EN SORTIE : C MODGEN : MODE DE GENERATION DES NOEUDS C 0 NON DEFINI C 1 DIRECT C 2 ITERATIF C 3 ITERATIF + LISSAGE C C IADEC((I-1)*NIADEC+1) : PARAMETRES ENTIERS DU IEME RAFFINEMENT C NIADEC : NOMBRE MAX. DE PARAMETRES ENTIERS (= 0) C C RADEC((I-1)*NIADEC+1) : PARAMETRES REELS DU IEME RAFFINEMENT C RADEC(I) : VALEUR DE LA TAILLE SOUHAITEE AU NOEUD I (CAS ISOTROPE) C NRIDEC : NOMBRE MAX. DE PARAMETRES REELS = NBN C NBFDEC : NOMBRE DE RAFFINEMENTS (= 1 CAS ISOTROPE) C *************************************************************** INTEGER IACTIO INTEGER IADEC(*),NIADEC,NRIDEC,MODGEN INTEGER NBFDEC,NDECMX,ITVL(*),NITMAX,NRTMAX REAL RADEC(*), RTVL(*) INTEGER ITRACE,IERR CHARACTER*(*) NOM C REAL ZERO INTEGER NBN,IDIMC,NRGMAX CHARACTER*256 MESSAG C ZERO = 0.0 NRGMAX = 0 CALL LITGRD(0,NOM,0,ZERO,IDIMC,NBN,IERR) IF( IERR.NE.0 )GOTO 9999 IF(IDIMC.NE.1)GOTO 901 NIADEC = 0 NBFDEC = IDIMC NRIDEC = NBN C MODGEN = 2 C REMPLACE PAR (MODGEN N'EST PAS DEFINIT : EN 1D DIRECT, EN 2D ITERATIF): MODGEN = -1 IF(IACTIO.EQ.0)GOTO 9999 CALL LITGRD(IACTIO,NOM,NRTMAX,RADEC,IDIMC,NBN,IERR) IF( IERR.NE.0 )GOTO 901 GOTO 9999 C --- messages d'erreur 901 IERR=-1 CALL ESMESS(IERR,41,1,'DIMENSION DOIT ETRE DE 1 ',MESSAG) CALL ESEINT(1,MESSAG,IDIMC,1) 9999 END C SUBROUTINE LITRAF(IACTIO,NOM,MODDEF,MODGEN, > IADEC,NIADEC,RADEC,NRADEC,NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX,ITRACE,IERR) C *************************************************************** C OBJET LITRAF : LIT LES INFOS POUR LE RAFFINEMENT C C EN ENTREE : C IACTIO : 0 RENVOI LES TAILLES NECESSAIRES C 1 REMPLI LES TABLEAUX C NOM : NOM DU FICHIER DE DEFINITION DE LA DENSITE C C EN SORTIE : C MODDEF : MODE DE DEFINITION DES DENSITES C 0 NON DEFINI C 1 DEFAUT (AMORTISSEMENT EN 1D : UNE SUITE) C 2 FONCTIONS ANALYTIQUES SPATIALES (X,Y) C 3 TAILLES SOUHAITEES AUX NOEUDS + INTERPOLATION C MODGEN : MODE DE GENERATION DES NOEUDS C 0 NON DEFINI C 1 DIRECT C 2 ITERATIF C 3 ITERATIF + LISSAGE C C IADEC((I-1)*NIADEC+1) : PARAMETRES ENTIERS DU IEME RAFFINEMENT C NIADEC : NOMBRE MAX. DE PARAMETRES ENTIERS C RADEC((I-1)*NIADEC+1) : PARAMETRES REELS DU IEME RAFFINEMENT C NRADEC : NOMBRE MAX. DE PARAMETRES REELS C NBFDEC : NOMBRE DE RAFFINEMENTS C C REMARQUE : dans la librairie mais devrait etre avec l'application C *************************************************************** INTEGER IACTIO INTEGER IADEC(*),NIADEC,NRADEC,MODDEF,MODGEN INTEGER NBFDEC,NDECMX,ITVL(*),NITMAX,NRTMAX REAL RADEC(*), RTVL(*) INTEGER ITRACE,IERR CHARACTER*(*) NOM C REAL ZERO INTEGER MODDEN,ITYPRA CHARACTER*256 MESSAG C MODDEF = 0 MODGEN = 0 ZERO = 0.0 IF( NOM .EQ. ' ' )THEN C ======================== C --- PAS DE FICHIER DENSITE --- C ======================== IF( ITRACE .NE. 0 )THEN CALL ESMESS(101,2,1,'-> DENSITE PAR DEFAUT ',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF IF( IACTIO .EQ. 0 )THEN CALL DEFDEN(MODGEN,ITVL,NIADEC,RTVL,NRADEC,NBFDEC) ELSE CALL DEFDEN(MODGEN,IADEC,NIADEC,RADEC,NRADEC,NBFDEC) ENDIF MODDEF = 1 GOTO 9999 ENDIF C ======================== C --- 1.LECTURE DE LA DENSITE --- C ======================== IF( ITRACE .NE. 0 )THEN CALL ESMESS(101,3,1,'-> LECTURE DES DENSITES :',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF C C AJOUT 20.09.2004 ON TESTE LE TYPE DE FICHIER CALL TYFIDE(NOM,ITYPRA,IERR) GOTO (100,200) ITYPRA GOTO 9999 C 100 CONTINUE C ================================ C --- DENSITE = FONCTION ANALYTIQUES --- C =============================== IF( ITRACE .NE. 0 )THEN CALL ESMESS(101,4,1,'-> FONCTIONS DE DENSITES :',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF CALL INIDEN(0,NOM,MODDEN,MODGEN,0,NIADEC, > ZERO,NRADEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF( IERR .NE. 0 )GOTO 9999 C - SI LA DEFINITION EST INCOMPLETE (UNE SUITE) => MODDEF = DEFAUT - IF( MODDEN.EQ. 1 )MODDEF = 1 C - SI LA DEFINITION EST ICOMPLETE (UNE DENSITE) => MODDEF = ANALYTIQUE - IF( MODDEN.EQ. 2 )MODDEF = 2 IF( IACTIO .EQ. 0 )GOTO 9999 CALL INIDEN(1,NOM,MODDEN,MODGEN,IADEC,NIADEC, > RADEC,NRADEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF( IERR .NE. 0 )THEN CALL ESERRE(1,IERR,'LITRAF',' APPEL INIDEN') ENDIF GOTO 9999 C ========================== C --- DENSITE DONNEE AU NOEUDS --- C ========================== 200 CONTINUE IF( ITRACE .NE. 0 )THEN CALL ESMESS(101,5,1,'-> VALEURS NODALES :',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF CALL LITTSN(0,NOM,MODGEN,0,NIADEC, > ZERO,NRADEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF( IERR .NE. 0 )THEN CALL ESERRE(1,IERR,'LITRAF','APPEL LITTSN OU INIDEN') GOTO 9999 ENDIF MODDEF = 3 IF( IACTIO .EQ. 0 )GOTO 9999 CALL LITTSN(1,NOM,MODGEN,IADEC,NIADEC, > RADEC,NRADEC, > NBFDEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF( IERR .NE. 0 )THEN CALL ESERRE(1,IERR,'LITRAF',' APPEL LITTSN') ENDIF C 9999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_REQUETE.F C OBJET : LECTURE DE REQUETES C FONCT. : C LITREQ : LECTURE DE REQUETES SUR UN MAILLAGE C C AUTEUR : O.STAB C DATE : 02.96 C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 16.08.98, PASSAGE ANSI. C C C ***************************************************************** C C SUBROUTINE LITREQ(IACTIO,NOM,NOEREQ,NBMXRQ, > IMATRQ,IREFRQ,NBREQ,IERR) C ***************************************************************** C OBJET LITREQ : LECTURE DES REQUETES DANS LE FICHIER NOM C SYNTAXE : { NOEUDS } REFERENCE REGION C C EN ENTREE : C IACTIO : ENTIER INDIQUANT AU S/PROGRAMME LES ENTITES A LIRE C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C DE PLUS, SI IACTIO > 0 : C NBMXRQ : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C C EN SORTIE : C IERR=0 : PAS D'ERREUR C IERR=-1 : PROBLEME D'OUVERTURE DU FICHIER C C SI IACTIO = 0 CALL LITREQ(0,NOMREQ,0,NBMXRQ,0,0,NBREQ,IERR) C IDIMC,NBN,0.,IDE,NBNMAX,NBE,0,NMT,REFMAT,0,IERR) C NBMXRQ : NB MAXI DE NOEUDS PAR REQUETE C NBREQ : NOMBRE TOTAL DE REQUETES C C SI IACTIO = 1 C NBREQ : NOMBRE TOTAL DE REQUETES C NOEREQ : NOEUD DE LA REQUETE C IMATRQ : MATERIAU OU REGION DE LA REQUETE C IREFRQ : REFERENCE DE LA REQUETE C C ***************************************************************** CHARACTER*(*) NOM INTEGER IACTIO,NOEREQ(*),NBMXRQ,IMATRQ(*),IREFRQ(*),NBREQ INTEGER IERR C INTEGER IN,IT,N,I,J,IEL,MM,NEL,M,IC,IM,L(27) INTEGER LENCHR,NBLC C NBREQ = 0 IF( IACTIO.EQ. 0 )NBMXRQ = 0 C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,I) IF(IERR.NE.0.OR.I.NE.0) GOTO 80 CALL GESCOM(IN,'DEBREQ',6,'FINREQ',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)GOTO 80 REWIND IN REWIND IT C C ====================================== C --- 1. LECTURE DES REQUETES --- C ====================================== C READ(IT,*,ERR=80,END=80) NBREQ IF(NBREQ.LE.0) GOTO 80 C --- IL FAUT AU MOINS UNE REQUETE ! IF(IACTIO.EQ.0) THEN DO 10 I=1,NBREQ READ(IT,*,ERR=80,END=80) N NBMXRQ = MAX( NBMXRQ,N) 10 CONTINUE GOTO 95 ENDIF IF( NBMXRQ.LT. 0 )THEN IERR = -1 GOTO 95 ENDIF DO 20 I=1,NBREQ READ(IT,*,ERR=80,END=80) > N,(NOEREQ((I-1)*NBMXRQ+J),J=1,N), > IREFRQ(I),IMATRQ(I) DO 15 J=N+1,NBMXRQ NOEREQ((I-1)*NBMXRQ+J) = 0 15 CONTINUE IF( N.GT. NBMXRQ )GOTO 90 20 CONTINUE GOTO 95 C --- TRAITEMENT DES ERREURS --- 80 IERR=-1 GOTO 95 90 IERR=-2 C --- FIN --- 95 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_ENSEMBLE.F C OBJET : ECRITURE DES ENSEMBLES C FONCT. : C ECRENS : ECRITURE DES ENSEMBLES DANS LE FICHIER NOM DU TYPE C VIPLEF3D C C AUTEUR : O.STAB C DATE : 02.96 C MODIFICATIONS : C AUTEUR, DATE, OBJET : O.STAB, 160898, BUG DANS ECRENS ?! C C C ***************************************************************** C C SUBROUTINE ECRENS(NOM,IDE,ITRNOE,NBNMAX, > IENS,IREF,IDENS, NBENS, IELEMENS,IERR ) C ***************************************************************** C OBJET ECRENS : ECRITURE DES ENSEMBLES DANS UN FICHIER C C EN ENTREE : C NOM : NOM DU FICHIER A OUVRIR, REMPLIR PUIS FERMER C --- LE MAILLAGE --- C IDE : DIMENSION DES ELEMENTS DU MAILLAGE C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C ITRNOE : TABLEAU DES ELEMENTS C --- LES ENSEMBLES --- C IENS : C IREF : IREF(I) = REFERENCE DE L'ENSEMBLE I C IDENS : IDENS(I) = TYPE DES ELEMENTS DE L'ENSEMBLE I C IDE <=> MAILLES, 0 <=> SOMMET, 1 <=> ARETE C 2 <=> FACETTE C NBENS : NOMBRE D'ENSEMBLE C IELEMENS : LES ELEMENTS DES ENSEMBLES SOUS LA FORME DE DOUBLETS C (E,A) : E EST L'ELEMENT, A L'ADRESSE RELATIVE DE C L'ENTITE RECHERCHEE DANS L'ELEMENT E C C C EN SORTIE : C IER= 0 : PAS D'ERREUR C IER=-1 : PROBLEME D'OUVERTURE DU FICHIER C C ***************************************************************** CHARACTER*(*) NOM INTEGER IDE,ITRNOE(*),NBNMAX INTEGER IENS(*),IREF(*),IDENS(*), NBENS, IELEMENS(*),IERR C INTEGER IUNIT,I,J INTEGER IDEBUT,IFIN,NUM,IT,IR,IAR,IARS,N1,N2,NBNE INTEGER STRNBN EXTERNAL STRNBN C C --- MODIF O.STAB 28.05.98 : ON DOIT POUVOIR ECRIRE DANS UN C FICHIER EXISTANT C C IERR = GESFICTEST(NOM,0,0) C IF( IERR.NE.0 )THEN C C ON AJOUTE EN FIN SI LE FICHIER EXISTE C C CALL GESFIC('O',NOM,1,0,IUNIT,IERR) C C'EST UN NOUVEAU FICHIER !!! BUG160898 O.STAB CALL GESFIC('O',NOM,0,0,IUNIT,IERR) IF( IERR.NE. 0 )GOTO 999 C MODIF DU 16.10.2000 O.STAB : BOUCLE INFINIE SUR IRIX6.5 C 10 READ(IUNIT,*,ERR=11,END=11) C GOTO 10 11 WRITE(IUNIT,'(A)')'* AJOUT DES ENSEMBLES' C ELSE C CALL GESFIC('O',NOM,0,0,IUNIT,IERR) C IF( IERR.NE. 0 )GOTO 999 C ENDIF C C I. ECRITURE DES ENSEMBLES C ------------------------- WRITE(IUNIT,'(A)')'DEBENS' WRITE(IUNIT,*) IENS(NBENS) C C --- BOUCLE SUR LES ENSEMBLES --- C IDEBUT = 1 NUM = 0 NBNE = NBNMAX DO 50 I=1,NBENS IR = IREF(I) IFIN = IENS(I) C ================= C --- POUR LES ELEMENTS (D'UNE REGION) --- C ================= IF( IDENS(I).EQ.IDE )THEN DO 20 J=IDEBUT,IFIN IT = IELEMENS((J-1)*2+1) NUM = NUM + 1 WRITE(IUNIT,*) '0 ',IT,IR,NUM 20 CONTINUE C ================= C --- POUR LES ELEMENTS (INCIDENT A UN NOEUD) --- C ================= ELSE IF( IDENS(I).EQ.0 )THEN DO 30 J=IDEBUT,IFIN IT = IELEMENS((J-1)*2+1) IAR = IELEMENS((J-1)*2+2) N1 = ITRNOE((IT-1)*NBNMAX+IAR) NUM = NUM + 1 WRITE(IUNIT,*) '1 ',N1,IT,IR,NUM 30 CONTINUE ELSE C ================= C --- POUR LES NOEUDS (DES ARETES) --- C ================= IF( IDENS(I).EQ.1 )THEN DO 40 J=IDEBUT,IFIN IT = IELEMENS((J-1)*2+1) IAR = IELEMENS((J-1)*2+2) IF( NBNMAX.NE.3 )NBNE = STRNBN(IT,ITRNOE,NBNMAX) N1 = ITRNOE((IT-1)*NBNMAX+IAR) IARS = MOD(IAR,NBNE)+1 N2 = ITRNOE((IT-1)*NBNMAX+IARS) NUM = NUM + 1 WRITE(IUNIT,*) '2 ',N1,N2,IT,IR,NUM 40 CONTINUE ELSE IERR = -3 ENDIF ENDIF ENDIF IDEBUT = IFIN + 1 50 CONTINUE WRITE( IUNIT,'(A)')'FINENS' C 100 CALL GESFIC('F',NOM,3,0,IUNIT,IERR) 999 END C ********************************************************************** C FICHIER : ES_BREP.F C OBJET : LECTURE ECRITURE D'UNE "Brep" (Boundary REPresentation) C FONCT. : C OBJET ESFACE : LECTURE/ECRITURE D'UNE FACE C OBJET ESCOOR : LECTURE/ECRITURE DE COORDONNEES C OBJET ESARET : LECTURE/ECRITURE D'UNE ARETE C OBJET ECRBRP : ECRITURE D'UNE FRONTIERE (BREP) C OBJET LICBRP : LECTURE DES ENTETES D'UN FICHIER BREP (FRONTIERE) C OBJET LICBLC : LECTURE DE L'ENTETE D'UN BLOC C OBJET LITBRP : LECTURE D'UNE BREP (FRONTIERE) C C AUTEUR : O. STAB C DATE : 15.03.2001 C TESTS : C MODIFICATIONS : C AUTEUR, DATE, OBJET : C C GESTION DES FICHIERS C UN FICHIER : VERSION (BLOCS)* C UN BLOC : DEBUT VERSION C ENTETE C (ENREGISTREMENT)* C FIN C UN ENREGISTREMENT : (MOTS)* C GESTION DES VERSIONS DE FICHIER C C ********************************************************************** C SUBROUTINE ESFACE(IACTIO,IUNIT,IVERSI, > IFACE,ITVOFA,NBVOFA,NBVOMX, > IERR) C ***************************************************************** C OBJET ESFACE : LECTURE/ECRITURE D'UNE FACE C EN ENTREE : C IACTIO : 0 LECTURE C 1 ECRITURE C IUNIT : -1 STDERR/STDIN (A FAIRE) C 0 STDOUT/STDIN (A FAIRE) C 1..25 FICHIER (RENVOYE PAR GESFIC) C IVERSI : VERSION DU FORMAT C C ***************************************************************** INTEGER IACTIO,IUNIT,IVERSI INTEGER IFACE,ITVOFA(*),NBVOFA,NBVOMX INTEGER IERR C INTEGER J INTEGER MAXVOL PARAMETER (MAXVOL = 10) INTEGER LECVOL(MAXVOL) C IERR = 0 C ------------------------------ C ---- VERIFICATION POUR L'ECRITURE --- C ------------------------------ IF( IACTIO.EQ.1 )THEN IF(NBVOFA.GT.2)THEN IERR = -1 CALL ESERRE(1,IERR,'ESFACE', > ' UNE FACE A PLUS DE 2 VOLUMES ?') PRINT *,'FACE = ',IFACE GOTO 9999 ENDIF ENDIF C ------------------------------ C ---- LECTURE / ECRITURE ---- C ------------------------------ C C IF( IVERSI )GOTO (10,20) IVERSI GOTO (10,20) IVERSI C ---- VERSION INCONNUE ---- IERR = -1 CALL ESERRE(1,IERR,'ESARET', > 'VERSION DU FORMAT DE FACE INCONNU') GOTO 9999 C ---- VERSION 2 ---- IL N'Y A PAS DE VERSION 1 10 CONTINUE 20 CONTINUE IF( IACTIO.EQ.0 )THEN READ(IUNIT,*,ERR=390,END=395)IFACE, > NBVOFA,(LECVOL(J),J=1,MIN(NBVOFA,MAXVOL)) ELSE WRITE(IUNIT,*) IFACE,NBVOFA, > (ITVOFA(J),J=1,NBVOFA) ENDIF GOTO 100 C -------- 100 CONTINUE C ------------------------------ C ---- VERIFICATION POUR LA LECTURE --- C ------------------------------ IF( IACTIO.EQ.1 )GOTO 9999 C IF(NBVOFA.GT.NBVOMX)THEN IERR = -1 CALL ESERRE(1,IERR,'ESFACE', > ' UNE FACE A TROP DE VOLUMES') PRINT *,'FACE = ',IFACE,(LECVOL(J),J=1,NBVOFA) GOTO 9999 ENDIF DO 360 J=1,NBVOFA ITVOFA(J)=LECVOL(J) 360 CONTINUE DO 361 J=NBVOFA+1,NBVOMX ITVOFA(J)=0 361 CONTINUE 380 CONTINUE GOTO 9999 C ----------------------------- C ---- GESTION DES ERREURS DU BLOC ---- C ----------------------------- 390 IERR = -1 CALL ESERRE(1,IERR,'ESFACE', > ' ERREUR LECTURE FACE') PRINT *,'FACE = ',IFACE GOTO 9999 395 IERR = -1 CALL ESERRE(1,IERR,'ESFACE', > ' FACE INCOMPLETE') PRINT *,'FACE = ',IFACE GOTO 9999 C 9999 END C C SUBROUTINE ESCOOR(IACTIO,IUNIT,IVERSI, > ISOMME,COORD,NBNOMX,IDIMC, > IERR) C ***************************************************************** C OBJET ESCOOR : LECTURE/ECRITURE DE COORDONNEES C EN ENTREE : C IACTIO : 0 LECTURE C 1 ECRITURE C IUNIT : -1 STDERR/STDIN (A FAIRE) C 0 STDOUT/STDIN (A FAIRE) C 1..25 FICHIER (RENVOYE PAR GESFIC) C IVERSI : VERSION DU FORMAT C C ***************************************************************** INTEGER IACTIO,IUNIT,IVERSI INTEGER ISOMME,NBNOMX,IDIMC REAL COORD(*) INTEGER IERR C INTEGER J C IERR = 0 C ------------------------------ C ---- VERIFICATION POUR L'ECRITURE --- C ------------------------------ IF( IACTIO.EQ.1 )THEN ENDIF C ------------------------------ C ---- LECTURE / ECRITURE ---- C ------------------------------ C C IF( IVERSI )GOTO (10,20) IVERSI GOTO (10,20) IVERSI C ---- VERSION INCONNUE ---- IERR = -1 CALL ESERRE(1,IERR,'ESCOOR', > 'VERSION DU FORMAT DE COORD INCONNU') GOTO 9999 C ---- VERSION 1 ---- 10 CONTINUE IF( IACTIO.EQ.0 )THEN READ(IUNIT,*,ERR=290,END=295) > (COORD(J),J=1,IDIMC) DO 12 J=IDIMC+1,NBNOMX COORD(J)= 0.0 12 CONTINUE C ISOMME EST DONNE EN PARAMETRE ELSE WRITE(IUNIT,*) (COORD(J),J=1,IDIMC) ENDIF GOTO 100 C ---- VERSION 2 ---- 20 CONTINUE IF( IACTIO.EQ.0 )THEN READ(IUNIT,*,ERR=290,END=295) ISOMME, > (COORD(J),J=1,IDIMC) DO 22 J=IDIMC+1,NBNOMX COORD(J)= 0.0 22 CONTINUE ELSE WRITE(IUNIT,*) ISOMME,(COORD(J),J=1,IDIMC) ENDIF GOTO 100 C -------- 100 CONTINUE C ------------------------------ C ---- VERIFICATION POUR LA LECTURE --- C ------------------------------ IF( IACTIO.EQ.1 )GOTO 9999 GOTO 9999 C ----------------------------- C ---- GESTION DES ERREURS DU BLOC ---- C ----------------------------- 290 IERR = -1 CALL ESERRE(1,IERR,'ESCOOR', > ' ERREUR LECTURE SOMMET') PRINT *,'SOMMET = ',ISOMME GOTO 9999 295 IERR = -1 CALL ESERRE(1,IERR,'ESCOOR', > ' SOMMET INCOMPLET') PRINT *,'SOMMET = ',ISOMME GOTO 9999 C 9999 END C C SUBROUTINE ESARET(IACTIO,IUNIT,IVERSI, > IARETE,ITNOAR,NBNOMX,ITFAAR,NBFAAR,NBFAMX, > IERR) C ***************************************************************** C OBJET ESARET : LECTURE/ECRITURE D'UNE ARETE C EN ENTREE : C IACTIO : 0 LECTURE C 1 ECRITURE C IUNIT : -1 STDERR/STDIN (A FAIRE) C 0 STDOUT/STDIN (A FAIRE) C 1..25 FICHIER (RENVOYE PAR GESFIC) C IVERSI : VERSION DU FORMAT C C ***************************************************************** INTEGER IACTIO,IUNIT,IVERSI INTEGER IARETE,ITNOAR(*),NBNOMX,ITFAAR(*),NBFAAR,NBFAMX INTEGER IERR C INTEGER J,K,NBNNOI,NBNFAI,NCODE,IC INTEGER MAXSOM,MAXFAC PARAMETER (MAXSOM = 27, MAXFAC = 10) INTEGER LECSOM(MAXSOM),LECFAC(MAXFAC) C IERR = 0 C ------------------------------ C ---- VERIFICATION POUR L'ECRITURE --- C ------------------------------ IF( IACTIO.EQ.1 )THEN IF((NBNOMX.NE.2).OR.(NBFAAR.GT.4))THEN IERR = -1 CALL ESERRE(1,IERR,'ESARET', > ' UNE ARETE BIZARRE') PRINT *,'ARETE = ',IARETE GOTO 9999 ENDIF ENDIF C ------------------------------ C ---- LECTURE / ECRITURE ---- C ------------------------------ C C LE FORMAT LIBRE POSE DES PROBLEMES CAR SUR L'O2 C LA LIGNE NE CONTIENT ALORS QUE 73 CARACTERES... C C IF( IVERSI )GOTO (10,20) IVERSI GOTO (10,20) IVERSI C ---- VERSION INCONNUE ---- IERR = -1 CALL ESERRE(1,IERR,'ESARET', > 'VERSION DU FORMAT D ARETE INCONNU') GOTO 9999 C ---- VERSION 1 ---- 10 CONTINUE IF( IACTIO.EQ.0 )THEN READ(IUNIT,*,ERR=290,END=295) > NBNNOI,(LECSOM(J),J=1,MIN(NBNNOI,MAXSOM)),IC, > NBNFAI,(LECFAC(J),J=1,MIN(NBNFAI,MAXFAC)) C IARETE EST DONNE EN PARAMETRE ELSE NCODE = 100 WRITE(UNIT=IUNIT,FMT='(11I10)') > NBNOMX,(ITNOAR(K),K=1,NBNOMX), > NCODE, > NBFAAR, (ITFAAR(K),K=1,NBFAAR) ENDIF GOTO 100 C ---- VERSION 2 ---- 20 CONTINUE IF( IACTIO.EQ.0 )THEN READ(IUNIT,*,ERR=290,END=295) IARETE, > NBNNOI,(LECSOM(J),J=1,MIN(NBNNOI,MAXSOM)), > NBNFAI,(LECFAC(J),J=1,MIN(NBNFAI,MAXFAC)) IC = 100 ELSE WRITE(UNIT=IUNIT,FMT='(11I10)') IARETE, > NBNOMX,(ITNOAR(K),K=1,NBNOMX), > NBFAAR, (ITFAAR(K),K=1,NBFAAR) ENDIF GOTO 100 C -------- 100 CONTINUE C ------------------------------ C ---- VERIFICATION POUR LA LECTURE --- C ------------------------------ IF( IACTIO.EQ.1 )GOTO 9999 IF((NBNNOI.GT.NBNOMX).OR.(NBNNOI.GT.MAXSOM))THEN IERR = -2 CALL ESERRE(1,IERR,'ESARET', > ' UNE ARETE A TROP DE NOEUDS') PRINT *,'ARETE = ',IARETE GOTO 9999 ENDIF DO 260 J=1,NBNNOI ITNOAR(J)=LECSOM(J) 260 CONTINUE DO 261 J=NBNNOI+1,NBNOMX ITNOAR(J)=0 261 CONTINUE C IF((NBNFAI.GT.NBFAMX).OR.(NBNFAI.GT.MAXFAC))THEN IERR = -2 CALL ESERRE(1,IERR,'ESARET', > 'BLOC DEBARE, UNE ARETE A TROP DE FACES') PRINT *,'ARETE = ',IARETE GOTO 9999 ENDIF NBFAAR = NBNFAI DO 270 J=1,NBNFAI ITFAAR(J)=LECFAC(J) 270 CONTINUE DO 271 J=NBNFAI+1,NBFAMX ITFAAR(J) = 0 271 CONTINUE GOTO 9999 C ----------------------------- C ---- GESTION DES ERREURS DU BLOC ---- C ----------------------------- 290 IERR = -1 CALL ESERRE(1,IERR,'ESARET', > 'BLOC DEBARE, ERREUR LECTURE ARETE') PRINT *,'ARETE = ',IARETE GOTO 9999 295 IERR = -1 CALL ESERRE(1,IERR,'ESARET', > 'BLOC DEBARE, ARETE INCOMPLETE') PRINT *,'ARETE = ',IARETE GOTO 9999 C 9999 END C C C SUBROUTINE ECRBRP(NOM,IVERSIO, > ISOMME,COORD,IDIMC,NBN, > IARETE,NBARET,ITNOAR,NBNOMX, > ITFAAR,NBFAAR,NBFAMX, > IFACES,NBFACE,ITVOFA,NBVOFA,NBVOMX, > IERR) C ***************************************************************** C OBJET ECRBRP : ECRITURE D'UNE FRONTIERE (BREP) C UNE ARETE EST DECRITE PAR SES SOMMETS ET LA LISTE DES FACES C INCIDENTES : N1 N2 NBFACES F1 F2 ... FN C C IDEM DS1 MAIS TRIMAT N'EST PLUS LES INTERVALS : C C'EST DIRECTEMENT LES REFERENCES DES ELEMENTS ! C EN ENTREE : C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C C ISOMME() : TABLEAU INDICES DES SOMMETS C COORD,IDIMC,NBN : TABLEAU DES COORDONNEES DES POINTS C --- LES ARETES DE LA FRONTIERES --- C IARETE(),NBARET : TABLEAU INDICES DES ARETES C ITNOAR(),NBNOMX : TABLEAU DES NOEUDS DES ARETES C ITFAAR(),NBFAAR(),NBFMAX : TABLEAU DES FACES INCIDENTES AUX ARETES C --- LES FACES DE LA FRONTIERE --- C IFACES(),NBFACE : TABLEAU DES FACES C ITVOFA(),NBVOFA(),NBVOMX : TABLEAU DES VOLUMES INCIDENTS AUX FACES C C EN SORTIE : C IERR=0 : PAS D'ERREUR C IERR=-1 : PROBLEME D'OUVERTURE DU FICHIER C IERR=-2 : L'UN DES TABLEAUX EST TROP PETIT C C ***************************************************************** CHARACTER*(*) NOM INTEGER IVERSIO INTEGER ISOMME(*) REAL COORD(*) INTEGER IDIMC,NBN INTEGER IARETE(*),NBARET,ITNOAR(*),NBNOMX INTEGER ITFAAR(*),NBFAAR(*),NBFAMX INTEGER IFACES(*),ITVOFA(*),NBVOFA(*),NBVOMX,NBFACE INTEGER IERR C INTEGER IUNIT,I,J,K INTEGER NBNE,NCODE,NMAT,IMATD,IMATF INTEGER NBVERS PARAMETER (NBVERS=3) INTEGER IVERS(NBVERS) INTEGER IACTIO C IACTIO = 1 GOTO (10,20) IVERSIO IERR = -1 CALL ESERRE(1,IERR,'ECRBRP',' ATTENTION VERSION INCONNUE') GOTO 9999 10 CONTINUE IVERS(1)= 1 IVERS(2)= 1 IVERS(3)= 1 GOTO 100 20 CONTINUE IVERS(1)= 2 IVERS(2)= 2 IVERS(3)= 2 GOTO 100 100 CONTINUE C CALL GESFIC('O',NOM,0,0,IUNIT,IERR) IF(IERR.NE.0)THEN CALL ESERRE(1,IERR,'ECRBRP',' ATTENTION LE FICHIER EXISTE DEJA') GOTO 9999 ENDIF C WRITE(IUNIT,'(A)') '* FRT 1.0 FICHIER FRONTIERE (BREP)' C C -------------------------------------- C I. ECRITURE DES COORDONNEES DES NOEUDS C -------------------------------------- WRITE(IUNIT,'(A)')'DEBXYZ' C WRITE(IUNIT,'(A)')'* DEBXYZ 1.0' WRITE(IUNIT,*) NBN, IDIMC DO 110 I=1,NBN CALL ESCOOR(IACTIO,IUNIT,IVERS(1), > ISOMME(I),COORD((I-1)*IDIMC+1),NBNOMX,IDIMC, > IERR) IF( IERR.NE.0 )GOTO 999 110 CONTINUE WRITE( IUNIT,'(A)')'FINXYZ' C C ------------------------ C I. ECRITURE DES ARETES C ------------------------ IF( NBARET .EQ. 0 )GOTO 100 GOTO (120,130) IVERS(2) GOTO 999 C --- POUR ETRE COMPRIS DE DSGG --- 120 WRITE(IUNIT,'(A)')'DEBARE' WRITE(IUNIT,*) NBARET, NBNOMX, NBFAMX C WRITE(IUNIT,*) NBARET GOTO 190 130 WRITE(IUNIT,'(A)')'DEBARE' WRITE(IUNIT,*) NBARET, NBNOMX, NBFAMX GOTO 190 190 CONTINUE C NCODE = 100 DO 200 J=1,NBARET CALL ESARET(IACTIO,IUNIT,IVERS(2), > IARETE(J),ITNOAR((J-1)*NBNOMX+1),NBNOMX, > ITFAAR((J-1)*NBFAMX+1),NBFAAR(J),NBFAMX, > IERR) IF(IERR.NE.0)GOTO 999 200 CONTINUE GOTO (220,230) IVERS(2) GOTO 999 220 WRITE( IUNIT,'(A)')'FINARE' GOTO 290 230 WRITE( IUNIT,'(A)')'FINARE' GOTO 290 290 CONTINUE C C III. ECRITURE DES FACES C ------------------------ IF( NBFACE .EQ. 0 )GOTO 100 WRITE(IUNIT,'(A)')'DEBFAC' C WRITE(IUNIT,'(A)')'* DEBFAC 1.0' WRITE(IUNIT,*) NBFACE, NBVOMX C DO 300 J=1,NBFACE CALL ESFACE(IACTIO,IUNIT,IVERS(3), > IFACES(J),ITVOFA((J-1)*NBVOMX+1),NBVOFA(J),NBVOMX, > IERR) C WRITE(IUNIT,*) IFACES(J),NBVOFA(J), C > (ITVOFA((J-1)*NBVOMX+K),K=1,NBVOFA(J)) 300 CONTINUE C WRITE(IUNIT,'(A)')'FINFAC' C 999 CALL GESFIC('F',NOM,0,0,IUNIT,IERR) 9999 CONTINUE END C C C SUBROUTINE BLCFAC(IACTIO,IUNIT,IVERSI, c > IFACES,NBFACE,ITVOFA,NBVOFA,NBVOMX,IERR) > IFACES,NBFACE,ITVOFA,NBVOFA,NBFAMX,NBVOMX,IERR) C ***************************************************************** C OBJET BLCFAC : LECTURE/ECRITURE DU BLOC DES FACES C EN ENTREE : C NOM : DU FICHIER C NBVOFA : TABLEAU DES "VOLUMES" DES FACES C NBFAMX : NBRE DE COLONNES DE NBVOFA C EN SORTIE : C NBVOMX : EN ECRITURE !!! C = NBFAMX LECTURE SEULEMENT,TAILLE ITVOFA(NBFAMX*NBFACE) C ***************************************************************** INTEGER IACTIO,IUNIT,IVERSI INTEGER IFACES(*),NBFACE,ITVOFA(*),NBVOFA(*),NBFAMX,NBVOMX,IERR C INTEGER I,J,IT,NBLC C IF( IACTIO.EQ.0 )THEN C ------------------------ C 1. LECTURE DES FACES C ------------------------ CALL GESFIC('O',' ',2,0,IT,IERR) CALL GESCOM(IUNIT,'DEBFAC',6,'FINFAC',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)THEN IERR = -1 CALL ESERRE(1,IERR,'BLCFAC','BLOC DEBFAC, PAS TROUVE') GOTO 999 ENDIF REWIND IT READ(IT,*,ERR=390,END=395) NBFACE,NBVOMX C C READ(IT,*,ERR=390,END=395) NBFAL,NBVOL C NBFAL = MIN(NBFAL,NBFACE) C DO 100 I=1,NBFAL C DO 100 I=1,NBFACE CALL ESFACE(IACTIO,IT,IVERSI, C > IFACES(I),ITVOFA((I-1)*NBVOMX+1),NBVOFA(I),NBVOMX, > IFACES(I),ITVOFA((I-1)*NBFAMX+1),NBVOFA(I),NBFAMX, > IERR) IF(IERR.NE.0)GOTO 999 100 CONTINUE ELSE C ------------------------ C 2. ECRITURE DES FACES C ------------------------ IF( NBFACE .EQ. 0 )GOTO 9999 WRITE(IUNIT,'(A)')'DEBFAC' WRITE(IUNIT,*) NBFACE, NBVOMX DO 300 J=1,NBFACE CALL ESFACE(IACTIO,IUNIT,IVERSI, > IFACES(J),ITVOFA((J-1)*NBVOMX+1),NBVOFA(J),NBVOMX, > IERR) 300 CONTINUE WRITE(IUNIT,'(A)')'FINFAC' ENDIF GOTO 999 C ----------------------------- C ---- GESTION DES ERREURS DES BLOCS ---- C ----------------------------- 390 IERR = -1 CALL ESERRE(1,IERR,'BLCFAC', > 'BLOC, ERREUR LECTURE ENTETE') GOTO 999 395 IERR = -1 CALL ESERRE(1,IERR,'BLCFAC', > 'BLOC, ENTETE INCOMPLET') GOTO 999 C --- FIN --- 999 CALL GESFIC('F',' ',0,0,IT,I) C 9999 END C C SUBROUTINE LICBRP(NOM,IVERSIO, > BLCXYZ,IVXYZ,IDIMC,NBN, > BLCARE,IVARE,NBARET,NBNOMX,NBFAMX, > BLCFAC,IVFAC,NBFACE,NBVOMX, > IERR) C ***************************************************************** C OBJET LICBRP : LECTURE DES ENTETES D'UN FICHIER BREP (FRONTIERE) C EN ENTREE : C NOM : DU FICHIER C EN SORTIE : LES BLOCS ET LEURS CARDINAUX C ***************************************************************** CHARACTER*(*) NOM INTEGER IVERSIO INTEGER BLCXYZ,IVXYZ,IDIMC,NBN INTEGER BLCARE,IVARE,NBARET,NBNOMX,NBFAMX INTEGER BLCFAC,IVFAC,NBFACE,NBVOMX INTEGER IERR C INTEGER INTMAX PARAMETER (INTMAX = 3) INTEGER INENTE(INTMAX) INTEGER NBLXYZ,NBLARE,NBLFAC C INTEGER BLCXYZ,BLCARE,BLCFAC C ====================================== CALL LICBLC(NOM,'XYZ','DEBXYZ','FINXYZ',2,'*', > BLCXYZ,IVXYZ,INENTE,NBLXYZ,IERR) IF( IERR.NE. 0 )GOTO 9999 IF( BLCXYZ.EQ. -1 )GOTO 9999 IF( BLCXYZ.EQ.1 )THEN NBN = INENTE(1) IDIMC = INENTE(2) ENDIF C ====================================== CALL LICBLC(NOM,'ARE','DEBARE','FINARE',3,'*', > BLCARE,IVARE,INENTE,NBLARE,IERR) IF( IERR.NE. 0 )GOTO 9999 IF( BLCARE.EQ. -1 )GOTO 9999 IF( BLCARE.EQ.1 )THEN NBARET = INENTE(1) NBNOMX = INENTE(2) NBFAMX = INENTE(3) ENDIF C ====================================== CALL LICBLC(NOM,'FAC','DEBFAC','FINFAC',2,'*', > BLCFAC,IVFAC,INENTE,NBLFAC,IERR) IF( IERR.NE. 0 )GOTO 9999 IF( BLCFAC.EQ. -1 )GOTO 9999 IF( BLCFAC.EQ.1 )THEN NBFACE = INENTE(1) NBVOMX = INENTE(2) ENDIF C ====================================== C VERIFIER LA COHERENCE ET LA SEMANTIQUE DES 3 BLOCS ! C IF(BLCXYZ.EQ.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'PAS DE BLOC DEBXYZ ?!!') GOTO 9999 ENDIF IF(NBN.LE.0)THEN C ---> IL FAUT AU MOINS UN POINT ! IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'BLOC DEBXYZ, PAS DE POINT, ?!!') GOTO 9999 ENDIF IF(IDIMC.LE.0)THEN C ---> IL FAUT AU MOINS UN POINT ! IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'BLOC DEBXYZ, DIM INCORECTE ?!!') GOTO 9999 ENDIF C IF(NBLXYZ.NE.NBN)THEN C ---> IL FAUT NBN COORDONNEES : LIGNES !!! C IERR = 0 C CALL ESERRE(1,IERR,'LICBRP', C > 'BLOC DEBXYZ, ATTENTION NBRE DE COORD != NBRE LIGNES !!') C PRINT *,'NBN = ',NBN,' NBLXYZ = ',NBLXYZ C ENDIF C ========================================= IF(BLCARE.EQ.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'PAS DE BLOC DEBARE ?!!') GOTO 9999 ENDIF IF(NBARET.LE.0)THEN C ---> IL FAUT AU MOINS UNE ARETE ! IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'BLOC DEBILM, IL N Y A PAS D ARETE!!') GOTO 9999 ENDIF C IF(NBLARE.NE.NBARET)THEN C ---> IL FAUT NBN COORDONNEES : LIGNES !!! C IERR = 0 C CALL ESERRE(1,IERR,'LICBRP', C > 'BLOC DEBARE, ATTENTION NBRE D ARETES != NBRE LIGNES !!') C PRINT *,'NBN = ',NBARET,' NBLARE = ',NBLARE C ENDIF C ========================================= IF(BLCFAC.EQ.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'PAS DE BLOC DEBFAC ?!!') GOTO 9999 ENDIF IF(NBFACE.LE.0) THEN C ---> IL FAUT AU MOINS UNE FACE ! IERR = -1 CALL ESERRE(1,IERR,'LICBRP', > 'BLOC DEBFAC, IL N Y A PAS DE FACE!!') GOTO 9999 ENDIF C IF(NBLFAC.NE.NBFACE)THEN C ---> IL FAUT NBN COORDONNEES : LIGNES !!! C IERR = 0 C CALL ESERRE(1,IERR,'LICBRP', C > 'BLOC DEBFAC, ATTENTION NBRE DE FACES != NBRE LIGNES !!') C PRINT *,'NBN = ',NBFACE,' NBLFAC = ',NBLFAC C ENDIF C ========================================= 9999 END C C C SUBROUTINE LICBLC(NOM,NOMBLC,DEBBLC,FINBLC,NBENTE,COMMEN, > BLCPRE,IVEBLC,INENTE,NBLC, > IERR) C ***************************************************************** C OBJET LICBLC : LECTURE DE L'ENTETE D'UN BLOC C EN ENTREE : C NOM : DU FICHIER C NOMBLC : NOM DU BLOC (3 CARACTERES) INUTILISE C DEBBLC : CHAINE MARQUANT LE DEBUT DU BLOC C FINBLC : CHAINE MARQUANT LA FIN DU BLOC C NBENTE : NOMBRE D'ENTIER A LIRE DANS L'ENTETE C COMMEN : CARACTERE DE COMMENTAIRE C INENTE : TABLEAU DES (NBENTE) ENTIERS DE L'ENTETE DU BLOC C C EN SORTIE : C BLCPRE : 1 = PRESENCE DU BLOC C 0 = ABSCENCE " " C -1 = ERREUR DANS L'ENTETE DU BLOC C IVEBLC : VERSION DU BLOC C INENTE : ENTIERS DE L'ENTETE DU BLOC C NBLC : NOMBRE DE LIGNES DU BLOC C C A FAIRE LICBLC : LIRE LA VERSION DU BLOC C ***************************************************************** CHARACTER*(*) NOM,NOMBLC,DEBBLC,FINBLC CHARACTER COMMEN INTEGER NBENTE INTEGER BLCPRE,IVEBLC,INENTE(*),NBLC INTEGER IERR C INTEGER I,IT,NB1,NB2,IN,IERR2 INTEGER ESLGCH EXTERNAL ESLGCH C IERR = 0 C ---- A FAIRE : IVEBLC = 1 C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,IERR2) IF(IERR.NE.0.OR.IERR2.NE.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LICBLC', > 'PB OUVERTURE FICHIER') GOTO 9999 ENDIF C ====================================== C CALL GESCOM(IN,'DEBFAC',6,'FINFAC',6,'*',IT,NBLC,IERR) C NB1 = ESLGCH(DEBBLC) NB2 = ESLGCH(FINBLC) C --- ON COPIE LE BLOC (SANS LES COMMENTAIRES) DE IN VERS IT --- REWIND IN REWIND IT CALL GESCOM(IN,DEBBLC,NB1,FINBLC,NB2,COMMEN,IT,NBLC,IERR) REWIND IT IF( IERR .NE. 0 )THEN C --- abscence du bloc IERR = 0 BLCPRE = 0 ELSE BLCPRE = 1 IF(NBENTE.GT.0)THEN READ(IT,*,ERR=190,END=190)(INENTE(I),I=1,NBENTE) ENDIF ENDIF GOTO 999 C 190 CONTINUE BLCPRE = -1 IERR = -1 CALL ESERRE(1,IERR,'LICBLC', > 'ENTETE INCORRECT DANS BLOC') GOTO 999 C ====================================== C --- FIN --- 999 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 9999 END C C C SUBROUTINE LITBRP(NOM,IVERSIO, > IDIMC,NBN,NBARET,NBFACE, > ISOMME,COORD,NBCOMX,NBNMAX, > IARETE,NBARMX,ITNOAR,NBNOMX,ITFAAR,NBFAAR,NBFAMX, > IFACES,NBFMAX,ITVOFA,NBVOFA,NBVOMX, > IERR) C ***************************************************************** C OBJET LITBRP : LECTURE D'UNE BREP (FRONTIERE) C EN ENTREE : C NOM : NOM DU FICHIER A OUVRIR, LIRE PUIS FERMER C IVERSIO: VERSION DU FICHIER A LIRE C EN SORTIE : C IERR=0 : PAS D'ERREUR C IERR=-1 : PROBLEME D'OUVERTURE DU FICHIER, DE FORMAT.... C IERR=-2 : L'UN DES TABLEAUX EST TROP PETIT C ---- LES DIMENSIONS DU MAILLAGE --- C SI ACTION = 0 C IDIMC : DIMENSION DE L'ESPACE (NB MAXI DE COORDONNEES/NOEUD) C NBN : NOMBRE TOTAL DES POINTS (NOEUDS) C IDE : DIMENSION MAXIMALE DE LA TOPOLOGIE DES ELEMENTS C NBNMAX : NOMBRE MAXIMAL DE NOEUDS PAR ELEMENT C NBE : NOMBRE D'ELEMENTS C NBRMAX : NOMBRE MAXIMAL DE REGIONS PAR ELEMENT C ATTENTION : C ON CONSIDERE QUE LE FICHIER ET SES ENTETES SONT CORRECTS ???? C C ***************************************************************** CHARACTER*(*) NOM INTEGER IVERSIO INTEGER IDIMC,NBN,NBARET,NBFACE INTEGER ISOMME(*) REAL COORD(*) INTEGER NBCOMX,NBNMAX INTEGER IARETE(*),NBARMX INTEGER ITNOAR(*),NBNOMX,ITFAAR(*),NBFAAR(*),NBFAMX INTEGER IFACES(*),NBFMAX,ITVOFA(*),NBVOFA(*),NBVOMX INTEGER IERR C INTEGER IN,IT,NBLC,I,J INTEGER IC INTEGER IDIMCL,NBNL INTEGER INDICE,NBAREL,NBNAL INTEGER NBNNOI,NBNFAI,NBVOL,NBFAL,NBNVOL C INTEGER NBVERS PARAMETER (NBVERS=3) INTEGER IVERS(NBVERS) INTEGER IACTIO C IACTIO = 0 GOTO (10,20) IVERSIO IERR = -1 CALL ESERRE(1,IERR,'ECRBRP',' ATTENTION VERSION INCONNUE') GOTO 9999 10 CONTINUE IVERS(1)= 1 IVERS(2)= 1 IVERS(3)= 1 GOTO 100 20 CONTINUE IVERS(1)= 2 IVERS(2)= 2 IVERS(3)= 2 GOTO 100 100 CONTINUE C CALL GESFIC('O',NOM,1,0,IN,IERR) CALL GESFIC('O',' ',2,0,IT,I) IF(IERR.NE.0.OR.I.NE.0) GOTO 80 C ====================================== C --- 1. LECTURE DES COORDONNEES DES POINTS --- C ====================================== REWIND IN REWIND IT CALL GESCOM(IN,'DEBXYZ',6,'FINXYZ',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBXYZ, PAS TROUVE') GOTO 999 ENDIF REWIND IT READ(IT,*,ERR=390,END=395) NBNL,IDIMCL C --- ON PEUT LIRE SEULEMENT QUELQUES POINTS : NBNMAX < NBNL C --- ON PEUT LIRE SEULEMENT QUELQUES COORDONNEES : NBCOMX < IDIMCL C OU CHARGER DANS UN TABLEAU DE DIMENSION SUPERIEURE : IDIMCL < NBCOMX IF(NBN.GT.NBNL)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'NOMBRE DE COORDONNEES INSUFFISANT DS FICHIER !') GOTO 999 ENDIF IF((NBCOMX.LT.IDIMCL).OR.(NBNMAX.LT.NBNL))THEN IERR = 0 CALL ESERRE(1,IERR,'LITBRP', > 'ATTENTION LECTURE PARTIELLE BLOC XYZ !') ENDIF IDIMC = MIN(IDIMC,IDIMCL) NBN = MIN(NBNMAX,NBNL) DO 130 I=1,NBN CALL ESCOOR(IACTIO,IT,IVERS(1), > ISOMME(I),COORD((I-1)*NBCOMX+1),NBCOMX,IDIMC, > IERR) IF(IERR.NE.0)GOTO 999 130 CONTINUE C ====================================== C --- 2. LECTURE DES ARETES --- C ====================================== 200 CONTINUE REWIND IN REWIND IT CALL GESCOM(IN,'DEBARE',6,'FINARE',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBARE, PAS TROUVE') GOTO 999 ENDIF REWIND IT READ(IT,*,ERR=390,END=395) NBAREL,NBNAL,NBFAL C --------------------- C ---- VERIFICATION MEMOIRE ---- C --------------------- IF(NBARET.LT.NBAREL)THEN IERR = 0 CALL ESERRE(1,IERR,'LITBRP', > 'ATTENTION LECTURE PARTIELLE BLOC ARE !') ENDIF IF(NBARET.GT.NBARMX)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBARE, IL Y TROP D ARETE') GOTO 999 ENDIF IF(NBNAL.GT.NBNOMX)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBARE, IL N Y TROP DE SOMMET PAR ARETE') GOTO 999 ENDIF IF(NBFAL.GT.NBFAMX)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBARE, IL N Y TROP DE FACES PAR ARETE') GOTO 999 ENDIF C --------------------- C ---- LECTURE ELEMENTS ---- C --------------------- DO 280 I=1,NBARET CALL ESARET(IACTIO,IT,IVERS(2), > IARETE(I),ITNOAR((I-1)*NBNOMX+1),NBNOMX, > ITFAAR((I-1)*NBFAMX+1),NBFAAR(I),NBFAMX, > IERR) IF(IERR.NE.0)GOTO 999 280 CONTINUE C C ====================================== C --- 3. LECTURE DES FACES --- C ====================================== C 300 CONTINUE C --------------------- C ---- LECTURE ENTETE ---- C --------------------- REWIND IN REWIND IT CALL GESCOM(IN,'DEBFAC',6,'FINFAC',6,'*',IT,NBLC,IERR) IF(IERR.NE.0)THEN IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBFAC, PAS TROUVE') GOTO 999 ENDIF REWIND IT READ(IT,*,ERR=390,END=395) NBFAL,NBVOL C --------------------- C ---- VERIFICATION MEMOIRE ---- C --------------------- IF(NBFAL.GT.NBFMAX)THEN IERR = -2 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBILM, IL N Y TROP DE FACES') GOTO 999 ENDIF IF(NBVOL.GT.NBVOMX)THEN IERR = -2 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC DEBILM, IL N Y TROP DE VOLUMES PAR FACE') GOTO 999 ENDIF IF(NBFAL.GT.NBFACE)THEN IERR = 0 CALL ESERRE(1,IERR,'LITBRP', > 'ATTENTION LECTURE PARTIELLE BLOC FAC !') ENDIF C --------------------- C ---- LECTURE ELEMENTS ---- C --------------------- NBFAL = MIN(NBFAL,NBFACE) DO 380 I=1,NBFAL CALL ESFACE(IACTIO,IT,IVERS(3), > IFACES(I),ITVOFA((I-1)*NBVOMX+1),NBVOFA(I),NBVOMX, > IERR) IF(IERR.NE.0)GOTO 999 380 CONTINUE GOTO 999 C ----------------------------- C ---- GESTION DES ERREURS DES BLOCS ---- C ----------------------------- 390 IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC, ERREUR LECTURE ENTETE') GOTO 999 395 IERR = -1 CALL ESERRE(1,IERR,'LITBRP', > 'BLOC, ENTETE INCOMPLET') GOTO 999 C -------------------------------------------------------- 900 CONTINUE GOTO 999 C --- TRAITEMENT DES ERREURS --- 80 CONTINUE IERR=-1 GOTO 999 90 CONTINUE IERR=-2 GOTO 999 C --- FIN --- 999 CALL GESFIC('F',' ',0,0,IN,I) CALL GESFIC('F',' ',0,0,IT,I) 9999 END C C ***************************************************************** C MODULE : ES (ENTREES SORTIES) C FICHIER : ES_PROG.F C OBJET : GERENT LES ES DES PROGRAMMES PRINCIPAUX C FONCT. : C C OBJET ESVNOM : VERIFIE QUE LA CHAINE EST UN NOM C OBJET ESAMOT : ANALYSE UN MOT C OBJET ESGARG : LIT LES ARGUMENTS DES PROGRAMMES -> CHAINE C OBJET ESGARG : LIT LES ENTREES DE L'UTILISATEUR -> CHAINE C OBJET ESCONV : CONVERTI UNE CHAINE EN ENTIER, REELS... C OBJET ESFORM : FIXE LE FORMAT D'UN ARGUMENT D'UN PROGRAMME C OBJET ESPMOD : DETERMINE LE MODE D'UN PROGRAMME C OBJET ESEPRG : AFFICHE LES INFORMATIONS D'UN PROGRAMME C OBJET ESAARG : ANALYSE LES ARGUMENTS D'UN PROGRAMME C C LIMITATION ESVNOM : NOM LIMITE A 32 CARACTERES C LIMITATION ESCONV : DESCRIPTION DE FORMAT LIMITE A 16 CARACTERES C LIMITATION ESFORM : DESCRIPTION DE FORMAT LIMITE A 16 CARACTERES C LIMITATION ESPMOD : 256 CARACTERES POUR LE 1ER PARAMETRE (S/V) C LIMITATION ESSPRG : VERSION 5 CARACTERES, DATE 30 CARACTERES C LIMITATION ESPLEX : 16 CARACTERES POUR LA DEFINITION DU FORMAT C LIMITATION ESPROG : 50 ARGUMENTS, CHAINE DE 256 CARACTERES C C REMARQUES : C 2 modes de fonctionnement possible pour un programme : C *le mode ligne de commande: seuls les parametres obligatoires sont demandes C il est donc utile de les repousser a la fin, '-' represente la valeur par C defaut un premier parametre v,s,h,d permet d'acceder a plusieurs types C d'affichage v=verbose, s=silence, h=help (l'aide en ligne), d=debug C *le mode interactif: les questions sont posees a l'utilisateur C pour avoir une valeur par defaut il suffit de faire un "enter", C cela devient un "blanc" : ' ' pour la suite du traitement. C C AUTEUR : O.STAB C DATE : 06.98 C MODIFICATIONS : C AUTEUR, DATE, OBJET : o.stab, 18.10.2001, correction ESVNOM C AUTEUR, DATE, OBJET : o.stab, 28.08.2002, bug ESCONV pour les reels C AUTEUR, DATE, OBJET : o.stab, 28.10.2004, ajout mode debug (2) modif ESPMOD C AUTEUR, DATE, OBJET : o.stab, 05.01.2005, modif ESAMOT (longueur des mots) et C une commande incomplete ne bascule plus sur le dialogue C AUTEUR, DATE, OBJET : o.stab, 14.09.2006, ajout appel ESMESS !! C AUTEUR, DATE, OBJET : o.stab, 21.07.2007, appel IARGC n'est plus declare (pour gfortran) C ***************************************************************** FUNCTION ESVNOM(NOM,LNOM) C ***************************************************************** C OBJET ESVNOM : VERIFIE QUE LA CHAINE EST UN NOM C LIMITATION ESVNOM : NOM LIMITE A 32 CARACTERES C ***************************************************************** INTEGER ESVNOM CHARACTER*(*) NOM INTEGER LNOM C CONSTANTE LNOMAX : LONGUEUR MAXIMUM D'UN NOM- PARAMETER (LNOMAX = 32) INTEGER LNOMAX PARAMETER (LNOMAX = 32) INTEGER I C LNOM = LEN(NOM) DO 10 I=1,LNOM IF(((NOM(I:I).GT.'Z' ).OR.(NOM(I:I).LT.'a')).AND. > ((NOM(I:I).GT.'9' ).OR.(NOM(I:I).LT.'0'))) GOTO 20 10 CONTINUE C ---- c'est un nom ---- ESVNOM = 1 GOTO 9999 20 CONTINUE C ---- ce n'est pas un nom ---- LNOM = I ESVNOM = 0 IF( LNOM.GT.LNOMAX )ESVNOM = -1 9999 END C C SUBROUTINE ESAMOT(MOT,LMOT,MOTS,LMOTS,NBMOTS,ICODE,IRESUL) C ***************************************************************** C OBJET ESAMOT : RENVOI LE CODE CORRESPONDANT A "MOT", -1 SI INCONNU C ***************************************************************** CHARACTER*(*) MOT INTEGER LMOT,NBMOTS CHARACTER*(*) MOTS(NBMOTS) INTEGER LMOTS,ICODE(NBMOTS) INTEGER IRESUL C INTEGER I,J,LMOTC C IRESUL = -1 CALL MAJUSC(LMOT,MOT) DO 10 I=1,NBMOTS LMOTC = 0 DO 5 J=1,LMOTS IF(MOTS(I)(J:J).EQ.' ')GOTO 7 LMOTC = LMOTC+1 5 CONTINUE 7 CONTINUE C PRINT *,'LMOT=',LMOT,', LMOTC(',I,')= ',LMOTC IF( MOT(:LMOT).EQ.MOTS(I)(:LMOTC) )GOTO 20 10 CONTINUE GOTO 9999 20 IRESUL = ICODE(I) 9999 END C C SUBROUTINE ESGARG(CHAINE,PTCHAI,NCARMX, > IARGUM,LARGUM,NARGUM,NARGMX,IERR) C *************************************************************** C OBJET ESGARG : LIT LES ARGUMENTS DES PROGRAMMES -> CHAINE C C EN ENTREE : C NCARMX : NOMBRE MAXIMUM DE CARACTERES (TAILLE DE CHAINE) C NARGMX : NOMBRE MAXIMUM D'ARGUMENTS A LIRE C C EN SORTIE : C CHAINE : LA CHAINE DE CARACTERES CONTENANT LES ENTREES C IARGUM : IARGUM(I) = INDICE DU IEME ARGUMENT DANS CHAINE C LARGUM : LARGUM(I) = LONGUEUR " " " " " C NARGUM : NOMBRE D'ARGUMENTS LUS C IERR : CODE D'ERREUR C -1 SI TROP D'ENTREES NARGLU > NARGMX C -2 SI UNE ENTREE CONTIENT TROP DE CARACTERE > NCARMX C *************************************************************** CHARACTER*(*) CHAINE INTEGER PTCHAI,NCARMX,IARGUM(*),LARGUM(*),NARGUM INTEGER NARGMX, IERR C ------------------------------------------------------------------- INTEGER ESLGCH,I,J,NBALIR C INTEGER*4 NBARG,IARGC INTEGER*4 NBARG C EXTERNAL IARGC,ESLGCH EXTERNAL ESLGCH C CHARACTER*256 MESSAG IERR = 0 C#ifdef GFORTRAN222 NBARG = IARGC() C MODIF 21.07.2008 OS, depuis fortran 2003 : C#ESLE C NBARG = COMMAND_ARGUMENT_COUNT() C#ENDIF NBALIR = NBARG - 1 IF(NARGUM.GT.NARGMX)THEN IERR = -1 CALL ESMESS(IERR,33,1,'TROP DE PARAMETRES',MESSAG) CALL ESEINT(1,MESSAG,NARGMX,1) GOTO 9999 ENDIF J = PTCHAI DO 50 I=1,NBALIR IF( J+32.GT.NCARMX )THEN IERR = -2 CALL ESMESS(IERR,34,1,'TROP DE CARACTERES',MESSAG) CALL ESEINT(1,MESSAG,NCARMX,1) GOTO 9999 ENDIF NARGUM = NARGUM + 1 IARGUM(NARGUM) = J C GETARG DEVRAIT ETRE UN TYPE IO DE ESLCHA(IO,...) CALL GETARG(I+1,CHAINE(J:)) C MODIF 21.07.2008 OS, depuis fortran 2003 : C CALL GET_COMMAND_ARGUMENT(I+1,CHAINE(J:)) LARGUM(NARGUM) = ESLGCH(CHAINE(J:)) C --- ABSENCE DE PARAMETRE EN BATCH : '-' --- IF((LARGUM(NARGUM).EQ.1).AND.(CHAINE(J:J).EQ.'-')) > LARGUM(NARGUM) = 0 J = J + LARGUM(NARGUM) CHAINE(J:J) = ' ' J = J + 1 50 CONTINUE PTCHAI = J 9999 END C C SUBROUTINE ESLARG(MESSAG,CHAINE,PTCHAI,NCARMX, > IARGUM,LARGUM,NARGUM,NARGMX,IERR) C *************************************************************** C OBJET ESGARG : LIT LES ENTREES DE L'UTILISATEUR -> CHAINE C C EN ENTREE : C NCARMX : NOMBRE MAXIMUM DE CARACTERES (TAILLE DE CHAINE) C NARGMX : NOMBRE MAXIMUM D'ARGUMENTS A LIRE C C EN SORTIE : C CHAINE : LA CHAINE DE CARACTERES CONTENANT LES ENTREES C IARGUM : IARGUM(I) = INDICE DU IEME ARGUMENT DANS CHAINE C LARGUM : LARGUM(I) = LONGUEUR " " " " " C NARGUM : NOMBRE D'ARGUMENTS LUS C IERR : CODE D'ERREUR -1 SI TROP D'ENTREES NARGLU > NARGMX C *************************************************************** CHARACTER*(*) MESSAG(*),CHAINE INTEGER PTCHAI,NCARMX,IARGUM(*),LARGUM(*),NARGUM INTEGER NARGMX, IERR C ------------------------------------------------------------------- INTEGER ESLGCH,I,J,NBALIR EXTERNAL ESLGCH C IERR = 0 J = PTCHAI NBALIR = NARGMX-NARGUM DO 50 I=1,NBALIR IF( J+32.GT.NCARMX )THEN IERR = -2 CALL ESMESS(IERR,34,1,'TROP DE CARACTERES',MESSAG) CALL ESEINT(1,MESSAG,NCARMX,1) GOTO 9999 ENDIF NARGUM = NARGUM+1 IARGUM(NARGUM) = J CALL ESLCHA(1,MESSAG(NARGUM),CHAINE(J:)) LARGUM(NARGUM) = ESLGCH(CHAINE(J:)) J = J + LARGUM(NARGUM) CHAINE(J:J) = ' ' J = J + 1 50 CONTINUE PTCHAI = J C 9999 END C C SUBROUTINE ESCONV(REP,LREP,ITYPE,IFORMA, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > IARGUM,PRESEN,IERR) C *************************************************************** C OBJET ESCONV : CONVERTI UNE CHAINE EN ENTIER, REELS... C C EN ENTREE : C REP : LA CHAINE EN ENTREE C ITYPE : ITYPE(I) = TYPE DU IEME ARGUMENT C 1 CHAINE DE CARACTERE, 2 ENTIER, 3 REEL C IFORMA : IFORMAT(I) = FORMAT DU IEME ARGUMENT C PAR EXEMPLE 'I10' OU '*' POUR UN ENTIER... C ATTENTION LIMITE A 16 CARACTERES C NARGMX : NOMBRE MAXIMUM D'ARGUMENTS A LIRE C C EN SORTIE : C NBCHAR : NOMBRE DE CHAINE DANS CHARTB C NBINTE : NOMBRE D'ENTIERS DANS INTETB C NBREAL : NOMBRE DE REELS DANS REALTB C IARGUM : IARGUM(I) = ADRESSE DU IEME ARGUMENT DANS LE TABLEAU CORRESPONDANT C NARGLU : NOMBRE D'ARGUMENT LU C IERR : CODE D'ERREUR -1 SI LE NOMBRE OU LE FORMAT DES C ENTREES EST INCORRECT. C LIMITATION ESCONV : DESCRIPTION DE FORMAT LIMITE A 16 CARACTERES C *************************************************************** CHARACTER*(*) REP INTEGER LREP,ITYPE CHARACTER*16 IFORMA INTEGER INTETB(*),NBINTE,NBREAL,NBCHAR REAL REALTB(*) CHARACTER*(*) CHARTB(*) INTEGER PRESEN,IARGUM,IERR C ------------------------------------------------------------------- CHARACTER*(1) CHVIDE,CHFIN INTEGER ENTDEF,NBC REAL REEDEF PARAMETER (CHFIN = ' ',CHVIDE = ' ') PARAMETER (ENTDEF = 0, REEDEF = 0.0) INTEGER IOS C IERR = 0 C IF( LREP.LE.0 )THEN C IARGUM = -1 C GOTO 9999 C ENDIF C A FAIRE : AVANT DE FAIRE LE READ ON PEUT VERIFIER LES REELS ET LES ENTIERS GOTO (10,20,30) ITYPE IERR = -1 GOTO 9999 C --- UNE CHAINE -- 10 CONTINUE NBCHAR = NBCHAR+1 IARGUM = NBCHAR C READ (REP(:LREP),FMT = IFORMA,IOSTAT = IOS,ERR=100,END=100) IF( LREP.LE.0 )THEN CHARTB(NBCHAR) = CHVIDE PRESEN = -1 ELSE C READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT=IOS, C > ERR=100,END=100) CHARTB(NBCHAR) C READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT=IOS, C > ERR=100,END=100) CHARTB(NBCHAR)(:LREP) C C ICI LA DESTINATION PEUT ETRE PLUS GRANDE QUE LA SOURCE C WARNING SUR IBM PAR EXEMPLE ! IF(LREP.LT.100)WRITE (IFORMA,'(A2,I2,A1)') '(A',LREP,')' IF(LREP.LT.10)WRITE (IFORMA,'(A2,I1,A1)') '(A',LREP,')' READ (UNIT=REP,FMT=IFORMA,IOSTAT=IOS, > ERR=100,END=100) CHARTB(NBCHAR) C CHARTB(NBCHAR)(:LREP+1) = CHFIN PRESEN = 1 ENDIF GOTO 9999 C --- UN ENTIER -- 20 CONTINUE IF(LREP.LT.100)WRITE (IFORMA,'(A2,I2,A1)') '(I',LREP,')' IF(LREP.LT.10)WRITE (IFORMA,'(A2,I1,A1)') '(I',LREP,')' NBINTE = NBINTE+1 IARGUM = NBINTE C READ (REP(:LREP),FMT = IFORMA,IOSTAT = IOS,ERR=100,END=100) IF( LREP.LE.0 )THEN INTETB(NBINTE) = ENTDEF PRESEN = -1 ELSE C READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT = IOS, READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT = IOS, > ERR=100,END=100) INTETB(NBINTE) PRESEN = 1 ENDIF GOTO 9999 C --- UN REEL -- 30 CONTINUE NBC = LREP + 3 C IF(LREP.LT.100)WRITE (IFORMA,'(A2,I2,A3)') '(F',LREP,'.2)' C IF(LREP.LT.10)WRITE (IFORMA,'(A2,I1,A3)') '(F',LREP,'.2)' C WRITE (IFORMA,'(A1)') '*' NBREAL = NBREAL+1 IARGUM = NBREAL C READ (REP(:LREP),FMT = IFORMA,IOSTAT = IOS,ERR=100,END=100) IF( LREP.LE.0 )THEN C REALTB(NBINTE) = REEDEF .... bug 27.08.2002 REALTB(NBREAL) = REEDEF PRESEN = -1 ELSE C READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT = IOS, READ (REP(:LREP),*, C READ (UNIT=REP(:LREP),FMT=IFORMA,IOSTAT = IOS, > ERR=100,END=100) REALTB(NBREAL) PRESEN = 1 ENDIF GOTO 9999 C 100 CONTINUE C --- TOUT EST OK --- IF( IOS.EQ. 0 )GOTO 9999 C --- FIN DE FICHIER --- IF( IOS.LT. 0 )GOTO 9999 C --- IOS > 0 UNE ERREUR --- C PRINT *,'ERREUR ESCONV ?? IOS EST POSITIF = ',IOS CALL ESERRE(1,IERR,'ESCONV','?? IOS EST POSITIF ') C IERR = -1 9999 END SUBROUTINE ESFORM(ITYPEL,ITYPEP,IFORMA,IERR) C *************************************************************** C OBJET ESFORM : FIXE LE FORMAT D'UN ARGUMENT D'UN PROGRAMME C ON A LES TYPES SUIVANT : C 1 FD : LES NOMS DES FICHIERS DE DONNEES (VARIABLES) C 2 FR : LES NOMS DES FICHIERS DE RESULTAT C 3 VR : LES VALEURS NUMERIQUES REELLES (CONSTANTES) C 4 VE : LES VALEURS NUMERIQUES ENTIERES C 5 MC : LES MOTS CLES (TOKEN) C 6 = LE NOM D'UN FICHIER DE RESULTAT (ECRASABLE) C 7 = LE NOM D'UN FICHIER DE RESULTAT (CONCATENATION) C LIMITATION ESFORM : DESCRIPTION DE FORMAT LIMITE A 16 CARACTERES C *************************************************************** INTEGER ITYPEL INTEGER ITYPEP CHARACTER*16 IFORMA INTEGER IERR C IERR = 0 GOTO (10,10,20,30,10,10,10) ITYPEL IERR = -1 GOTO 9999 C --- FICHIER ET MOTCLE --- 10 CONTINUE IFORMA = '(A)' ITYPEP = 1 GOTO 9999 C --- CONSTANTES ENTIERES --- 20 CONTINUE IFORMA = '(I10)' ITYPEP = 2 GOTO 9999 C --- CONSTANTES REELLES --- 30 CONTINUE IFORMA = '(F10.2)' ITYPEP = 3 GOTO 9999 9999 END C SUBROUTINE ESPMOD(ITRACE,IHELP) C *************************************************************** C OBJET ESPMOD : DETERMINE LE MODE D'UN PROGRAMME (S. OU VERBOSE) C LIMITATION ESPMOD : 256 CARACTERES POUR LE 1ER PARAMETRE (S/V) C SORTIE : C ITRACE : mode d'affichage des messages C 0 mode silence FLAG="S" C 1 mode verbose FLAG="V","H" (par defaut) C 2 mode verbose FLAG="D" C C IHELP : affichage de l'aide C 0 mode silence FLAG="S","V","D" (par defaut) C 1 mode silence FLAG="H" C *************************************************************** INTEGER ITRACE,IHELP C CHARACTER*256 REP C INTEGER*4 NBARG,IARGC INTEGER*4 NBARG C EXTERNAL IARGC C IHELP = 0 NBARG = IARGC() C MODIF 21.07.2008 OS, depuis fortran 2003 : C NBARG = COMMAND_ARGUMENT_COUNT() IF( NBARG.LT.1 )THEN ITRACE = 1 GOTO 9999 ENDIF C MODIF 21.07.2008 OS, depuis fortran 2003 : C CALL GET_COMMAND_ARGUMENT(1,REP) CALL GETARG(1,REP) ITRACE = 1 C --- ON POURRAIT FAIRE APPEL A ESAMOT !!! IF((REP(1:1).EQ.'S' ).OR.( REP(1:1).EQ.'s' ))ITRACE = 0 IF((REP(1:1).EQ.'D' ).OR.( REP(1:1).EQ.'d' ))ITRACE = 2 IF((REP(1:1).EQ.'H' ).OR.( REP(1:1).EQ.'h' ))THEN IHELP = 1 GOTO 9999 ENDIF CALL ESINIT(ITRACE) 9999 END C SUBROUTINE ESEPRG(IO,NOMPRG,RELEAS,COPYRI,DATE,CONTAC) C *************************************************************** C OBJET ESEPRG : AFFICHE LES INFORMATIONS D'UN PROGRAMME C LIMITATION ESSPRG : VERSION 5 CARACTERES, DATE 30 CARACTERES C *************************************************************** INTEGER IO CHARACTER*(*) NOMPRG REAL RELEAS CHARACTER*(*) COPYRI INTEGER DATE CHARACTER*(*) CONTAC C CHARACTER*5 VERSIO CHARACTER*30 CDATE INTEGER ANNEE,MOIS,JOUR CHARACTER*256 MESSAG C IF( RELEAS.GT. 0 )THEN WRITE (VERSIO,FMT = '(F5.2)') RELEAS CALL ESECHA(IO,NOMPRG,VERSIO) ELSE CALL ESECHA(IO,NOMPRG,' ') ENDIF C CALL ESEREA(IO,NOMPRG,RELEAS,1) IF( DATE.GT.0 )THEN ANNEE = DATE / 10000 MOIS = ( DATE - ANNEE*10000 ) /100 JOUR = DATE - ANNEE*10000 - MOIS*100 C CALL ESEINT(IO,'DATE :',DATE,1) WRITE (CDATE,FMT ='(I3,I3,I5)')JOUR,MOIS,ANNEE CALL ESMESS(101,8,1,'DATE',MESSAG) CALL ESECHA(IO,MESSAG,CDATE) ENDIF CALL ESMESS(101,9,1,'CONTACT : ',MESSAG) IF( CONTAC(1:1).NE.' ')CALL ESECHA(IO,MESSAG,CONTAC) 9999 END C SUBROUTINE ESPLEX(CHAINE, > IARGUM,LARGUM,NARGUM, > ITYPEL,IOPTIO,MESSAG, > MOTS,LMOTS,NBMOTS,ICODES, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > PRESEN,ITRACE,IERR) C *************************************************************** C OBJET ESPLEX : ANALYSE LES ARGUMENTS D'UN PROGRAMME C C RECONNAIT L'ABSENCE D'ARGUMENTS (MET IARGUM A -1) C ANALYSE LES MOTS CLE ET LES REMPLACE PAR LEUR CODE C C EN ENTREE : C ---- DESCRIPTION DE LA SIGNATURE DU PROGRAMME ---- C IOPTIO(I) : L'ENTREE I EST OPTIONNELLE (0) OU NECESSAIRE (1) C ITYPEL(I) : TYPE LOGIQUE DE L'ENTREE I C ON A LES TYPES SUIVANT : C 1 FD : LES NOMS DES FICHIERS DE DONNEES (VARIABLES) C 2 FR : LES NOMS DES FICHIERS DE RESULTAT C 3 VR : LES VALEURS NUMERIQUES REELLES (CONSTANTES) C 4 VE : LES VALEURS NUMERIQUES ENTIERES C 5 MC : LES MOTS CLES (TOKEN) C 6 = LE NOM D'UN FICHIER DE RESULTAT (ECRASABLE) C 7 = LE NOM D'UN FICHIER DE RESULTAT (CONCATENATION) C MESSAG(I) : MESSAGE DECRIVANT L'ENTREE I C SERT A L'INVITATION ET AU MESSAGE D'ERREUR C C ---- DICTIONNAIRE POUR LA RECONNAISSANCE DES MOTCLES ---- C LMOTS : NOMBRE DE CARACTERE DU MOTCLE I C NBMOTS: NOMBRE DE MOTCLE C MOTS(I) : CHAINE CORRESPONDANT AU MOTCLE I C ICODE(I) : CODE CORRESPONDANT AU MOTCLE I C C EN SORTIE : C IARGNUM(I) : C C LIMITATION ESPLEX : 16 CARACTERES POUR LA DEFINITION DU FORMAT C REMARQUE : COMMENT MODIFIER LE PROGRAMME POUR UN ANALYSE EN LIGNE ? C *************************************************************** CHARACTER*(*) CHAINE INTEGER IARGUM(*),LARGUM(*),NARGUM INTEGER ITYPEL(*),IOPTIO(*) CHARACTER*(*) MESSAG(*) CHARACTER*(*) MOTS(*) INTEGER NBMOTS,LMOTS,ICODES(*) INTEGER NBCHAR,NBINTE,NBREAL CHARACTER*(*) CHARTB(*) INTEGER INTETB(*) REAL REALTB(*) INTEGER PRESEN(*),ITRACE,IERR C INTEGER ITYPEP,I,J CHARACTER*16 IFORMA CHARACTER*256 MESSA2 C IERR = 0 NBCHAR = 0 NBINTE = 0 NBREAL = 0 C IF(NARGUM.GT.NARGMX)THEN C IERR = -2 C CALL ESERRE(1,IERR,'ESPLEX','TROP DE PARAMETRES') C GOTO 9999 C ENDIF DO 10 I=1,NARGUM C --- C'EST DEJA FAIT DANS ESCONV C IF( LARGUM(I) .LE. 0 )THEN C IARGUM(I) = -1 C GOTO 10 C ENDIF C CALL ESFORM(ITYPEL(I),ITYPEP,IFORMA,IERR) IF( IERR.NE. 0 )THEN CALL ESERRE(1,IERR,'ESPLEX','APPEL ESFORM') GOTO 9999 ENDIF J = IARGUM(I) IF( ITYPEL(I).NE.5 )THEN C --- ANALYSE D'UNE CONSTANTE OU VARIABLE --- CALL ESCONV(CHAINE(J:),LARGUM(I),ITYPEP,IFORMA, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > IARGUM(I),PRESEN(I),IERR) C PRINT *,' CHARTB(',I,') = ',CHARTB(I) IF( IERR.NE. 0 )THEN CALL ESERRE(1,IERR,'ESPLEX','APPEL ESCONV') GOTO 9999 ENDIF ELSE C --- ANALYSE D'UN MOT CLE (TOKEN) --- NBINTE = NBINTE+1 CALL ESAMOT(CHAINE(J:),LARGUM(I),MOTS,LMOTS,NBMOTS,ICODES, > INTETB(NBINTE)) IARGUM(I) = NBINTE IF( INTETB(NBINTE).EQ.-1)THEN PRESEN(I) = -1 ELSE PRESEN(I) = 1 ENDIF ENDIF 10 CONTINUE C --- VERIFICATION DES PARAMETRES OPTIONNELS --- DO 20 I=1,NARGUM IF((IOPTIO(I).EQ.1 ).AND.(PRESEN(I).EQ.-1))THEN IERR = -1 CALL ESMESS(IERR,35,1,'PARAMETRE MANQUANT',MESSA2) CALL ESECHA(1,MESSA2,MESSAG(I)) GOTO 9999 ENDIF 20 CONTINUE C 9999 END C SUBROUTINE ESPEXF(NOMVAR,ITYPEL,MESSAG,ITRACE,IERR) C *************************************************************** C OBJET ESPEXF : VERIFIE L'EXISTANCE D'UN OBJET (FICHIER) C (LA DECLARATION D'UNE VARIABLE) C EN ENTREE : C ITYPEL(I) : TYPE LOGIQUE DE L'ENTREE I C 1 = LE NOM D'UN FICHIER DE DONNEES C 2 = LE NOM D'UN FICHIER DE RESULTAT (NON ECRASABLE) C 3 = UNE VALEUR ENTIERE C 4 = UNE VALEUR REELLE C 5 = UN MOT CLES C 6 = LE NOM D'UN FICHIER DE RESULTAT (ECRASABLE) C 7 = LE NOM D'UN FICHIER DE RESULTAT (CONCATENATION) C C EN SORTIE : C REMARQUE : CETTE FONCTION POURRAIT TESTER L'EXISTANCE D'UN C OBJET DANS UNE BASE DE DONNEE... C ITYPEL=6 : pas de test le fichier peut exister ou non ! C *************************************************************** CHARACTER*(*) NOMVAR INTEGER ITYPEL CHARACTER*(*) MESSAG INTEGER ITRACE,IERR C -------------- POUR LA GESTION DE FICHIER ------------------------- INTEGER NEW,IOLDFI,NEWECR,IFORFI,IUNFFI PARAMETER (NEW =0,IOLDFI=1,NEWECR=3,IFORFI=0,IUNFFI=1) INTEGER FITEST EXTERNAL FITEST CHARACTER*256 MESSA2 C ------------------------------------------------------------------- IERR = 0 GOTO (100,200,500,500,500,500,100) ITYPEL IERR = -1 CALL ESERRE(1,IERR,' ','TYPE D ENTREE INCONNU') GOTO 9999 C ------------------ C ---- FICHIER DE DONNEES --- C ------------------ 100 CONTINUE IF( FITEST(NOMVAR,IOLDFI,IFORFI).NE.0 )THEN IERR = -1 CALL ESMESS(IERR,24,1,'IMPOSSIBLE D OUVRIR FICH',MESSA2) CALL ESECHA(1,MESSA2,NOMVAR) GOTO 9999 ENDIF GOTO 500 C ------------------ C ---- FICHIER DE RESULTAT --- C ------------------ 200 CONTINUE IF( FITEST(NOMVAR,NEW,IFORFI).NE.0 )THEN IERR = -1 CALL ESMESS(IERR,23,1,' LE FICHIER EXISTE DEJA',MESSA2) CALL ESECHA(1,MESSA2,NOMVAR) GOTO 9999 ENDIF GOTO 500 500 CONTINUE 9999 END C C SUBROUTINE ESPROG(ITYPEL,IOPTIO,MESSAG, > MOTS,LMOTS,NBMOTS,ICODES, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > IARGUM,NARGAL,PRESEN,ITRACE,IERR) C *************************************************************** C OBJET ESPROG : ANALYSE LES ARGUMENTS D'UN PROGRAMME C C RECONNAIT L'ABSENCE D'ARGUMENTS (MET IARGUM A -1) C ANALYSE LES MOTS CLE ET LES REMPLACE PAR LEUR CODE C C EN ENTREE : C ---- DESCRIPTION DE LA SIGNATURE DU PROGRAMME ---- C ITYPEL(I) : TYPE LOGIQUE DE L'ENTREE I C ON A LES TYPES SUIVANT : C 1 FD : LES NOMS DES FICHIERS DE DONNEES (VARIABLES) C 2 FR : LES NOMS DES FICHIERS DE RESULTAT C 3 VR : LES VALEURS NUMERIQUES REELLES (CONSTANTES) C 4 VE : LES VALEURS NUMERIQUES ENTIERES C 5 MC : LES MOTS CLES (TOKEN) C 6 : LE NOM D'UN FICHIER DE RESULTAT (ECRASABLE) C 7 : LE NOM D'UN FICHIER DE RESULTAT (CONCATENATION) C IOPTIO(I) : L'ENTREE I EST OPTIONNELLE (0) OU NECESSAIRE (1) C MESSAG(I) : MESSAGE DECRIVANT L'ENTREE I C SERT A L'INVITATION ET AU MESSAGE D'ERREUR C C ---- DICTIONNAIRE POUR LA RECONNAISSANCE DES MOTCLES ---- C LMOTS : NOMBRE DE CARACTERE DU MOTCLE I C NBMOTS: NOMBRE DE MOTCLE C MOTS(I) : CHAINE CORRESPONDANT AU MOTCLE I C ICODE(I) : CODE CORRESPONDANT AU MOTCLE I C C EN SORTIE : les arguments sont ranges dans un tableau correspondant C a leur type C IARGUM(I) donne l'indice de l'argument I dans le tableau ad hoc C CHARTB,NBCHAR : tableau des mots lus et nombre C INTETB,NBINTE : tableau des entiers lus et nombre C REALTB,NBREAL : tableau des reels lus et nombre C PRESEN(I): 1 si l'argument I est present, -1 sinon C C LIMITATION ESPROG : 50 ARGUMENTS, CHAINE DE 256 CARACTERES C C REMARQUE : COMMENT MODIFIER LE PROGRAMME POUR UN ANALYSE EN LIGNE ? C *************************************************************** INTEGER ITYPEL(*),IOPTIO(*) CHARACTER*(*) MESSAG(*) CHARACTER*(*) MOTS(*) INTEGER NBMOTS,LMOTS,ICODES(*) INTEGER NBCHAR,NBINTE,NBREAL CHARACTER*(*) CHARTB(*) INTEGER INTETB(*) REAL REALTB(*) INTEGER IARGUM(*),NARGAL,PRESEN(*),ITRACE,IERR C --- VARIABLES LOCALES --- INTEGER NARGMX,NCARMX PARAMETER (NARGMX = 50, NCARMX = 256) INTEGER LARGUM(NARGMX),NARGUM,PTCHAI,I CHARACTER*256 CHAINE, MESSA2 C IERR = 0 DO 5 I=1,NARGAL PRESEN(I)=0 5 CONTINUE IF(NARGAL.GT.NARGMX)THEN IERR = -2 CALL ESMESS(IERR,33,1,'TROP DE PARAMETRES',MESSA2) CALL ESEINT(1,MESSA2,NARGAL,1) GOTO 9999 ENDIF C --- LECTURE DES ARGUMENTS DU SHELL --- (GETARG) PTCHAI = 1 NARGUM = 0 C --- remplace les '-' (defaut) par des blancs CALL ESGARG(CHAINE,PTCHAI,NCARMX, > IARGUM,LARGUM,NARGUM,NARGAL,IERR) IF( IERR.NE.0 )GOTO 9999 C PRINT *,'PTCHAI = ',PTCHAI C PRINT *,' CHAINE = ',CHAINE C PRINT *,'IARGUM = ',(IARGUM(I),I=1,NARGUM) C PRINT *,'LARGUM = ',(LARGUM(I),I=1,NARGUM) C C --- DEMANDE A L'UTILISATEUR DES PARAMETRES MANQUANTS --- IF( NARGUM.EQ.0 )THEN C --- MODE CONVERSATIONNEL ET COMMANDE SONT EXCLUSIFS --- CALL ESLARG(MESSAG,CHAINE,PTCHAI,NCARMX, > IARGUM,LARGUM,NARGUM,NARGAL,IERR) IF( IERR.NE.0)GOTO 9999 C PRINT *,' CHAINE = ',CHAINE C PRINT *,'IARGUM = ',(IARGUM(I),I=1,NARGUM) C PRINT *,'LARGUM = ',(LARGUM(I),I=1,NARGUM) ELSE C --- on complete les arguments par des ' ' (defaut) DO 50 I=NARGUM+1,NARGAL IARGUM(I)=PTCHAI LARGUM(I)=0 CHAINE(PTCHAI:)=' ' PTCHAI = PTCHAI+1 50 CONTINUE NARGUM = NARGAL ENDIF C --- CONVERSION ET ANALYSE --- CALL ESPLEX(CHAINE, > IARGUM,LARGUM,NARGUM, > ITYPEL,IOPTIO,MESSAG, > MOTS,LMOTS,NBMOTS,ICODES, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > PRESEN,ITRACE,IERR) IF(IERR.NE.0)GOTO 9999 C --- VERIFICATION DE L'EXISTANCE DES FICHIERS --- DO 100 I=1,NARGUM C IF( IARGUM(I).EQ.-1 )GOTO 9999 IF( PRESEN(I).EQ.-1 )GOTO 100 CALL ESPEXF(CHARTB(IARGUM(I)),ITYPEL(I),MESSAG(I),ITRACE,IERR) IF(IERR.NE.0)GOTO 9999 100 CONTINUE C 9999 END C C REMARQUES : C 1. attention il faut faudra la difference entre 1 message C et un bout de texte ! C 2. Chaque module "independant" qui affiche ses propres messages C a une copie de XXMESS avec ses traductions ! C SUBROUTINE ESMESS(ITYPE,NUM1,NUM2,IMESS,IMESSL) C ***************************************************************** C OBJET ESMESS : construit le message IMESSL de code INUM dans la C langue definie (traduit le message IMESS) C ITYPE : type de message C -X : -1, -2, -3 messages d'erreur C 0 : warning C +X : message informatif C < 100 message informatif reserve (identitie) C 1 help on line C 2 C > 100 message quelconque C ***************************************************************** CHARACTER*(*) IMESS,IMESSL INTEGER ITYPE,NUM1,NUM2 C C character*63 helponline(5) character*512 helponline data helponline / >'ES is a fortran package that can be used as a library.'/ character*63 errmess(64) data errmess / C ------ FILE : es_geometrie.f C SUBROUTINE LITGEO & LITARE >' ', >'in a border definition ', >'in a border : incomplete definition ', >'too many zones on a border, must be less than ', >'too many nodes on a border, must be less than ', >'unknown code for border : ', >'in a border definition : number of nodes is not correct', >'in a border definition : number of zones is not correct', >'in a border definition : interval must begin with -3', C 10 >'in a border : the interval is empty', >'in a border : the type is unknown', C SUBROUTINE LITFRT >'in Block XYZ, wrong dimension ', >'Unknown : memory allocation?!', >'can t open the file : ', >'in Block XYZ : starting or ending tag is missing', >'in Block XYZ : number of points or dimension is wrong', >'at the point : ', >'in Block ARE ou ILM : number of borders or dimension is wrong', >'at the border : ', C 20 >'a point is wrong in the border :', >'dimension of the space must be > than the dimension of elements', >'in Block XYZ : dimension is too hight, must be less than : ', C SUBROUTINE ECRFRT >'the file already exist :', >'can t open the file : ', >'while writing the element :', C SUBROUTINE LITGRD >'in Block GRD : starting or ending tag missing', >'in Block GRD : number of values or dimension is wrong', >'at the value : ', C SUBROUTINE LITVIP >'in Block ILM : number of elements or dimension is wrong', C 30 >'at the element : ', >'too many points in the element, must be less than ', >'dimension of the space must be > than the dimension of elements', C SUBROUTINE ESGARG >'too many parameters for the application, must be <= ', >'too many character for a parameter, must be <= ', >'the following parameter is missing :', C SUBROUTINE ESEPRG : c'est une erreur (mais PB decalage) >'DATE ', >'CONTACT ', C SUBROUTINE ESLCHA >'not a string : ', >'not an integer : ', C 40 >'not a real : ', C SUBROUTINE LITTSN >'dimension of the values must be 1 instead of ', C SUBROUTINE LITRAF : c'est une erreur (mais PB decalage) >'-->DEFAULT MESH SIZE', >'-->READING MESH SIZE', >'-->DENSITY FUNCTIONS', >'-->NODAL VALUES', C SUBROUTINE LITDEN >'in Block GEO : starting or ending tag missing', >'in Block GEO : number of values or dimension is wrong', >'at the point : ', >'in Block SUI : starting or ending tag is missing', C 50 >'in Block SUI : number of progressions is not valid', >'at the progression : ', >'in Block DEN : starting or ending tag is missing', >'in Block DEN : number of concentrations or dimension is wrong', >'at the concentration : ', C SUBROUTINE STRDEN >'the concentration reference is not correct : ', >'the progression reference is not correct : ', >'the progression ratio is <= 0 : ', >'the progression size is <= 0 : ', >'the progression difference and size are <=0 : ', C 60 >'unknown type of concentration : ', >'illegal point reference number : ', C SUBROUTINE INIDEN >'no concentration defined !', C + LIVIP >'unknown type of element : ', >'123456789012345678901234567890123456789012345678901234567890123'/ character*63 messtype(5) data messtype / >'WARNING', >'DATA ERROR ', >'COMPUTER ERROR ', >'NOT YET POSSIBLE ', >'123456789012345678901234567890123456789012345678901234567890123'/ character*63 messages(10) data messages/ >' ', C SUBROUTINE LITRAF >'-->DEFAULT MESH SIZE', >'-->READING MESH SIZE', >'-->DENSITY FUNCTIONS', >'-->NODAL VALUES', C INIDEN >'Number of concentration : ', >'Mode of generation : ', C SUBROUTINE ESEPRG >'DATE ', >'CONTACT ', C 10 >'123456789012345678901234567890123456789012345678901234567890123'/ INTEGER LENCHR EXTERNAL LENCHR IF( ITYPE.LE.0 )THEN C --- entete IMESSL=messtype(1-ITYPE)(1:LENCHR(messtype(1-ITYPE))+1)//' ' >//errmess(NUM1)(1:LENCHR(errmess(NUM1)))//' ' >//errmess(NUM2)(1:LENCHR(errmess(NUM2)))//' ' C --- pour le debug : c write(*,*)ITYPE,NUM1,NUM2,IMESSL GOTO 9999 ENDIF c IF( ITYPE.LT.100 )THEN GOTO (10,20) ITYPE GOTO 1100 C ---- help on line ----- 10 CONTINUE IMESSL=helponline GOTO 1100 C --------- 20 CONTINUE GOTO 1100 1100 CONTINUE GOTO 9999 ENDIF IMESSL=messages(NUM1)(1:LENCHR(messages(NUM1)))// >' '//messages(NUM2)(1:LENCHR(messages(NUM2)))//' ' C --- pour le debug : c write(*,*)ITYPE,NUM1,NUM2,IMESSL GOTO 9999 9999 END C