C PULIRF SOURCE BP208322 12/05/24 21:15:06 7378 SUBROUTINE PULIRF(IPO1,XFLOT,IENTI,IPO2,IRET) C======================================================================= C C ENTREES C IPO1 = POINTEUR SUR LE LISTREEL A ELEVER A LA PUISSANCE C XFLOT ou IENTI C IRET = 2 SI PUISSANCE REELLE (XFLOT) C = 1 SI PUISSANCE ENTIERE (IENTI) C XFLOT = REEL (POSITIF OU NEGATIF) C IENTI = ENTIER (POSITIF OU NEGATIF) C SORTIES C IPO2 = POINTEUR SUR LE LISTREEL RESULTANT C C CODE BEAUFILS MAI 87 C C======================================================================= IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) LOGICAL INF1,TEST1 -INC CCOPTIO -INC SMLREEL -INC CCREEL C XGRNEG=-1.D0*XGRAND c MLREE1=IPO1 SEGACT MLREE1 NP=MLREE1.PROG(/1) C C INITIALISATION DU LISTREEL C JG=NP SEGINI MLREEL IPO2=MLREEL C IF(IRET.EQ.1)GOTO 4 C======================================================================= C L'EXPOSANT EST UN REEL C c PREC=1.E-20 c bp: PREC est arbitraire et inutile : laissons la machine faire son job c c On ne peut pas élever à une puissance réelle un nombre négatif c sous peine d obtenir NAN ISTO=0 DO II=1,NP IF((MLREE1.PROG(II)).LT.0.D0)ISTO=1 ENDDO IF (ISTO.EQ.1) THEN CALL ERREUR(213) SEGDES MLREE1 SEGSUP MLREEL RETURN ENDIF C c cas particulier Y**0 = 1 IF (XFLOT.EQ.0.D0) THEN DO 1 II=1,NP PROG(II)=1.D0 1 CONTINUE TEST1=.false. C c bp (05/2012) : ajout du cas SQRT ELSEIF (XFLOT.EQ.0.5D0) THEN DO II=1,NP PROG(II)=SQRT(MLREE1.PROG(II)) ENDDO TEST1=.false. C ELSE DO II=1,NP c IF (ABS(MLREE1.PROG(II)).LE.PREC) THEN c PROG(II)=0.D0 c ELSE PROG(II)=MLREE1.PROG(II)**XFLOT c ENDIF ENDDO TEST1=XFLOT.lt.0.D0 ENDIF GOTO 100 C C======================================================================= C L'EXPOSANT EST UN ENTIER C 4 IF (IENTI.EQ.0) THEN DO 5 II=1,NP PROG(II)=1.D0 5 CONTINUE TEST1=.false. C ELSE DO 6 II=1,NP PROG(II)=MLREE1.PROG(II)**IENTI 6 CONTINUE TEST1=IENTI.lt.0 ENDIF C C======================================================================= 100 CONTINUE c c on ajoute un petit avertissement en présence d'INF c (pas une erreur car ce resultat peut etre intermediaire et c finalement 1/INF=0 donc on peut continuer) INF1=.false. if (TEST1) then do ii=1,NP Y=PROG(ii) if(Y.gt.XGRAND.or.Y.lt.XGRNEG) INF1=.true. enddo endif if(INF1) write(6,*)'Attention: au moins une valeur est INFinie' C WRITE(IOIMP,*)NP C WRITE(IOIMP,*)(PROG(I),I=1,NP) SEGDES MLREE1 SEGDES MLREEL 666 CONTINUE RETURN END