funobj
C FUNOBJ SOURCE PV090527 25/01/11 21:15:02 12123 C FUNOBJ permet d'effectuer la fusion par Tournoi (plus rapide en temps d'execution) C de N objets d'un même type contenus dans un segment de travail noté SID IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C ENTREES C--------- C ID : POINTEUR sur le SEGMENT SID C C SORTIES C--------- C ID1 : POINTEUR ou ENTIER C XVAL1 : FLOTTANT C BOOL1 : LOGIQUE C C C CREATION C---------- C C HISTORIQUE C----------- C 19/01/2016 : La comparaison aux 'MOTS' n'est plus faite dans la boucle C Possibilite d'effectuer la fusion par TOURNOI ou C SEQUENTIELLE pour tous les types supportes C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -INC CCASSIS -INC SMCOORD -INC PPARAM -INC CCOPTIO -INC CCREEL -INC CCGEOME -INC TMTRAV -INC SMCHPOI -INC SMELEME -INC SMCHAML -INC SMRIGID -INC SMMODEL -INC SMEVOLL -INC SMLREEL -INC SMLENTI -INC SMLMOTS -INC SMCHARG PARAMETER (NBMO1=15) CHARACTER*8 LESMO1(NBMO1) C LESMO1 = LISTE DES OBJETS GERES PAR FUNOBJ DATA LESMO1/'RIGIDITE','MATRIK ','MMODEL ','MAILLAGE', & 'CHPOINT ','MCHAML ','FLOTTANT','LOGIQUE ', & 'EVOLUTIO','ENTIER ','MOT','CHARGEME', & 'LISTREEL','LISTENTI','LISTMOTS'/ logical ltelq, BOOL1 REAL*8 XVAL1, X1 C Nombre d'objets restant a fusionner INTEGER NBREST,ITYP0 C SID : SEGMENT CONTENANT LES INFORMATIONS POUR LA FUSION DES OBJETS SEGMENT SID C NBFUS : NOMBRE D'OBJETS A FUSIONNER C IPOINT : POINTEURS A FUSIONNER ou ENTIERS A FUSIONNER (cas particuler MAXI / MINI) C BVAL : LOGIQUES SUR LESQUELS ON FAIT UN ET/OU LOGIQUE C XVAL : REELS A FUSIONNER (cas particuler MAXI / MINI) C CVAL : MOTS A FUSIONNER (cas particuler MAXI / MINI) C CTYPE1 : MOT DONNANT LE TYPE D'OBJETS A FUSIONNER INTEGER IPOINT(NBFUS) LOGICAL BVAL (NBFUS) REAL*8 XVAL (NBFUS) CHARACTER*(IC1) CVAL (NBFUS) CHARACTER*8 CTYPE1,CREATE ENDSEGMENT C SID1: COPIE DE SID POUR NE PAS FAIRE SEGSUP DES SEGMENTS D'ENTREE POINTEUR SID1.SID C ITRAV : SEGMENT DE TRAVAIL POUR CRECHP SEGMENT ITRAV CHARACTER*(LOCOMP) INC (NN) INTEGER IHAR(NN) ENDSEGMENT C ICPR : SEGMENT POUR INDEXER RAPIDEMENT LES NOEUDS SEGMENT ICPR(nbpts) C LISTYP:SEGMENT POUR LISTER LES TYPES D'ELEMENTS PRESENTS ET LEUR NOMBRES SEGMENT IDELEM(NBTY) SEGMENT INDEXM(NBMAIL) C ISEG : SEGMENT QUELCONQUE POUR TRAITER DES SEGMENTS (SEGACT,SEGDES,etc.) SEGMENT ISEG(0) CHARACTER*(8) CHA8,CHA8a,CHA8b,CHACRE C------------------------------------------------------------------------------------------ C Initialisations ISTADE= 0 SID = ID CHA8 = SID.CTYPE1 NBFUS = SID.IPOINT(/1) C PRECONDITIONNEMENT pour ne pas relire des MOTS a chaque fois IF (ITYP0.EQ.0) THEN MOTERR(1:8 ) = CHA8 RETURN ENDIF C Activations des SEGMENTS en entree DO IFUS=1,NBFUS id1 = SID.IPOINT(IFUS) IF(id1 .GT. 0)THEN ENDIF ENDDO IF (ierr.ne.0) return C Gestion de la methode de fusion selon ITYP0 GOTO(555,111,111,777,444,111,222,252,999,232,242,1200, & 1300,1400,1500),ITYP0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C GESTION DE LA FUSION PAR TOURNOIS (2 par 2) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 111 CONTINUE SEGINI,SID1=SID ltelq = .TRUE. XVAL1 = SID.XVAL(1) NBREST = NBFUS C Debut de la fusion d'objets par tournoi 1 CONTINUE C Stade de la competition ISTADE = ISTADE + 1 IF (NBREST .EQ. 1) THEN C Fin lorsqu'il ne reste plus qu'un seul objet a fusionner ID1 = SID.IPOINT(1) SEGSUP,SID1 RETURN ELSEIF (MOD(NBREST,2) .EQ. 0) THEN C Cas du Nombre pair d'objets restant a fusionner DO 100 III = 1,(NBREST/2) I1 = (III*2) - 1 id1 = SID.IPOINT(I1) X1 = SID.XVAL(I1) GOTO(2,4,6,8,10,12,14,16),ITYP0 C 'RIGIDITE' 2 CONTINUE GOTO 120 C 'MATRIK' 4 CONTINUE GOTO 120 C 'MMODEL' 6 CONTINUE GOTO 120 C 'MAILLAGE' 8 CONTINUE GOTO 120 C 'CHPOINT' 10 CONTINUE GOTO 120 C 'MCHAML' 12 CONTINUE GOTO 120 C 'FLOTTANT' 14 CONTINUE C 'LOGIQUE' 16 CONTINUE 120 CONTINUE C Menage des objets temporaires inutiles IF (IPLAC.EQ.0) THEN ISEG=ID1 SEGSUP,ISEG ENDIF IF (IPLAC.EQ.0) THEN ISEG=ID2 SEGSUP,ISEG ENDIF C On remplace dans SID.IPOINT pour l'iteration suivante SID.IPOINT(III) = iretou 100 CONTINUE NBREST = (NBREST/2) ELSE C Cas du Nombre impair d'objets restant a fusionner DO 200 III = 1,((NBREST-1)/2) I1 = (III*2) - 1 id1 = SID.IPOINT(I1) X1 = SID.XVAL(I1) GOTO(3,5,7,9,11,13,15,17),ITYP0 C 'RIGIDITE' 3 CONTINUE GOTO 220 C 'MATRIK' 5 CONTINUE GOTO 210 C 'MMODEL' 7 CONTINUE GOTO 220 C 'MAILLAGE' 9 CONTINUE GOTO 220 C 'CHPOINT' 11 CONTINUE GOTO 210 C 'MCHAML' 13 CONTINUE GOTO 220 C 'FLOTTANT' 15 CONTINUE C 'LOGIQUE' 17 CONTINUE 220 CONTINUE C Menage des objets temporaires inutiles IF (IPLAC .EQ. 0) THEN ISEG=ID1 SEGSUP, ISEG ENDIF IF (IPLAC .EQ. 0) THEN ISEG=ID2 SEGSUP, ISEG ENDIF 210 CONTINUE C On remplace dans SID.IPOINT pour l'iteration suivante SID.IPOINT(III+1) = iretou 200 CONTINUE C Le dernier OBJET n'est pas traité, il est repris au debut pour l'iteration suivante SID.IPOINT(1) = SID.IPOINT(NBREST) SID.BVAL(1) = SID.BVAL(NBREST) SID.XVAL(1) = SID.XVAL(NBREST) NBREST = ((NBREST-1)/2) + 1 ENDIF GOTO 1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C GESTION SEQUENTIELLE DE LA FUSION : COMME AVANT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 333 CONTINUE SEGINI,SID1=SID ID1 = SID.IPOINT(1) XVAL1 = SID.XVAL(1) C Stade de la competition ISTADE = ISTADE + 1 DO 300 III = 2,NBFUS ID2 = SID.IPOINT(III) X2 = SID.XVAL(III) GOTO(31,32,33,34,35,36,37,38),ITYP0 C 'RIGIDITE' 31 CONTINUE GOTO 320 C 'MATRIK' 32 CONTINUE GOTO 320 C 'MMODEL' 33 CONTINUE GOTO 320 C 'MAILLAGE' 34 CONTINUE GOTO 320 C 'CHPOINT' 35 CONTINUE GOTO 310 C 'MCHAML' 36 CONTINUE GOTO 320 C 'FLOTTANT' 37 CONTINUE C 'LOGIQUE' 38 CONTINUE C 320 CONTINUE C Menage des objets temporaires inutiles IF (ISTADE.GT.1) THEN ISEG=ID1 SEGSUP,ISEG ENDIF 310 CONTINUE C On remplace ID1 par IRETOU ID1 = iretou 300 CONTINUE SEGSUP,SID1 RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE FLOTTANTS : Cas particuliers pour 'MAXI','MINI' ==> FLOTTANT C autre ==> LISTREEL CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 222 CONTINUE CHACRE = SID.CREATE ID1 = 0 IF (CHACRE .EQ. 'MAXI ')THEN XVAL1 = SID.XVAL(1) DO 2221 III = 2,NBFUS XVAL1= MAX(XVAL1,SID.XVAL(III)) 2221 CONTINUE ELSEIF(CHACRE .EQ. 'MINI ')THEN XVAL1 = SID.XVAL(1) DO 2222 III = 2,NBFUS XVAL1= MIN(XVAL1,SID.XVAL(III)) 2222 CONTINUE ELSE JG = NBFUS SEGINI,MLREEL ID1 = MLREEL DO 2223 III = 1,NBFUS 2223 CONTINUE ENDIF RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION D'ENTIERS : Cas particuliers pour 'MAXI','MINI' ==> ENTIER C autre ==> LISTENTI CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 232 CONTINUE CHACRE = SID.CREATE ID1 = 0 IF (CHACRE .EQ. 'MAXI ')THEN IVAL1 = SID.IPOINT(1) DO 2321 III = 2,NBFUS IVAL1= MAX(IVAL1,SID.IPOINT(III)) 2321 CONTINUE ELSEIF(CHACRE .EQ. 'MINI ')THEN IVAL1 = SID.IPOINT(1) DO 2322 III = 2,NBFUS IVAL1= MIN(IVAL1,SID.IPOINT(III)) 2322 CONTINUE ELSE JG = NBFUS SEGINI,MLENTI ID1 = MLENTI DO 2323 III = 1,NBFUS MLENTI.LECT(III)=SID.IPOINT(III) 2323 CONTINUE ENDIF RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE MOTS : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 242 CONTINUE CHACRE = SID.CREATE JGM = NBFUS JGN = SID.CVAL(/1) SEGINI,MLMOTS ID1 = MLMOTS DO 2423 III = 1,NBFUS 2423 CONTINUE RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE LOGIQUE : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 252 CONTINUE CHACRE = SID.CREATE BOOL1 = SID.BVAL(1) IF (CHACRE .EQ. 'ET ')THEN DO 2521 III = 2,NBFUS BOOL1= BOOL1 .AND. SID.BVAL(III) 2521 CONTINUE ELSE DO 2522 III = 2,NBFUS BOOL1= BOOL1 .OR. SID.BVAL(III) 2522 CONTINUE ENDIF RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE CHPOINT ESCLAVES : En une seule fois (Pas de CHPOINT temporaires) C Je fais la methode GENERALE directement (sortie de BSIGMA visee) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 444 CONTINUE NN = 0 NNIN = 0 NNNOE = 0 NAT = 1 NATi = -1 NATf = -1 CHA8 = ' ' CHA8a = ' ' CHA8b = ' ' DO 400 III = 1,NBFUS C Ouverture de tous les MCHPOI MCHPOI = SID.IPOINT(III) NSOUPO = MCHPOI.IPCHP(/1) NAT = MAX(NAT,MCHPOI.JATTRI(/1)) NATi = MCHPOI.JATTRI(1) CHA8 = MCHPOI.MTYPOI IF (NATi .EQ. 0) THEN C On ne peut pas assembler des CHPOINTS qui ont des NATURES indeterminee RETURN ENDIF IF(III .EQ. 1) THEN NATf = NATi CHA8a=CHA8 CHA8b=CHA8 ELSE IF (NATi .NE. NATf) THEN C On ne peut pas assembler des CHPOINTS qui ont des NATURES differentes RETURN ENDIF IF (CHA8 .NE. CHA8a) THEN CHA8b='INDETERM' ENDIF ENDIF DO 410 JJJ = 1,NSOUPO C Ouverture de tous les MSOUPO MSOUPO= MCHPOI.IPCHP(JJJ) IPT1 = MSOUPO.IGEOC MPOVAL= MSOUPO.IPOVAL NN = NN + MSOUPO.NOHARM(/1) 410 CONTINUE 400 CONTINUE SEGINI,ITRAV,ICPR C Decompte et stokage des composantes differentes DO 420 III = 1,NBFUS MCHPOI = SID.IPOINT(III) DO 430 JJJ = 1,MCHPOI.IPCHP(/1) MSOUPO = MCHPOI.IPCHP(JJJ) DO 431 KKK = 1,MSOUPO.NOHARM(/1) DO 432 LLL = 1,NNIN IF(MSOUPO.NOCOMP(KKK) .NE. ITRAV.INC (LLL)) GOTO 432 IF(MSOUPO.NOHARM(KKK) .EQ. ITRAV.IHAR(LLL)) GOTO 431 432 CONTINUE NNIN = NNIN + 1 ITRAV.INC (NNIN)=MSOUPO.NOCOMP(KKK) ITRAV.IHAR(NNIN)=MSOUPO.NOHARM(KKK) 431 CONTINUE IPT1 =MSOUPO.IGEOC MPOVAL=MSOUPO.IPOVAL DO 433 MMM=1,IPT1.NUM(/2) INOEUD=IPT1.NUM(1,MMM) IF(ICPR(INOEUD) .EQ. 0) THEN NNNOE = NNNOE + 1 ICPR(INOEUD)= NNNOE ENDIF 433 CONTINUE 430 CONTINUE 420 CONTINUE C Creation de MTRAV et remplissage SEGINI,MTRAV DO 450 III = 1,NBFUS MCHPOI = SID.IPOINT(III) DO 460 JJJ = 1,MCHPOI.IPCHP(/1) MSOUPO=MCHPOI.IPCHP(JJJ) IPT1 =MSOUPO.IGEOC MPOVAL=MSOUPO.IPOVAL C Recherche de la composante correspondante DO 461 KKK=1,MSOUPO.NOCOMP(/2) DO 462 LLL=1,NNIN IF(MSOUPO.NOCOMP(KKK) .NE. ITRAV.INC (LLL)) GOTO 462 IF(MSOUPO.NOHARM(KKK) .EQ. ITRAV.IHAR(LLL)) GOTO 463 462 CONTINUE 463 CONTINUE C Selon l'ATTRIBUT de NATURE on ne fait pas la même operation IF (NATi .EQ. 1) THEN C NATURE DIFFUS on doit avoir la meme valeur en 1 pt d'une meme composante DO 464 MMM=1,IPT1.NUM(/2) INOEUD =ICPR(IPT1.NUM(1,MMM)) IGEO(INOEUD)= IPT1.NUM(1,MMM) XX1 = MPOVAL.VPOCHA(MMM,KKK) XX2 = BB (LLL,INOEUD) I1 = IBIN(LLL,INOEUD) IF (I1 .EQ. 0)THEN C Premiere valeur qu'on place la IBIN(LLL,INOEUD)= 1 BB (LLL,INOEUD)= XX1 ELSEIF(I1 .EQ. 1) THEN C Autres valeurs qu'on trouve a la meme place XX3 = MAX(ABS(XX1) ,ABS(XX2)) XXPREC= MAX(XZPREC*XX3,XPETIT ) IF (ABS(XX1 - XX2) .GT. XXPREC) THEN C On ne peut pas assembler des CHPOINTS de nature DIFFUS C ayant des valeurs differentes en un point de la meme composante RETURN ENDIF ENDIF 464 CONTINUE ELSEIF (NATi .EQ. 2) THEN C NATURE DISCRET on procede a l'addition des valeurs en 1 pt d'une meme composante DO 465 MMM=1,IPT1.NUM(/2) INOEUD =ICPR(IPT1.NUM(1,MMM)) IGEO(INOEUD)= IPT1.NUM(1,MMM) IBIN(LLL,INOEUD)= 1 BB (LLL,INOEUD)= MPOVAL.VPOCHA(MMM,KKK)+BB(LLL,INOEUD) 465 CONTINUE ELSE C On ne peut pas assembler des CHPOINTS qui ont des NATURES differentes RETURN ENDIF 461 CONTINUE 460 CONTINUE C Remplissage des NOMS de composante et NUMEROS d'harmoniques DO 451 JJJ = 1,NNIN NHAR(JJJ)=ITRAV.IHAR(JJJ) 451 CONTINUE 450 CONTINUE C FERMETURE ET SUPPRESSION DES SEGMENTS SEGSUP,ITRAV,ICPR,MTRAV MCHPOI=ID1 C Dans crechp NAT vaut 1, on AJUSTE le SEGMENT si besoin IF (NAT .GT. MCHPOI.JATTRI(/1)) THEN NSOUPO=MCHPOI.IPCHP(/1) SEGADJ,MCHPOI ENDIF C Le chapeau du CHPOINT est complete d'apres le premier de la liste MCHPO4 = SID.IPOINT(1) MCHPOI.MTYPOI=CHA8b MCHPOI.MOCHDE='CHPOINT CREE PAR FUNOBJ' DO IATT=1,NAT MCHPOI.JATTRI(IATT)=MCHPO4.JATTRI(IATT) ENDDO RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE RIGIDITE ESCLAVES : En une seule fois (Pas de RIGIDITE temporaires) C Seulement les CHAPEAUX sont fusionnes CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 555 CONTINUE C OUVERTURE de tous les MRIGID NRIGEL=0 iforie = -99 DO III=1,NBFUS MRIGID=SID.IPOINT(III) SEGACT,MRIGID NRIGEL=NRIGEL + IRIGEL(/2) CHA8 =MRIGID.MTYMAT IF(III .EQ. 1) THEN CHA8a=CHA8 CHA8b=CHA8 iforie = mrigid.IFORIG ELSE IF (CHA8 .NE. CHA8a) THEN IF(CHA8 .EQ. 'RIGIDITE')THEN CHA8b='RIGIDITE' ELSE CHA8b='INDETERM' ENDIF ENDIF IF (iforie .NE. mrigid.IFORIG) THEN interr(1)=iforie interr(2)=mrigid.IFORIG interr(3)=IFOUR c-dbg write(ioimp,*) '1132 FUNOBJ',iii,mrigid iforie = IFOUR END IF ENDIF ENDDO SEGINI,MRIGID ID1 = MRIGID MRIGID.ICHOLE = 0 MRIGID.IMGEO1 = 0 MRIGID.MTYMAT = CHA8b MRIGID.IFORIG = iforie C FUSION des CHAPEAUX IC=0 DO III=1,NBFUS RI1=SID.IPOINT(III) JA =RI1.IRIGEL(/2) JB =RI1.IRIGEL(/1) DO KKK=1,JA MELEME=RI1.IRIGEL(1,KKK) SEGACT,MELEME IF (NUM(/2) .NE. 0) THEN IC=IC+1 COERIG(IC)=RI1.COERIG(KKK) DO LLL=1,JB IRIGEL(LLL,IC)=RI1.IRIGEL(LLL,KKK) ENDDO ENDIF ENDDO ENDDO C Ajustement du SEGMENT le cas echeant IF (NRIGEL .NE. IC) THEN NRIGEL=IC SEGADJ,MRIGID ENDIF SEGACT,MRIGID*NOMOD RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE RIGIDITE ESCLAVES : En une seule fois (Pas de RIGIDITE temporaires) C Seulement les CHAPEAUX sont fusionnes C C CB215821 : Impossible de faire COHABITER SMRIGID et SMMATRIK C - Les SEGMENTS portent les memes nom... C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C 666 CONTINUE CC OUVERTURE de tous les MATRIK C NMATRI=0 C DO III=1,NBFUS C MATRIK=SID.IPOINT(III) C SEGACT,MATRIK C NMATRI=NMATRI + IRIGEL(/2) C ENDDO C C NRIGE= 7 C NKID = 9 C NKMT = 7 C SEGINI,MATRIK C ID1 = MATRIK C C IC = 1 C DO III=1,NBFUS C IP1 = SID.IPOINT(III) C N1 = IP1.IRIGEL(/2) C CC Copie des IRIGEL dans le resultat C DO JJJ=1,N1 C DO KKK=1,NRIGE C IRIGEL(KKK,IC + JJJ)=IP1.IRIGEL(KKK,JJJ) C ENDDO C CC On effectue une copie des segments IMATRI car ils pointent sur CC d'autres objets élémentaires (les valeurs des matrices élémentaires) C IMATR1=IP1.IRIGEL(4,JJJ) C SEGINI,IMATR2=IMATR1 C SEGDES,IMATR2 C IRIGEL(4,IC + JJJ)=IMATR2 C ENDDO C IC = IC + N1 C SEGDES,IP1 C ENDDO C C SEGDES,MATRIK C RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE MELEME ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 777 CONTINUE NBTY = 100 NBMAIL= 100 IDMAIL= 0 SEGINI,INDEXM SEGINI,LISTYP C Ouverture de tous les MELEME NMATRI= 0 NBTYP = 0 DO 7771 III=1,NBFUS IPT1=SID.IPOINT(III) NBSOUS=IPT1.LISOUS(/1) IF (NBSOUS .GT. 0) THEN C Cas des MELEME COMPLEXES DO 7772 JJJ=1,NBSOUS IDMAIL=IDMAIL + 1 IF(IDMAIL .GT. NBMAIL)THEN NBMAIL = NBMAIL * 2 SEGADJ,INDEXM ENDIF IPT2=IPT1.LISOUS(JJJ) NBELEM = IPT2.NUM(/2) IF (NBELEM .GT. 0) THEN ITYPE = IPT2.ITYPEL NBNN = IPT2.NUM(/1) C Recherche d'un TYPE DEJA RENCONTRE IF (NBTYP .EQ. 0) THEN NBTYP = 1 INDEXM(1) = 1 ELSE DO KKK=1,NBTYP INDEXM(IDMAIL)=KKK GOTO 7772 ENDIF ENDDO NBTYP = NBTYP + 1 IF(NBTYP .GT. NBTY)THEN NBTY = NBTY * 2 SEGADJ,LISTYP ENDIF INDEXM(IDMAIL) = NBTYP ENDIF ENDIF 7772 CONTINUE ELSE C Cas des MELEME SIMPLES IDMAIL=IDMAIL + 1 IF(IDMAIL .GT. NBMAIL)THEN NBMAIL = NBMAIL * 2 SEGADJ,INDEXM ENDIF NBELEM = IPT1.NUM(/2) IF (NBELEM .GT. 0) THEN ITYPE = IPT1.ITYPEL NBNN = IPT1.NUM(/1) C Recherche d'un TYPE DEJA RENCONTRE IF (NBTYP .EQ. 0) THEN NBTYP = 1 INDEXM(1) = 1 ELSE DO KKK=1,NBTYP INDEXM(IDMAIL)=KKK GOTO 7771 ENDIF ENDDO NBTYP = NBTYP + 1 IF(NBTYP .GT. NBTY)THEN NBTY = NBTY * 2 SEGADJ,LISTYP ENDIF INDEXM(IDMAIL) =NBTYP ENDIF ENDIF ENDIF 7771 CONTINUE C CREATION DU RESULTAT ET REMPLISSAGE IDMAIL = 0 NBTY = NBTYP SEGINI,IDELEM IF(NBTYP .EQ. 0)THEN C Cas du MELEME resultat SIMPLE VIDE ITEL = ILCOUR NBELEM = 0 NBNN = 0 NBSOUS = 0 NBREF = 0 SEGINI,MELEME MELEME.ITYPEL=ITEL ELSEIF(NBTYP .EQ. 1)THEN C Cas du MELEME resultat SIMPLE NON VIDE NBSOUS = 0 NBREF = 0 SEGINI,MELEME DO III=1,NBFUS IPT1=SID.IPOINT(III) NBELEM=IPT1.NUM(/2) IF (NBELEM .GT. 0)THEN JJ1=IDELEM(1) DO JJJ=1,NBELEM JJ1=JJ1 + 1 MELEME.ICOLOR(JJ1)=IPT1.ICOLOR(JJJ) DO KKK=1,NBNN MELEME.NUM(KKK,JJ1)=IPT1.NUM(KKK,JJJ) ENDDO ENDDO IDELEM(1) = IDELEM(1) + NBELEM ENDIF ENDDO ELSE C Cas du MELEME resultat COMPLEXE NBNN = 0 NBELEM = 0 NBSOUS = NBTYP NBREF = 0 SEGINI,MELEME DO III=1,NBTYP NBSOUS=0 NBREF =0 SEGINI,IPT3 MELEME.LISOUS(III)=IPT3 ENDDO DO III=1,NBFUS IPT1=SID.IPOINT(III) NBSOUS=IPT1.LISOUS(/1) IF (NBSOUS .GT. 0) THEN C Cas des MELEME COMPLEXES DO JJJ=1,NBSOUS IDMAIL=IDMAIL+1 IPT2=IPT1.LISOUS(JJJ) NBELEM = IPT2.NUM(/2) IF (NBELEM .GT. 0)THEN NBTYP = INDEXM(IDMAIL) NBNN = IPT2.NUM(/1) IPT3 = MELEME.LISOUS(NBTYP) JJ1 = IDELEM(NBTYP) DO LLL=1,NBELEM JJ1=JJ1 + 1 IPT3.ICOLOR(JJ1)=IPT2.ICOLOR(LLL) DO KKK=1,NBNN IPT3.NUM(KKK,JJ1)=IPT2.NUM(KKK,LLL) ENDDO ENDDO IDELEM(NBTYP) = IDELEM(NBTYP) + NBELEM ENDIF ENDDO ELSE C Cas des MELEME SIMPLES IDMAIL=IDMAIL+1 NBELEM = IPT1.NUM(/2) IF (NBELEM .GT. 0)THEN NBTYP = INDEXM(IDMAIL) NBNN = IPT1.NUM(/1) IPT3 = MELEME.LISOUS(NBTYP) JJ1 = IDELEM(NBTYP) DO JJJ=1,NBELEM JJ1=JJ1 + 1 IPT3.ICOLOR(JJ1)=IPT1.ICOLOR(JJJ) DO KKK=1,NBNN IPT3.NUM(KKK,JJ1)=IPT1.NUM(KKK,JJJ) ENDDO ENDDO IDELEM(NBTYP) = IDELEM(NBTYP) + NBELEM ENDIF ENDIF ENDDO ENDIF ID1=MELEME C Suppression des SEGMENTS de travail SEGSUP,LISTYP,IDELEM,INDEXM RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION D'EVOLUTIONS ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 999 CONTINUE C Decompte pour dimensionnement N =0 CHA8=' ' DO 9991 III=1,NBFUS MEVOL1=SID.IPOINT(III) IF(III .EQ. 1) THEN CHA8a=MEVOL1.ITYEVO CHA8 =CHA8a ELSE CHA8b=MEVOL1.ITYEVO IF(CHA8b .NE. CHA8a)THEN CHA8=' ' ENDIF ENDIF N=N + MEVOL1.IEVOLL(/1) 9991 CONTINUE SEGINI,MEVOLL C Recuperation du titre dans CCOPTIO MEVOLL.IEVTEX=TITREE MEVOLL.ITYEVO=CHA8 C Remplissage N=0 DO 9992 III=1,NBFUS MEVOL1=SID.IPOINT(III) N1 =MEVOL1.IEVOLL(/1) DO 9993 IEV=1,N1 N = N + 1 MEVOLL.IEVOLL(N)=MEVOL1.IEVOLL(IEV) 9993 CONTINUE 9992 CONTINUE ID1=MEVOLL RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE CHARGEMENTS ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1200 CONTINUE C Decompte pour dimensionnement N = 0 DO 1201 III=1,NBFUS MCHAR1 = SID.IPOINT(III) N = N + MCHAR1.KCHARG(/1) 1201 CONTINUE SEGINI,MCHARG C Remplissage N=0 DO 1202 III=1,NBFUS MCHAR1 = SID.IPOINT(III) N1 = MCHAR1.KCHARG(/1) DO 1203 JJJ=1,N1 N = N + 1 MCHARG.KCHARG(N)=MCHAR1.KCHARG(JJJ) MCHARG.CHANAT(N)=MCHAR1.CHANAT(JJJ) MCHARG.CHANOM(N)=MCHAR1.CHANOM(JJJ) MCHARG.CHAMOB(N)=MCHAR1.CHAMOB(JJJ) MCHARG.CHALIE(N)=MCHAR1.CHALIE(JJJ) MCHARG.KCHARG(N)=MCHAR1.KCHARG(JJJ) 1203 CONTINUE 1202 CONTINUE ID1=MCHARG RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE LISTREEL ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1300 CONTINUE C Decompte pour dimensionnement JG = 0 DO 1301 III=1,NBFUS MLREE1 = SID.IPOINT(III) 1301 CONTINUE SEGINI,MLREEL C Remplissage N=0 DO 1302 III=1,NBFUS MLREE1 = SID.IPOINT(III) DO 1303 JJJ=1,N1 N = N + 1 1303 CONTINUE 1302 CONTINUE ID1=MLREEL RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE LISTENTI ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1400 CONTINUE C Decompte pour dimensionnement JG = 0 DO 1401 III=1,NBFUS MLENT1 = SID.IPOINT(III) JG = JG + MLENT1.LECT(/1) 1401 CONTINUE SEGINI,MLENTI C Remplissage N=0 DO 1402 III=1,NBFUS MLENT1 = SID.IPOINT(III) N1 = MLENT1.LECT(/1) DO 1403 JJJ=1,N1 N = N + 1 MLENTI.LECT(N)=MLENT1.LECT(JJJ) MLENTI.LECT(N)=MLENT1.LECT(JJJ) MLENTI.LECT(N)=MLENT1.LECT(JJJ) MLENTI.LECT(N)=MLENT1.LECT(JJJ) MLENTI.LECT(N)=MLENT1.LECT(JJJ) MLENTI.LECT(N)=MLENT1.LECT(JJJ) 1403 CONTINUE 1402 CONTINUE ID1=MLENTI RETURN RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C FUSION DE LISTMOTS ESCLAVES : CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1500 CONTINUE C Decompte pour dimensionnement JGN = 0 JGM = 0 DO 1501 III=1,NBFUS MLMOT1 = SID.IPOINT(III) 1501 CONTINUE SEGINI,MLMOTS C Remplissage N=0 DO 1502 III=1,NBFUS MLMOT1 = SID.IPOINT(III) DO 1503 JJJ=1,N1 N = N + 1 1503 CONTINUE 1502 CONTINUE ID1=MLMOTS RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales