$NOFLOATCALLS C*********************************************************************** C SUBROUTINE REVISE C C*********************************************************************** C C -- EQUILIBRIUM PRICE SEARCH ROUTINE -- C C THIS SUBROUTINE ESTIMATES PRICE CHANGES WHICH WILL MOVE ALL WORLD C ENERGY MARKETS TOWARD EQUILIBRIUM. THE SUBROUTINE ALSO TESTS TO C ENSURE THAT PRICE CHANGES DO IN FACT MOVE ALL MARKETS TOWARD C EQUILIBRIUM, AND AUTOMATICALLY REVISES ITS OWN ESTIMATES IN THE C EVENT THAT ANY DO NOT. C C VERSION: A.31.07.84 C C INTEGER INPUTS: NMKT C REAL INPUTS: PIM, XI, OLDPI, OLDXI, UIJ, VIJ C (DETERM, VEC1, VEC2, ARE REQUIRED BY THE MATRIX C INVERTER CALLED BY "MINV".) C INTEGER OUTPUTS: NAGN C REAL OUTPUTS: PIM, OLDPI, OLDXI, W C INTERNAL INTEGERS: NO C INTERNAL REAL: DP, X, OLDX C SUBROUTINES CALLED: ELAS, MINV C WRITTEN BY: C JAE EDMONDS LATEST REVISION: C 1 JANUARY 1982 31 JULY 1984 C BY: JAE EDMONDS C *PI CHANGED TO PIM C*********************************************************************** C C MAKE ALL REAL VARIABLES DOUBLE PRECISION C IMPLICIT REAL*8 (A-H,O-Z), INTEGER (I-N) C C COMMON BLOCKS $INCLUDE:'COMMON.FOR' C C LOCAL VARIABLES C REAL*8 DP(3),X,OLDX REAL*8 DETERM, VEC1(3), VEC2(3), W(3,3) INTEGER NDOWN C C ********************************************************** C *** SET NPUNT __ TEST VARIABLE USED TO ******************* C *** INITIATE THE AREA SEARCH ROUTINE ********************* C ********************************************************** C NPUNT=5 C *************************************************** C *** IF THIS IS THE FIRST TIME THROUGH THE *** C *** CONVERGENCE PROCESS THEN SKIP THIS SECTION. *** C C *************************************************** IF(NAGN.EQ.0) GO TO 5 IF(NDOWN.GT.NPUNT) GO TO 5 C C +------------------------------------------------------------+ C | CHECK TO SEE IF CONVERGENCE IS ACTUALLY OCCURRING: | C | A POSITION IS CONSIDERED IMPROVED | C | IF THE TOTAL VARIANCE OF THE POSITION | C | HAS DECREASED. | C +------------------------------------------------------------+ C C INITIALIZE "X", THE CURRENT C VARIANCE FROM EQUILIBRIUM VARIABLE, AND "OLDX" THE PREVIOUS C ITERATION'S VARIANCE REGISTER TO 0.0 C X=0.0 OLDX=0.0 DO 2 I=1,NMKT X=X+XI(I)**2 OLDX=OLDX+OLDXI(I)**2 2 CONTINUE IF (X .LT. OLDX) GO TO 5 C C IF X IS NOT LESS THAN OLDX THEN DEMAND AND SUPPLY ARE DIVERGING. C IF DEMAND AND SUPPLY ARE ACTUALLY DIVERGING, HALVE THE PRICE CHANGE C ON THE NPOINT-TH CONSECUTIVE PASS WITH DIVERGING C EQUILIBRIUM, CALL PUNT C IF(NDOWN.EQ.NPUNT) CALL PUNT NDOWN=NDOWN+1 IF(NDOWN.GT.NPUNT) RETURN C 3 DO 4 I=1,NMKT DP(I)=.25D0*DP(I) 4 CONTINUE C C SKIP DOWN TO NEW PRICE COMPUTATION C GO TO 70 C C ************************************************ C *** COMPUTE SUPPLY AND DEMAND ELASTICITIES *** C ************************************************ 5 CONTINUE NDOWN=0 CALL ELAS C C COMPUTE THE PRICE ELASTICITY DEMAND - SUPPLY DIFFERENCE MATRIX 'W' C DO 20 I=1,NMKT DO 10 J=1,NMKT W(I,J)=UIJ(I,J)-VIJ(I,J) 10 CONTINUE 20 CONTINUE C C SOLVE FOR REQUIRED PRICE CHANGES C C FIRST, COMPUTE 'W' INVERSE: C CALL MINV(W,NMKT,DETERM,VEC1,VEC2) C (NOTE: SUBROUTINE MINV ZEROES OUT DETERM, VEC1, AND VEC2) C C ---------------------------------------- C -- INDICATE THAT MINV HAS BEEN CALLED -- C ---------------------------------------- NTIMES=NTIMES+1 C C -- OUTPUT OPTION CONTROL C IF(NOPT(3)-1) 110,210,110 C 110 CONTINUE 210 CONTINUE C C ---------------------------------------------- C | SOLVE FOR DP(I) | C | AND CHECK FOR NEGATIVE ADJUSTED PRICES | C ---------------------------------------------- C DO 40 I=1,NMKT DP(I)=0.0 DO 30 J=1,NMKT TEMP=-W(I,J)*XI(J) DP(I)=DP(I)+TEMP 30 CONTINUE IF(DP(I).LT.-1.D0) DP(I)=-0.9D0 40 CONTINUE C C C SAVE 'XI' VECTOR VALUES TO COMPARE WITH RECOMPUTED 'XI', AND C SAVE 'PIM' VECTOR VALUES FOR FUTURE USE IF EQUILIBRIUM ADJUSTMENT C OVERSHOOTS C DO 60 I=1,NMKT OLDXI(I)=XI(I) OLDPI(I)=PIM(I,M) 60 CONTINUE C C -------------------------- C -- COMPUTE NEW PRICES -- C -------------------------- 70 CONTINUE DO 90 I=1,NMKT PIM(I,M)=OLDPI(I)*(1.D0+DP(I)) 90 CONTINUE C C INDICATE THAT THE CONVERGENCE PROCESS HAS BEEN USED AGAIN C NAGN=NAGN+1 C RETURN END