$NOFLOATCALLS C*********************************************************************** C SUBROUTINE XXXX C C*********************************************************************** C C -- EXCESS DEMAND CALCULATOR -- C C THIS SUBROUTINE CALCULATES EXCESS DEMANDS FOR ALL WORLD MARKETS, TESTS C FOR CONVERGENCE TO EQUILIBRIUM, AND INITIATES A CONVERGENCE PROCESS IF C EQUILIBRIUM IN ANY MARKET FAILS TO EXIST. IF EQUILIBRIUM IS ATTAINED, C THEN THE CONSISTENCY OF THE EXPORT/IMPORT SPECIFICATION IS TESTED. C C INTEGER INPUTS: NF, NL, NMKT, NXIL C C REAL INPUTS: EDIL, ESIL, TEST C C INTEGER OUTPUTS: NFAIL, NAJUST, NXIL(UNDER SOME CIRCUMSTANCES) C C REAL OUTPUTS: EDIMKT, ESIMKT, XI, DX C C SUBROUTINES CALLED: REVISE C C WRITTEN BY: C JAE EDMONDS LATEST REVISION: C 1 JANUARY 1982 1 SEPT 88 TO INCLUDE COMMON C 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 INITIALIZE THE MARKET CONVERGENCE COUNTER, NFAIL, AT ZERO C NFAIL=0 C C DO 10 I=1,NMKT EDIMKT(I)=1.D0 ESIMKT(I)=1.D0 C ------------------------------------------------- C -- SUM UP ENERGY DEMAND AND SUPPLY BY REGION -- C ------------------------------------------------- DO 20 L=1,NL EDIMKT(I)=EDIMKT(I)+EDRIL(I,L) ESIMKT(I)=ESIMKT(I)+ESRILM(I,L,M) 20 CONTINUE C ----------------------------------------------------- C -- TEST TO SEE IF EXCESS DEMAND IS WITHIN LIMITS -- C ----------------------------------------------------- XI(I)=DLOG(EDIMKT(I))-DLOG(ESIMKT(I)) IF ((XI(I) .GT. TEST) .OR. (XI(I) .LT. -TEST)) NFAIL=1 C DX(I)=EDIMKT(I)-ESIMKT(I) IF ((DX(I) .GT. 1.D0) .OR. (DX(I) .LT. -1.D0)) NFAIL=1 C C C 10 CONTINUE C +-------------------------------------------------------------------+ C | IF EXCESS DEMAND IN ANY SECTOR IS OUTSIDE OF THE LIMITS, THEN | C | CALL REVISE TO GENERATE A MORE EQUILIBRIOUS SET OF PRICES. | C +-------------------------------------------------------------------+ IF(NFAIL.EQ.0) NAGN=NAGN+1 IF(NFAIL.EQ.0) GO TO 30 C CALL REVISE 30 CONTINUE C C -- OUTPUT OPTION CONTROL C IF(NOPT(3)-1) 31,32,31 C 31 CONTINUE C C +---------------------------------+ C | INTERMEDIATE OUTPUT SECTION | C +---------------------------------+ C WRITE(JUNIT,1000) M, NAGN WRITE(JUNIT,1100) (I,ESIMKT(I),I=1,NMKT) WRITE(JUNIT,1200) (I,EDIMKT(I),I=1,NMKT) WRITE(JUNIT,1250) (PIM(I,M),I=1,NMKT) 1000 FORMAT(1H0,'PERIOD ',I1,4X,'ITERATION ',I2) 1100 FORMAT(1H0,3('ESIMKT(',I1,')=',F10.4,2X)) 1200 FORMAT(1X ,3('EDIMKT(',I1,')=',F10.4,2X)) 1250 FORMAT(1H0,'OIL PRICE=',F10.4,2X,'GAS PRICE=',F10.4,2X, & 'COAL PRICE=',F9.4) C 32 CONTINUE C RETURN END