operad
C OPERAD SOURCE PASCAL 22/11/21 21:15:04 11502 SUBROUTINE OPERAD C_______________________________________________________________________ C C ADDITIONNE 2 NOMBRES (ENTIER OU FLOTTANT) C 2 CHPS/ELMTS C 2 CHPS/POINT C 2 EVOLUTIONS C 2 LISTES REELLES C 2 LISTES ENTIERES C 2 TABLES SOUS-TYPE VECTEUR C C PASSAGE AUX NOUVEAUX MCHAMLS PAR JM CAMPENON LE 29 10 90 C C_______________________________________________________________________ C IMPLICIT INTEGER(I-N) IMPLICIT real*8 (a-h,o-z) C -INC PPARAM -INC CCOPTIO -INC SMTABLE -INC SMLENTI -INC SMLREEL PARAMETER (NCLEVO = 2) C LOGICAL ir1 CHARACTER*4 CLEVO(NCLEVO) REAL*8 FLOT1 REAL*8 FLOTTO REAL*8 X1,X2 INTEGER ENTI1 INTEGER ENTITO INTEGER ICH1 INTEGER IOPERA INTEGER IARGU INTEGER I1 REAL*8 FLO INTEGER ICHR INTEGER IR2 INTEGER IRET INTEGER IRETOU INTEGER IREFLO DATA CLEVO/'ABSC','ORDO'/ ICH1 = 0 IOPERA = 0 IARGU = 0 I1 = 0 FLO = 0.D0 ICHR = 0 IRET = 0 CHA1 = ' ' CHA2 = ' ' CTYP = ' ' C_______________________________________________________________________ C C RECHERCHE DU TYPE DU PREMIER ARGUMENT C_______________________________________________________________________ IRETOU = 0 C_______________________________________________________________________ C C CHERCHE A LIRE DEUX MCHAML OU MCHAML ET FLOTTANT C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 102 IF (IRETOU .EQ. 0) THEN IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 102 ENDIF C IOPERA= 3 pour l'operation ADDITION IOPERA= 3 C IARGU = 2 pour MCHAML + FLOTTANT IARGU = 2 I1 = 0 ICHR = 0 IRET = 0 IF(IRET.NE.0) THEN ELSE ENDIF ELSE IF (IPCHAD .EQ. 0) RETURN ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIRE DES CHPOINT C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 103 IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 103 ENDIF IF(IRET.EQ.0) RETURN RETURN C_______________________________________________________________________ C C CHERCHE A LIRE UN CHPOINT ET UN FLOTTANT C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 104 IF (IRETOU.EQ.0) THEN CALL REFUS GO TO 104 ENDIF C IOPERA= 3 pour l'operation ADDITION C IARGU = 2 pour FLOTTANT IOPERA= 3 IARGU = 2 I1 = 0 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES EVOLUTIO C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 105 IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 105 ENDIF IF(IRET.EQ.0) RETURN RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES LISTREEL C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 106 MLREEL=ICH SEGACT,MLREEL IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 106 ENDIF MLREEL=ICHR SEGACT,MLREEL C Addition entre LISTREEL et LISTREEL terme a terme C IOPERA= 3 pour l'operation ADDITION C IARGU = 0 pour ne pas utiliser I1 et FLO IOPERA= 3 IARGU = 0 I1 = 0 FLO = REAL(0.D0) IF(IRET.NE.0) THEN MLREEL=ICHR SEGACT,MLREEL*NOMOD ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES LISTENTI C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 1061 MLENTI=IPO1 SEGACT,MLENTI IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 1061 ENDIF MLENTI=IPO2 SEGACT,MLENTI IF(IRET.EQ.0) RETURN MLENTI=IRET SEGACT,MLENTI*NOMOD RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 LISTREEL ET 1 LISTE ENTIER C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 1062 MLREEL=IPO1 SEGACT,MLREEL IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 1062 ELSE C Conversion du LISTENTI en LISTREEL SEGACT MLENTI JG=LECT(/1) SEGINI MLREEL DO IG=1,JG FLOT1 = REAL(LECT(IG)) ENDDO ENDIF IF(IRET.EQ.0) RETURN MLREEL=IRET SEGACT,MLREEL*NOMOD RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 LISTREEL ET 1 ENTIER / FLOTTANT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 1063 MLREEL=ICH SEGACT,MLREEL IF(IRETOU.EQ.0) THEN CALL REFUS GO TO 1063 ENDIF C Addition entre l'ENTIER/FLOTTANT et tous les indices du LISTREEL C IOPERA= 3 pour l'operation ADDITION C IARGU = 2 pour FLOTTANT IOPERA= 3 IARGU = 2 I1 = 0 IF(IRET.NE.0) THEN MLREEL=ICHR SEGACT,MLREEL*NOMOD ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 LISTENTI ET 1 ENTIER / FLOTTANT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 107 IF( (IRET1.EQ.0) .AND. (IR2.EQ.0)) THEN CALL REFUS GO TO 107 ELSE C Addition entre l''ENTIER/FLOTTANT et tous les indices du LISTENTIER SEGACT MLENT1 JG=MLENT1.LECT(/1) IF (IRET1 .NE. 0) THEN C Cas de la Addition avec un ENTIER SEGINI MLENT2 DO IG=1,JG IENT1 = I1 + MLENT1.LECT(IG) MLENT2.LECT(IG)= IENT1 ENDDO ELSEIF (IR2 .NE. 0) THEN C Cas de l''Addition avec un FLOTTANT SEGINI MLREE2 DO IG=1,JG FLOT1 = X1 + REAL(MLENT1.LECT(IG)) ENDDO SEGACT,MLREE2*NOMOD ENDIF ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIRE 2 NOMBRES ENTIERS C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 108 IF (IRETOU.EQ.0) THEN CALL REFUS GO TO 108 ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIRE 2 NOMBRES FLOTTANTS C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 109 IF (IRETOU.EQ.0) THEN CALL REFUS GO TO 109 ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 2 TABLES SOUS-TYPE VECTEUR C_______________________________________________________________________ IF(IRETOU.EQ.0) GO TO 110 IF (IRETOU.EQ.0) THEN CALL REFUS GO TO 110 ENDIF SEGINI,MTABLE=MTAB1 SEGACT MTAB2 DO 71 J=1,MTAB2.MLOTAB CHA1=MTAB2.MTABTI(J) X1=MTAB2.RMTABI(J) IVA1=MTAB2.MTABII(J) DO 72 I=1,MLOTAB IF (CHA1.NE.MTABTI(I)) GOTO 72 IF (CHA1.EQ.'FLOTTANT') THEN IF (X1.NE.RMTABI(I)) GOTO 72 ELSE IF (IVA1.NE.MTABII(I)) GOTO 72 ENDIF C ON A UN INDICE COMMUN ON REGARDE SI LE TYPE DE LA DONNEE EST SOMMABLE CHA2=MTAB2.MTABTV(J) IF (CHA2.EQ.'FLOTTANT') THEN IF (MTABTV(I).EQ.'FLOTTANT') THEN RMTABV(I)=RMTABV(I)+MTAB2.RMTABV(J) ELSEIF (MTABTV(I).EQ.'ENTIER ') THEN MTABTV(I)='FLOTTANT' RMTABV(I)=MTABIV(I)+MTAB2.RMTABV(J) ELSE ENDIF ELSEIF (CHA2.EQ.'ENTIER ') THEN IF (MTABTV(I).EQ.'ENTIER ') THEN MTABIV(I)=MTABIV(I)+MTAB2.MTABIV(J) ELSEIF (MTABTV(I).EQ.'FLOTTANT') THEN RMTABV(I)=RMTABV(I)+MTAB2.MTABIV(J) ELSE ENDIF ELSE IF (MTABTV(I).NE.CHA2.OR.MTABTV(I).NE.MTAB2.MTABTV(J)) ENDIF C C'EST PASSE OU CA A CASSE ON SORT IF (IERR.NE.0) RETURN GOTO 71 72 CONTINUE C ON RAJOUTE LE MTAB2(J) A MTABL MLOTAB=MLOTAB+1 M=MTABII(/1) IF (M.LT.MLOTAB) THEN M=M+100 SEGADJ MTABLE ENDIF MTABII(MLOTAB)=MTAB2.MTABII(J) MTABTI(MLOTAB)=MTAB2.MTABTI(J) RMTABI(MLOTAB)=MTAB2.RMTABI(J) MTABIV(MLOTAB)=MTAB2.MTABIV(J) MTABTV(MLOTAB)=MTAB2.MTABTV(J) RMTABV(MLOTAB)=MTAB2.RMTABV(J) 71 CONTINUE SEGDES MTABLE,MTAB1,MTAB2 RETURN C_______________________________________________________________________ C C EST CE UNE TABLE ESCLAVE DE MCHAML C_______________________________________________________________________ 110 CONTINUE if (iretou.eq.0) goto 111 segact mtable ml=mlotab C l'indice 1 est le sous type ind=mtabii(3) ctyp=' ' > CTYP,enti1,flot1,' ',ir1,id1) iretou=id1 if (CTYP.eq.'MCHAML') then do i=4,ml ind=mtabii(i) > CTYP,id3,rr1,' ',ir1,id2) if (ierr.ne.0) return id1=iretou enddo elseif (CTYP.eq.'CHPOINT ') then do i=4,ml ind=mtabii(i) > CTYP,id3,rr1,' ',ir1,id2) if (ierr.ne.0) return id1=iretou enddo elseif (CTYP.eq.'LISTREEL') then IOPERA= 3 IARGU = 0 iretou=id1 I1 = 0 FLO = REAL(0.D0) iret=0 do i=4,ml ind=mtabii(i) > CTYP,id3,rr1,' ',ir1,id2) if (ierr.ne.0) return MLREEL=ID2 SEGACT,MLREEL enddo elseif (CTYP.eq.'LISTENTI') then do i=4,ml ind=mtabii(i) > CTYP,id3,rr1,' ',ir1,id2) if (ierr.ne.0) return MLENTI=ID2 SEGACT,MLENTI id1=iretou enddo elseif (CTYP.eq.'EVOLUTIO') then do i=4,ml ind=mtabii(i) > CTYP,id3,rr1,' ',ir1,id2) if (ierr.ne.0) return id1=iretou enddo elseif (CTYP.eq.'ENTIER') then ENTITO=MTABLE.MTABIV(3) do i=4,ml ENTITO=ENTITO+MTABLE.MTABIV(I) enddo return elseif (CTYP.eq.'FLOTTANT') then FLOTTO=RMTABV(3) do i=4,ml FLOTTO=FLOTTO+MTABLE.RMTABV(I) enddo return else moterr(1:8)='MCHAML ' return endif segdes mtable 100 continue if (ierr.ne.0) return return C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 EVOLUTIO ET 1 ENTIER / FLOTTANT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 112 IF(IREENT.EQ.0) THEN IF(IREFLO.EQ.0) THEN CALL REFUS GOTO 112 ELSE C IARGU = 2 pour FLOTTANT IARGU = 2 ENDIF ELSE C IARGU = 1 pour ENTIER IARGU = 1 ENDIF C Lecture facultative des mots-cles ABSC/ORDO ICLE = 0 IF (ICLE.EQ.0) ICLE = 2 C Addition entre l'ENTIER/FLOTTANT et tous les indices du EVOLUTIO C IOPERA= 3 pour l'operation ADDITION IOPERA= 3 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 NUAGE ET 1 ENTIER / FLOTTANT ET 1 MOT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 120 IF(IREENT.EQ.0) THEN IF(IREFLO.EQ.0) THEN CALL REFUS GOTO 120 ELSE C IARGU = 2 pour FLOTTANT IARGU = 2 ENDIF ELSE C IARGU = 1 pour ENTIER IARGU = 1 ENDIF C Lecture du nom de la composante IF (IERR.NE.0) RETURN C Addition entre l'ENTIER/FLOTTANT et les valeurs du NUAGE C IOPERA= 3 pour l'operation ADDITION IOPERA= 3 IF (IERR.NE.0) RETURN IF (IRET.NE.0) THEN ELSE C ERREUR 5 car erreurs gerees dans OPNUA1 ENDIF RETURN C_______________________________________________________________________ C C ON A DONC RIEN TROUVE POUR FAIRE L OPERATION C_______________________________________________________________________ 120 CONTINUE IF(IRETOU.NE.0) THEN IF (IRETOU.EQ.0) MOTERR(9:16) = ' ???? ' ELSE ENDIF END
© Cast3M 2003 - Tous droits réservés.
Mentions légales