operso
C OPERSO SOURCE PASCAL 22/11/21 21:15:05 11502 SUBROUTINE OPERSO C_______________________________________________________________________ C C SOUSTRAIT 2 NOMBRES (ENTIER OU FLOTTANT) C 2 CHPS/ELMTS C 2 CHPS/POINT C 2 EVOLUTIONS C 2 LISTES ENTIERES C 2 LISTES REELLES C 2 TABLE SOUSTYPE 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) -INC PPARAM -INC CCOPTIO -INC SMTABLE -INC SMLENTI -INC SMLREEL PARAMETER (NCLEVO = 2) C CHARACTER*4 CLEVO(NCLEVO) REAL*8 FLOT1 DATA CLEVO/'ABSC','ORDO'/ INTEGER ICH1 INTEGER IOPERA INTEGER IARGU INTEGER I1 REAL*8 FLO INTEGER ICHR INTEGER IRET ICH1 = 0 IOPERA = 0 IARGU = 0 I1 = 0 FLO = 0.D0 ICHR = 0 IRET = 0 CHA1 = ' ' CHA2 = ' ' * * RECHERCHE DU TYPE DU PREMIER ARGUMENT * IRETOU=0 C_______________________________________________________________________ C C CHERCHE A LIROBJ DES CHAMPS PAR ELEMENT (MCHAML) C_______________________________________________________________________ C IF (CTYP .NE. 'MCHAML') GOTO 102 IF (IRETOU.EQ.0) GOTO 102 IF (IRETOU.EQ.0) THEN IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 102 ENDIF C IOPERA= 4 pour l'operation ADDITION IOPERA= 4 IF (CTYP .EQ. 'MCHAML ') THEN C IARGU = 2 pour MCHAML - FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT - MCHAML IARGU = 21 ENDIF I1 = 0 ICHR = 0 IRET = 0 IF(IRET.NE.0) THEN ELSE ENDIF RETURN ELSE IF (IPCHAD.EQ.0) RETURN ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES CHPOINT C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 103 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 103 ENDIF IF(IRET.EQ.0) RETURN RETURN C_______________________________________________________________________ C C SOUSTRACTION CHPOINT-FLOTTANT OU FLOTTANT-CHPOINT C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 104 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 104 ENDIF C IOPERA= 4 pour l'operation SOUSTRACTION IOPERA= 4 IF (CTYP .EQ. 'CHPOINT ') THEN C IARGU = 2 pour CHPOINT - FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT - CHPOINT IARGU = 21 ENDIF I1 = 0 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES EVOLUTIONS C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 105 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 105 ENDIF IF(IRET.EQ.0) RETURN RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ DES LISTREEL C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 106 MLREEL=ICH1 SEGACT,MLREEL IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 106 ENDIF MLREEL=ICHR SEGACT,MLREEL C IOPERA= 4 pour l'operation SOUSTRACTION C IARGU = 0 IOPERA= 4 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 GOTO 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 LISTENTI C_______________________________________________________________________C IF(IRETOU.EQ.0) GOTO 1062 MLREEL=IPO1 SEGACT,MLREEL IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 1062 ENDIF C Conversion du LISTENTI en LISTREEL SEGACT,MLENTI JG=LECT(/1) SEGINI,MLREEL DO IG=1,JG ENDDO IF( CTYP .EQ. 'LISTENTI') THEN ELSE 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=ICH1 SEGACT,MLREEL IF(IR2 .EQ. 0) THEN CALL REFUS GOTO 1063 ENDIF C IOPERA= 4 pour l'operation SOUSTRACTION IOPERA= 4 IF (CTYP .EQ. 'LISTREEL') THEN C IARGU = 2 pour LISTREEL - FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT - LISTREEL IARGU = 21 ENDIF 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 MLENTI=MLENT1 SEGACT,MLENTI IF( (IR1.EQ.0) .AND. (IR2.EQ.0)) THEN CALL REFUS GOTO 107 ENDIF C Soustraction entre l'ENTIER/FLOTTANT et tous les indices du LISTENTIER JG=MLENT1.LECT(/1) IF (IR1 .NE. 0) THEN C Cas de la soustraction avec un ENTIER SEGINI,MLENT2 DO IG=1,JG IF( CTYP .EQ. 'ENTIER ') THEN IENT1 = I1 - MLENT1.LECT(IG) MLENT2.LECT(IG)= IENT1 ELSE IENT1 = MLENT1.LECT(IG) - I1 MLENT2.LECT(IG)= IENT1 ENDIF ENDDO SEGACT,MLENT2*NOMOD ELSEIF (IR2 .NE. 0) THEN C Cas de la soustraction avec un FLOTTANT SEGINI,MLREE2 DO IG=1,JG IF( CTYP .EQ. 'FLOTTANT') THEN FLOT1 = X1 - REAL(MLENT1.LECT(IG)) ELSE FLOT1 = REAL(MLENT1.LECT(IG)) - X1 ENDIF ENDDO SEGACT,MLREE2*NOMOD ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 2 NOMBRES ENTIER C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 108 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 108 ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 2 NOMBRES FLOTTANTS C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 109 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 109 ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 2 TABLES SOUS-TYPE VECTEUR C_______________________________________________________________________ IF (IRETOU.EQ.0) GOTO 110 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 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 * 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'EST PASSE OU CA A CASSE ON SORT IF (IERR.NE.0) RETURN GOTO 71 72 CONTINUE * 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) * SI ENTIER ON OPPOSE IF (MTABTV(MLOTAB).EQ.'ENTIER ') MTABIV(MLOTAB)=-MTABIV(MLOTAB) 71 CONTINUE SEGDES MTABLE,MTAB1,MTAB2 RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 EVOLUTIO ET 1 ENTIER / FLOTTANT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 111 IF(IREENT.EQ.0) THEN I1=0 IF(IREFLO.EQ.0) THEN CALL REFUS GOTO 111 ELSE IF (CTYP .EQ. 'EVOLUTIO') THEN C IARGU = 2 pour EVOLUTIO - FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT - EVOLUTIO IARGU = 21 ENDIF ENDIF ELSE FLO=REAL(0.D0) IF (CTYP .EQ. 'EVOLUTIO') THEN C IARGU = 1 pour EVOLUTIO - ENTIER IARGU = 1 ELSE C IARGU = 11 pour ENTIER - EVOLUTIO IARGU = 11 ENDIF ENDIF C Soustraction entre l'ENTIER/FLOTTANT et tous les indices du EVOLUTIO C IOPERA= 4 pour l'operation SOUSTRACTION IOPERA= 4 ICLE = 0 IF (ICLE.EQ.0) ICLE = 2 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ 1 NUAGE ET 1 ENTIER / FLOTTANT C_______________________________________________________________________ IF(IRETOU.EQ.0) GOTO 120 IF (IREENT.EQ.0) THEN I1=0 IF (IREFLO.EQ.0) THEN CALL REFUS GOTO 120 ELSE IF (CTYP .EQ. 'NUAGE ') THEN C IARGU = 2 pour NUAGE - FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT - NUAGE IARGU = 21 ENDIF ENDIF ELSE FLO=REAL(0.D0) IF (CTYP .EQ. 'NUAGE ') THEN C IARGU = 1 pour NUAGE - ENTIER IARGU = 1 ELSE C IARGU = 11 pour ENTIER - NUAGE IARGU = 11 ENDIF ENDIF C Lecture du nom de la composante IF (IERR.NE.0) RETURN C Soustraction entre l'ENTIER/FLOTTANT et les valeurs du NUAGE C IOPERA= 4 pour l'operation SOUSTRACTION IOPERA= 4 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 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales