operdi
C OPERDI SOURCE PASCAL 22/11/21 21:15:04 11502 SUBROUTINE OPERDI C_______________________________________________________________________ C C DIVISE UN LISTREEL PAR UN FLOTTANT (OU UN ENTIER) C DIVISE UN LISTREEL PAR UN LISTREEL (OU UN LISTENTI) : Terme à terme C DIVISE UN CHAMPS PAR ELEMENT PAR UN FLOTTANT (OU 1 ENTIER) C DIVISE UN OBJET RIGIDITE PAR UN FLOTTANT (OU UN ENTIER) C DIVISE UN CHPOINT PAR UN CHPOINT C DIVISE UN CHPOINT PAR UN FLOTTANT (OU UN ENTIER) C DIVISE 2 NOMBRES (FLOTTANT OU ENTIER) C DIVISE UN POINT PAR UN NOMBRE C DIVISE UN OBJET EVOLUTIO PAR UN FLOTTANT (OU UN ENTIER) : Ordonnee C DIVISE UN OBJET EVOLUTIO PAR UN OBJET EVOLUTIO C DIVISE UNE TABLE SOUSTYPE VECTEUR PAR UN REEL C C PASSAGE AUX NOUVEAUX MCHAMLS PAR JM CAMPENON LE 12/90 C C_______________________________________________________________________ C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) C -INC CCREEL -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMTABLE -INC SMLENTI -INC SMLREEL -INC SMLMOTS -INC SMLCHPO PARAMETER (NCLEVO = 2) C CHARACTER*4 CLEVO(NCLEVO) INTEGER ICH1 INTEGER IOPERA INTEGER IARGU INTEGER I1 REAL*8 FLO INTEGER ICHR INTEGER IRET DATA CLEVO/'ABSC','ORDO'/ ICH1 = 0 IOPERA = 0 IARGU = 0 I1 = 0 ICHR = 0 IRET = 0 FLO = 0.D0 XUN = 1.D0 C_______________________________________________________________________ C C RECHERCHE DU TYPE DU PREMIER ARGUMENT C_______________________________________________________________________ C_______________________________________________________________________ C C CHERCHE A LIROBJ DEUX MCHAML C_______________________________________________________________________ C IF (IRETOU.EQ.0) IPMODL=0 IF(IRETOU.EQ.0) GOTO 101 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 101 ENDIF C LMOT1 = -1 LMOT2 = -1 LMOT3 = -1 ILREE = -1 IF ( IRETOU .EQ. 1) THEN IF (IERR .NE. 0) RETURN IF (IERR .NE. 0) RETURN IF (IERR .NE. 0) RETURN ENDIF C $ -1) IF(IERR.NE.0) RETURN C IF (IPCHDI.NE.0) THEN ELSE ENDIF RETURN 101 CONTINUE IF (IERR.NE.0) RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN MCHAML ET UN FLOTTANT C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 102 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 102 ENDIF C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 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 C_______________________________________________________________________ C C CHERCHE A LIRE DEUX CHPOINT C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 103 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 103 ENDIF IF ( IRETOU .EQ. 1) THEN IF (IERR .NE. 0) RETURN IF (IERR .NE. 0) RETURN IF (IERR .NE. 0) RETURN IF(IRETOU .EQ. 1)THEN SEGACT,MLREE1 ENDIF SEGACT,MLMOT1,MLMOT2,MLMOT3 ELSE ENDIF IF (IERR .NE. 0) RETURN IF (IRET.NE.0) THEN ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN CHPOINT ET UN FLOTTANT C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 104 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 104 ENDIF C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 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 UN OBJET DE TYPE RIGIDITE ET UN FLOTTANT C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 1041 IF (CTYP .EQ. 'ENTIER') THEN CALL REFUS GOTO 1041 ENDIF IF (CTYP .EQ. 'FLOTTANT') THEN CALL REFUS GOTO 1041 ENDIF IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 1041 ENDIF IF (FLO.EQ.0.) GOTO 5000 RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN OBJET DE TYPE MATRIK ET UN FLOTTANT C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 105 IF (CTYP .EQ. 'ENTIER') THEN CALL REFUS GOTO 105 ENDIF IF (CTYP .EQ. 'FLOTTANT') THEN CALL REFUS GOTO 105 ENDIF IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 105 ENDIF IF (ABS(FLO).LT.XPETIT) GOTO 5000 RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN OBJET DE TYPE EVOLUTIO ET UN FLOTTANT C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 106 IF(IREENT.EQ.0) THEN I1 = 0 IF(IREFLO.EQ.0) THEN CALL REFUS GOTO 106 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 = 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 IOPERA= 5 pour l'operation DIVISION IOPERA= 5 ICLE = 0 IF (ICLE.EQ.0) ICLE = 2 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C EVOLUTIO / EVOLUTIO C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 107 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 107 ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN LISTREEL ET UN LISTREEL C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 1071 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 1071 ENDIF C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 IARGU = 0 I1 = 0 FLO = 0.D0 IF(IRET.NE.0) THEN ELSE ENDIF RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN LISTREEL ET UN LISTENTI C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 1072 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 1072 ENDIF SEGACT MLREE1,MLENT1 JG=MLENT1.LECT(/1) RETURN ENDIF SEGINI MLREE2 DO I=1,JG IF(CTYP .EQ. 'LISTENTI') THEN IF(X2.EQ.0.D0) GOTO 5000 ELSE X2 = REAL(MLENT1.LECT(I)) IF(X2.EQ.0.) GOTO 5000 ENDIF ENDDO SEGACT,MLREE2*NOMOD RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN LISTENTI ET UN LISTENTI C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 108 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 108 ENDIF SEGACT,MLENT1,MLENT2 JG=MLENT2.LECT(/1) IF(MLENT1.LECT(/1) .NE. JG) THEN RETURN ENDIF SEGINI,MLENT3 DO I=1,JG I1 = MLENT2.LECT(I) IF(I1 .EQ. 0 ) GOTO 5000 MLENT3.LECT(I)=MLENT1.LECT(I)/I1 ENDDO SEGACT,MLENT3*NOMOD RETURN C_______________________________________________________________________ C C LISTREEL / FLOTTANT OU ENTIER C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 1081 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 1081 ENDIF C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 IF (CTYP .EQ. 'LISTREEL') THEN C IARGU = 2 pour LISTREEL / FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT / LISTREEL (terme a terme) IARGU = 21 ENDIF I1 = 0 IF(IRET.NE.0) THEN MLREEL=ICHR SEGACT,MLREEL*NOMOD ELSE ENDIF RETURN C_______________________________________________________________________ C C LISTENTI / FLOTTANT OU ENTIER C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 109 IF (CTYP .EQ. 'ENTIER') THEN CALL REFUS GOTO 109 ENDIF IF (CTYP .EQ. 'FLOTTANT') THEN CALL REFUS GOTO 109 ENDIF IF(IRETOU.EQ.0) THEN GOTO 1082 ELSE IF (CTYP .EQ. 'ENTIER') GOTO 109 IF(I1.EQ.0) GOTO 5000 SEGACT,MLENT1 JG=MLENT1.LECT(/1) SEGINI,MLENT2 DO I=1, JG MLENT2.LECT(I)=MLENT1.LECT(I)/I1 ENDDO SEGACT,MLENT2*NOMOD RETURN ENDIF IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 109 ELSE IF(ABS(FLO).LT.XPETIT) GOTO 5000 SEGACT,MLENT1 JG=MLENT1.LECT(/1) SEGINI,MLREE1 DO I=1, JG ENDDO SEGACT,MLREE1*NOMOD RETURN ENDIF C_______________________________________________________________________ C C CHERCHE A LIROBJ 2 ENTIERS C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 110 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 110 ENDIF C Cas de la division de 2 ENTIERS RETURN C_______________________________________________________________________ C C CHERCHE A LIRE DEUX FLOTTANTS C_______________________________________________________________________ IF ( IRETOU.EQ.0) GOTO 111 IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 111 ENDIF C Cas de la division de 2 FLOTTANTS IF(ABS(X2) .LT. XPETIT) GOTO 5000 *sg IF(ABS(X2).LT.1.D0.AND.ABS(X1).GT.XGRAND*ABS(X2)) THEN IF (ABS(X2).LT.1.D0) THEN IF (ABS(X1).GT.XGRAND*ABS(X2)) THEN XFLO = SIGN(XUN,X1)*SIGN(XUN,X2)*XGRAND GOTO 1101 ENDIF ENDIF *sg ELSEIF(ABS(X1).LT.XUN.AND.ABS(X2).GT.XGRAND*ABS(X1)) THEN IF (ABS(X1).LT.XUN) THEN IF (ABS(X2).GT.XGRAND*ABS(X1)) THEN XFLO = 0.D0 GOTO 1101 ENDIF ENDIF XFLO = X1/X2 1101 CONTINUE RETURN C_______________________________________________________________________ C C CHERCHE A LIROBJ UN POINT ET UN FLOTTANT C_______________________________________________________________________ C IF (IRETOU.EQ.0) GOTO 112 IF (CTYP .EQ. 'ENTIER') THEN CALL REFUS GOTO 112 ENDIF IF (CTYP .EQ. 'FLOTTANT') THEN CALL REFUS GOTO 112 ENDIF IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 112 ENDIF IF(ABS(X2).LT.XPETIT) GOTO 5000 SEGACT MCOORD*MOD ID=IDIM+1 IREF=ID*(IP1-1) DO 11 I=1,ID XCOOR(**)=XCOOR(IREF+I)/X2 11 CONTINUE nbpts=nbpts+1 IR=nbpts RETURN C_______________________________________________________________________ C C CHERCHE A LIRE UNE TABLE SOUSTYPE VECTEUR ET UN FLOTTANT C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 113 IF (CTYP .EQ. 'ENTIER') THEN CALL REFUS GOTO 113 ENDIF IF (CTYP .EQ. 'FLOTTANT') THEN CALL REFUS GOTO 113 ENDIF IF (IRETOU.EQ.0) THEN CALL REFUS GOTO 113 ENDIF IF(ABS(X2).LT.XPETIT) GOTO 5000 SEGINI,MTABLE=MTAB1 DO 701 I=1,MLOTAB IF (MTABTV(I).EQ.'FLOTTANT') THEN RMTABV(I)=RMTABV(I)/X2 ELSEIF (MTABTV(I).EQ.'ENTIER ') THEN RMTABV(I)=MTABIV(I)/X2 MTABTV(I)='FLOTTANT' ENDIF 701 CONTINUE SEGDES MTABLE,MTAB1 RETURN C_______________________________________________________________________ C C LISTCHPO / LISTREEL C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 114 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 114 ENDIF mlreel = lree1 mlchp1 = lipo1 segact mlchp1,mlreel n1 = mlchp1.ichpoi(/1) if (ierr.ne.0) return segini mlchpo do ic = 1,n1 ipo1 = mlchp1.ichpoi(ic) IF(ABS(FLO).LT.XPETIT) GOTO 5000 FLD=FLO IF(IRET.EQ.0) RETURN ichpoi(ic) = iret enddo RETURN C_______________________________________________________________________ C C NUAGE / ENTIER C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 115 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 115 ENDIF IF (I1.EQ.0) GOTO 5000 IF (IERR.NE.0) RETURN C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 IF (CTYP .EQ. 'NUAGE ') THEN C IARGU = 1 pour NUAGE / FLOTTANT IARGU = 1 ELSE C IARGU = 11 pour FLOTTANT / NUAGE (terme a terme) IARGU = 11 ENDIF FLO = 0.D0 C Lecture du nom de la composante IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF(IRET.NE.0) THEN ELSE C ERREUR 5 car erreurs gerees dans OPNUA1 ENDIF RETURN C_______________________________________________________________________ C C NUAGE / FLOTTANT C_______________________________________________________________________ C IF(IRETOU.EQ.0) GOTO 120 IF(IRETOU.EQ.0) THEN CALL REFUS GOTO 120 ENDIF IF (ABS(FLO).LT.XPETIT) GOTO 5000 IF (IERR.NE.0) RETURN C IOPERA= 5 pour l'operation DIVISION IOPERA= 5 IF (CTYP .EQ. 'NUAGE ') THEN C IARGU = 2 pour NUAGE / FLOTTANT IARGU = 2 ELSE C IARGU = 21 pour FLOTTANT / NUAGE (terme a terme) IARGU = 21 ENDIF I1 = 0 C Lecture du nom de la composante IF (IERR.NE.0) RETURN 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_______________________________________________________________________ C 120 CONTINUE IF(IRETOU.NE.0) THEN IF (IRETOU.EQ.0) MOTERR(9:16) = ' ???? ' ELSE ENDIF RETURN 5000 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales