sauv
C SAUV SOURCE PV090527 25/01/07 18:18:28 12116 C======================================================================= C DIRECTIVE SAUVER C ---------------- C C SAUVER (FORMAT) OBJ1 ...OBJN ; C ($GEO) C BUT: SAUVEGARDE DES OBJETS NOMMES ET DE CEUX QU ILS C SOUS-TENDENT, SUR LE FICHIER IOSAU C IOSAU EST DEFINI PAR: OPTIO SAUV IOSAU ; C C ON SAIT SAUVER LES OBJETS DONT LE TYPE EST CONTENU C DANS LE SP TYPFIL C C APPELLE TYPFIL CREPIL FILLLU FILLP1 FILLPI SORTRI FILLNO C IMPPIL MAXP1 MAXP32 WRPIL RESTPI SUPPIL SAVEPI C PILOBJ C ECRIT PAR FARVACQUE C REPRIS PAR LENA C --------------------------------------------------------------------- C POUR SAUVER UN AUTRE TYPE IL FAUT INTERVENIR DANS TYPFIL: C RAJOUTER DANS IPOSSI LES DEUX MOTS ASSOCIES C INCREMENTER NPOSSI DE 2 C VERIFIER QUE LA DIM DU TABLEAU IPOSSI EST GE NPOSSI C ET FAIRE LE TRAITEMENT DANS CHAQUE SP VIA LES GO TO C======================================================================= SUBROUTINE SAUV IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCNOYAU -INC CCFXDR -INC CCASSIS -INC SMCOORD -INC SMLENTI -INC TMLCHA8 -INC TMCOLAC SEGMENT ISORTA CHARACTER*8 ISORTC(KS) INTEGER ISORTI(KS) ENDSEGMENT EXTERNAL LONG CHARACTER*(8) CTYP CHARACTER*4 MOFORM(3) SAVE ILABAU DATA ILABAU/0/ DATA MOFORM /'FORM','LABE','MUET'/ iun=1 iimpil = IIMPI C --- NIVEAU MAXIMAL COURANT : IONIVR (voir REST lipil.eso) IONIVR = 26 IONIVS = IONIVE C --- NIVEAU DE SAUVEGARDE ACTUEL (si 0 -> niveau MAXIMAL) NIVEAU = IONIVE IF (NIVEAU.EQ.0) NIVEAU = IONIVR C --- VERIFICATIONS SUR LE NIVEAU DE SAUVEGARDE DEMANDE IF (NIVEAU.LT.1 .OR. NIVEAU.GT.IONIVR) THEN INTERR(1) = NIVEAU INTERR(2) = 1 INTERR(3) = IONIVR RETURN ENDIF C --- NIVEAU DE SAUVEGARDE CHOISI IONIVE = NIVEAU C---- LE NIVEAU 22 A INTRODUIT LES NOMS DE PLUS DE 8 CARACTERES IF (IONIVE.LT.22) THEN INTERR(1)=IONIVE ENDIF C======================================================================= C * attention aux assistants .... if (NBESC.NE.0) then if (iimpil.eq.1234) & write(ioimp,*) ' il faut bloquer les assistants' mestra=imestr SEGACT MESTRA*MOD if (iimpil.eq.1234) & write(ioimp,*) ' assistants en attente' * on passe en mode force call ooofrc(1) * lodesl=.true. endif C======================================================================= C ---- LECTURE DES MOTS-CLES : AVEC OU SANS FORMAT----------- IFORM = 0 ISILE = 0 IAUTO = 1 46 CONTINUE IF (IERR.NE.0) GOTO 5000 IF (IFURM.EQ.1) THEN IFORM=1 if (isafor.ne.iform) then goto 5000 endif GO TO 46 ELSEIF (IFURM.EQ.2) THEN IF (IERR.NE.0) GOTO 5000 IAUTO=0 GO TO 46 ELSEIF (IFURM.EQ.3) THEN ISILE=1 GO TO 46 ENDIF iform = isafor * write (6,*) ' iformx dans sauv ',iformx if (iformx.eq.2) iform = 2 C======================================================================= IF (IAUTO.EQ.1) THEN ILABAU=ILABAU+1 IF(ilabau.lt.10) then ELSEIF(ilabau.lt.100) then ELSEIF(ilabau.lt.1000) then ELSEIF(ilabau.lt.10000) then ELSE ENDIF ENDIF IF (iimpil.EQ.5) WRITE(IOIMP,799) 799 FORMAT(' LECTURE DES OBJETS A SAUVER') KS=0 SEGINI ISORTA 1 CONTINUE CTYP=' ' IF (IERR.NE.0) RETURN IF (IRETOU.NE.1) GOTO 100 C------- ON CONTROLE LA VALIDITE DU TYPE DEMANDE K=0 IF (K.LT.0) THEN C---------- ON NE SAIT PAS SORTIR UN OBJET DE CE TYPE MOTERR(1:8)=CTYP GO TO 5000 ENDIF C------- LE TYPE EST OK KS=ISORTI(/1)+1 SEGADJ ISORTA ISORTC(KS)=CTYP ISORTI(KS)=IRET GO TO 1 C---- ON A EXPLORE TOUTES LES DEMANDES 100 CONTINUE LOBJ=ISORTI(/1) IF (LOBJ.EQ.0) THEN c** SEGDES ISORTA ELSE IF (iimpil.EQ.5) WRITE (IOIMP,821) LOBJ 821 FORMAT(' NOMBRE D OBJETS A SAUVER : ',I6) ENDIF C --------------------------------------------------------- C **** A PARTIR DES OBJETS DE ISORTA, ON REMPLIT LES PILES C **** ICOLAC EST INITIALISEE DANS CREPIL ICOLAC=0 C---- Cet appel a TYPFIL renvoie -NPOSSI dans K CTYP=' ' K=-1 C---- NITLAC = nombre de types 'sauvegardables' NITLAC=-K IF (IPSAUV.NE.0) THEN ICOLAC=IPSAUV SEGACT ICOLAC*MOD IFORM = icolac.IFFORM ELSE SEGACT ICOLAC*MOD icolac.IFFORM = IFORM ENDIF C---- Cet appel cree un 1 segment ICOLAC(NITLAC) ainsi que NITLAC : C - segments ITLACC dont les adresses sont stockees dans KCOLA C (faisant partie de ICOLAC) C - segments ISGTR(KS) avec KS=0 dont les adresses sont stockees C dans ICOLA (faisant partie de ICOLAC) C Les MCOLA et KCOLAC sont initialises a 0. A la fin ICOLAC est desactive. IF (iimpil.EQ.5) WRITE(IOIMP,801) NITLAC 801 FORMAT(' NOMBRE DE PILES CREEES : ',I5) SEGACT ICOLAC ILISSE=ILISSP SEGACT ILISSE*MOD ILISSE=ILISSG SEGACT ILISSE*MOD C C on met la configuration courante dans la pile si pas deja C ITLACC=KCOLA(33) c* SEGACT ITLACC*MOD <- Fait dans AJOUN ICFCO= MCOORD ** write(6,*) 'configuration courante dans sauv',icfco C --- REMPLISSAGE DES PILES A PARTIR DES DEMANDES IF (LOBJ.EQ.0) THEN C ------ PAS D OBJETS NOMMES : ON SAUVE TOUT SEGSUP,MLCHA8 ELSE ENDIF SEGSUP,ISORTA CMB-- Maintenant ICOLAC contient la liste des objets a sauvegarder C --- FORMULATION HHO : Initialisations/Verifications -------- CALL HHOPIL(1,IONIVE,iun) C---- PETITE MAGOUILLE POUR LES OBJETS RIGIDITES ET LES SUPER ELEMENTS C --- IER PASSAGE POUR COMPLETER LES PILES SANS CHANGER LES POINTEURS IF (iimpil.EQ.5) WRITE(IOIMP,802) 802 FORMAT(' PREMIER REMPLISSAGE DES PILES EFFECTUE') C --- ON CHERCHE A COMPLETER LES CHAPEAUX DE CERTAINS OBJETS * IL FAUT REAPPELLER SORTRI POUR LA PETITE MAGOUILLE * POUR LES EVENTUELLES RIGIDITES AJOUTEES PAR HATRIG C----PETITE MAGOUILLE POUR LES OBJETS RIGIDITES ET LES SUPER ELEMENTS C --- RECHERCHE DU NUMERO MAX DE POINT A PARTIR DE L ETAT DES PILES 1 ET 32 C --- ON COMPLETE EVENTUELLEMENT LA PILE 1 A PARTIR DE TOUS LES OBJETS C MAILLAGE DONT LES NOEUDS SONT INFERIEURS A IMAX C --- 2EME PASSAGE SANS CHANGER LES POINTEURS SUITE A AJOUT MELEME NOUVEAUX IF (iimpil.EQ.5) WRITE (IOIMP,803) 803 FORMAT(' SECOND REMPLISSAGE DES PILES EFFECTUE') IF (IERR.NE.0) THEN GOTO 5000 ENDIF C ------------------------------------------------------- C --- RECHERCHE DES NOMS C --- IMPRESSIONS INTERMEDIAIRES DES PILES IVOULU=0 C --- 3EME PASSAGE CHANGEMENT DES POINTEURS IF (iimpil.EQ.5) WRITE(IOIMP,804) 804 FORMAT(' CHANGEMENT DES POINTEURS EFFECTUE') C C-------------------------------------------------------- C **** ECRITURE SUR LE FICHIER DE SORTIE C --- ECRITURE DES PILES C REWIND IOSAU IF (iimpil.EQ.5) WRITE(IOIMP,805) 805 FORMAT(' SAUVEGARDE EFFECTUEE') C --- RESTAURATION DES POINTEURS IF (iimpil.EQ.5) WRITE(IOIMP,806) 806 FORMAT(' RESTAURATION DES POINTEURS EFFECTUEE') C------------------------------------------------------------- C --- SUPPRESSION DES PILES (IVOULU=0) IVOULU=0 C --- FORMULATION HHO : MENAGE ------------------------------- CALL HHOPIL(9,iun,iun) IF (iimpil.EQ.5) WRITE (IOIMP,807) 807 FORMAT(' SUPPRESSION DES PILES EFFECTUEE ') C MODI N.BLAY LE 17/09/91 POUR VIDER LES BUFFERS.------------- C REWIND IOSAU if (iform.eq.2) then if (ixdrw.ne.0) ios=IXDRCLOSE( ixdrw,.TRUE. ) * write (ioimp,*) ' sauv reouverture de ',NOMSAU endif 5000 CONTINUE C * attention aux assistants .... if (NBESC.NE.0) then C * il faut liberer le segment de dialogue mestra=imestr * repasser en mode normal call ooofrc(0) SEGDES MESTRA * lodesl=.false. end if IONIVE = IONIVS RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales