Why Am I Getting an 'Out of Range in G Table' Error in FORTRAN?

  • Context: Fortran 
  • Thread starter Thread starter Aerospark
  • Start date Start date
  • Tags Tags
    Fortran
Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
1 reply · 3K views
Aerospark
Messages
2
Reaction score
0
Ok so basically I am trying to write code that can call from a fluid properties subroutine similar to refprop but it is called FLUID. I need to call the subroutine with temperature and pressure, and have it come back with density, compressibility, and etc. It should be able to do this, however I keep coming back with errors and I'm not sure why..

The error that I am getting according to the code description is due to being "out of range in G table."

Main Program:
Code:
PROGRAM GasProperties

INTEGER ENTRYdata,ERROR,IGOTO

LOGICAL VAPOR

DIMENSION PROPS(8)
COMMON/FLUIDC/ GAMMA,WL,WG,DENSL,DENSG,ENTL,ENTG,ENTHL,ENTHG
COMMON /FLUDPC/ G,TT,DD,GG,SAT,C,M,NG,N1,N2,N3,NS 

REAL P,T,D,Z,S,H,CV,CP,GAM,Rgas,SONIC,MU,NU,K,Prandtl,RHO
      
CALL DRYAIR

WRITE(*,*) 'Enter P (Mpa):'
READ(*,*) P
WRITE(*,*) 'Enter T (Kelvin):'
READ(*,*) T
ENTRYdata=3
IGOTO=1
CALL FLUID(T,P,RHO,PROPS,8,ENTRYData,VAPOR,ERROR,IGOTO)

!         PERFORM UNITS CONVERSIONS FOR OUTPUT AS FOLLOWS:
!           Pressure              from   MPa     to   Pa
!           Density               from   gm/cm^3 to   kg/m^3
!           Entropy               from   J/gmK   to   J/kgK
!           Enthalpy              from   J/gmK   to   J/kgK
!           Specific Heats        from  kJ/kgK   to   J/kgK
!           Sonic velocity                       to   m/s
!           Viscosity (mu)        from  gm/cm-s  to   kg/m-s
!           Thermal Conductivity  from   W/cmK   to  W/m-K

         D = RHO*1000.0
         Z=PROPS(1)
         S = PROPS(2)*1000.0
         H = PROPS(3)*1000.0
         CV = PROPS(4)*1000.0
         CP = PROPS(5)*1000.0
         GAM = CP/CV
	     Rgas  = CP-CV
         SONIC = PROPS(6)*SQRT(1000.0)
         MU = PROPS(7)*0.1
	     NU = MU/RHO
         K = PROPS(8)*100.0
	     Prandtl = CP*MU/K

WRITE(*,*) 'Error Value: ', ERROR
WRITE(*,*) 
WRITE(*,*) 'Density:                    ', RHO   
WRITE(*,*) 'Compressibility Factor:     ', Z   
WRITE(*,*) 'Entropy                     ', S    
WRITE(*,*) 'Enthalpy:                   ', H
WRITE(*,*) 'Specific Heat, Cv           ', CV
WRITE(*,*) 'Specific Heat, Cp:          ', CP
WRITE(*,*) 'Specific Heat Ratio, Gamma  ', GAMMA
WRITE(*,*) 'Sonic Velocity:             ', SONIC
WRITE(*,*) 'Dynamic Viscosity           ', MU
WRITE(*,*) 'Kinematic Viscosity         ', NU
WRITE(*,*) 'Thermal Conductivity        ', K
WRITE(*,*) 'Prandtl Number, Pr          ', Prandtl

END PROGRAM GasProperties

The subroutine DRYAIR is one of many (theres one for O2,N2,CO2 etc.) But basically it fills G,TT,DD,GG,SAT,C, and M matrices up with coefficients which are used as transport equations in the fluid subroutine:

DRYAIR CODE:
Code:
    SUBROUTINE DRYAIR
                                                        
  INTERFACE
    SUBROUTINE FLUID(T,P,RHO,PROPS,NP,ENTRYdata,VAPOR,ERROR,igoto)
      REAL,INTENT(IN OUT):: t
      REAL,INTENT(IN OUT):: p
      REAL,INTENT(IN OUT):: rho
      REAL,INTENT(OUT),DIMENSION(:):: props
      INTEGER,INTENT(IN):: np
      INTEGER,INTENT(IN):: ENTRYdata
      LOGICAL,INTENT(OUT):: vapor
      INTEGER,INTENT(OUT):: error
      INTEGER,INTENT(IN):: igoto
    END Subroutine Fluid
  END INTERFACE                         
                                                                        
!********************************************************************** 
      REAL G(29,4),TT(27),DD(30),GG(27,30,8),SAT(40,8),C(8)
      INTEGER M(4)
       INTEGER ERROR,ENTRYdata
       DIMENSION PROPS(8) 
       LOGICAL VAPOR 
!********************************************************************** 
                                                                        
      DIMENSION X0001(100),X0101(100),X0201(100),X0301(100),X0401(100), &
     &          X0501(100),X0601(100),X0701(100),X0801(100),X0901(100), &
     &          X1001(100),X1101(100),X1201(100),X1301(100),X1401(100), &
     &          X1501(87)                                               
                                                                        
      DIMENSION Z(1587) 
!********************************************************************** 
       COMMON /FLUDPC/ G,TT,DD,GG,SAT,C,M,NG,N1,N2,N3,NS 
!********************************************************************** 
      EQUIVALENCE (X0001,Z(0001)), (X0101,Z(0101)), (X0201,Z(0201)),    &
     &            (X0301,Z(0301)), (X0401,Z(0401)), (X0501,Z(0501)),    &
     &            (X0601,Z(0601)), (X0701,Z(0701)), (X0801,Z(0801)),    &
     &            (X0901,Z(0901)), (X1001,Z(1001)), (X1101,Z(1101)),    &
     &            (X1201,Z(1201)), (X1301,Z(1301)), (X1401,Z(1401)),    &
     &            (X1501,Z(1501))                                       
                                                                        
!********************************************************************** 

!********************************************************************** 
                                                                        
      DATA X0001/ 1.1300E+0, 1.2000E+0, 1.5000E+0, 1.9000E+0, 2.4000E+0,&
     & 3.1000E+0, 3.9000E+0, 5.0000E+0, 6.3000E+0, 8.0000E+0, 1.0000E+1,&
     & 1.1300E+1, 1.6892E+1, 1.7042E+1, 1.7598E+1, 1.8188E+1, 1.8778E+1,&
     & 1.9422E+1, 2.0011E+1, 2.0670E+1, 2.1312E+1, 2.2013E+1, 2.2701E+1,&
     & 2.3091E+1, 1.1897E+1, 1.2059E+1, 1.2751E+1, 1.3673E+1, 1.4830E+1,&
     & 1.6462E+..... this goes on for a while, I left it out                   
                                                                        
!----------------------------------------------------------------------------

       NG = 12
       N1 = 12 
       N2 = 15 
       N3 = 8 
       NS = 8 
       DO 20 I=1,4 
         DO 10 J=1,12 
           G(J,I) = Z(J+(I-1)*12) 
   10    END DO
   20  END DO

       DO 30 I=1,12 
         TT(I) = Z(I+48) 
   30 END DO

       DO 40 I=1,15
         DD(I) = Z(I+60) 
   40  CONTINUE

       KK=75 
       DO 70 I=1,8 
         DO 60 J=1,15 
           DO 50 K=1,12 
             KK=KK+1 
             GG(K,J,I) = Z(KK) 
   50      CONTINUE 
   60    CONTINUE 
   70  CONTINUE

       DO 90 I=1,8 
         DO 80 J=1,8 
           SAT(J,I) = Z(J+(I-1)*8+1515) 
   80    CONTINUE 
   90  CONTINUE

      DO 100 I=1,8 
        C(I) = Z(I+1579) 
  100  CONTINUE 

      IGOTO = 4
      CALL FLUID(TEMP,PRES,DENS,PROPS,NP,ENTRYdata,VAPOR,ERROR,IGOTO)

      RETURN                                                                        
      END SUBROUTINE DRYAIR

Finally the code for the FLUID subroutine is here:
Code:
C	WRITTEN BY: THEODORE E. FESSLER, NASA TM X-3572, AUGUST 1977
C	REWRITTEN BY: LT. MARK D. KLEM & MARGARET P. PROCTOR, JANUARY 1986
C
C	THE ORIGINAL PROGRAM WAS WRITTEN IN SFTRAN, BUT THIS PROGRAM IS
C	REWRITTEN IN STANDARD FORTRAN 77 TO RUN PRIMARILY ON PERSONAL
C	COMPUTERS AND CAN ALSO RUN ON MAINFRAMES. MUCH OF THE OLD CODE WAS
C	COMMENTED OUT BUT LEFT INTACT FOR DOCUMENTATION AND REFERENCE
C	PURPOSES.
C
      SUBROUTINE FLUID (TEMP,PRES,DENS,PROPS,NP,ENTRY,VAPOR,ERROR,IGOTO)
C     SUBROUTINE FLUID0 (G,NG,GG,TT,DD,N1,N2,N3,SAT,NS,C,L)
C...INTITIALIZING ENTRY FOR FLUID-PROPERTIES PACKAGE.  SETS UP TABLE  
C     POINTERS FOR A PARTICULAR FLUID.  SUBSEQUENT CALLS (TO FLUID) USE 
C     THESE POINTERS.                                                   
                                                                        
C...CALLING ARGUMENTS:                                                
C       G = (NON-DIMENSIONAL) TABLES IN TEMPERATURE ONLY.               
C         G(1,1) = ARGUMENT VALUES (TEMPERATURE).                       
C         G(1,2) = ENTROPY, S0.                                         
C         G(1,3) = ENERGY, U0.                                          
C         G(1,4) = SPECIFIC HEAT AT CONSTANT VOLUME, CV0.               
C       NG = LENGTH OF EACH G TABLE.                                    
C       GG = TABLES IN TEMPERATURE AND DENSITY.                         
C         GG(1,1,1) = Z1, THE MODEL-DEPARTURE FACTOR.                   
C         GG(1,1,2) = Z2 FACTOR FOR ENTROPY (S).                        
C         GG(1,1,3) = Z3 FACTOR FOR ENTHALPY (H).                       
C         GG(1,1,4) = Z4 FACTOR FOR SPECIFIC HEAT (CV).                 
C         GG(1,1,5) = Z5 FACTOR FOR SPECIFIC HEAT (CP).                 
C         GG(1,1,6) = Z6 FACTOR FOR VELOCITY OF SOUND.                  
C         GG(1,1,N) = OTHER FACTORS (EG. TRANSPORT PROPERTIES).         
C       TT = TEMPERATURE ARGUMENTS (REDUCED) FOR GG TABLES.             
C       DD = DENSITY ARGUMENTS (REDUCED) FOR GG TABLES.                 
C       N1 = LENGTH OF TT TABLE AND FIRST DIMENSION OF GG TABLE.        
C       N2 = LENGTH OF DD TABLE AND SECOND DIMENSION OF GG TABLE.       
C       N3 = THIRD DIMENSION (NUMBER OF) GG TABLES.                     
C       SAT = (NON-DIMENSIONAL) SATURATION TABLES.                      
C         SAT(1,1) = SATURATION TEMPERATURE.                            
C         SAT(1,2) = SATURATION PRESSURE.                               
C         SAT(1,3) = SATURATED LIQUID DENSITY.                          
C         SAT(1,4) = SATURATED GAS DENSITY.                             
C         SAT(1,5) = SATURATED LIQUID ENTROPY.                          
C         SAT(1,6) = SATURATED GAS ENTROPY.                             
C         SAT(1,7) = SATURATED LIQUID ENTHALPY.                         
C         SAT(1,8) = SATURATED GAS ENTHALPY.                            
C       NS = LENGTH OF EACH SATURATION TABLE.                           
C       C = MISCELLANEOUS CONSTANTS:                                    
C         C(1) = SPECIFIC GAS CONSTANT, R.                              
C         C(2) = CRITICAL TEMPERATURE, TC.                              
C         C(3) = CRITICAL PRESSURE, PC.                                 
C         C(4) = CRITICAL DENSITY, DC (OR PSEUDO VALUE FOR BEST RANGE). 
C         C(5) = CONVERGENCE REQUIREMENT FOR TEMPERATURE.               
C         C(6) = CONVERGENCE REQUIREMENT FOR DENSITY.                   
C         C(7) = CONVERGENCE REQUIREMENT FOR ENTROPY.                   
C         C(8) = CONVERGENCE REQUIREMENT FOR ENTHALPY.                  
C       L = MEMORY (4 WORDS) FOR TABLE INDICES.                         
                                                                        
C...VARIABLES IN COMMON BLOCK /FLUIDC/:                               
C       GAMMA = RATIO OF SPECIFIC HEATS, CP/CV.                         
C       WL = MASS-FRACTION IN THE LIQUID PHASE.                         
C       WG = MASS-FRACTION IN THE GAS PHASE.                            
C       DENSL = DENSITY OF SATURATED LIQUID,  SAME UNITS AS DC.         
C       DENSG = DENSITY OF SATURATED GAS,     SAME UNITS AS DC.         
C       ENTL = ENTROPY OF SATURATED LIQUID,   SAME UNITS AS R.          
C       ENTG = ENTROPY OF SATURATED GAS,      SAME UNITS AS R.          
C       ENTHL = ENTHALPY OF SATURATED LIQUID, SAME UNITS AS R*TC.       
C       ENTHG = ENTHALPY OF SATURATED GAS,    SAME UNITS AS R*TC.       
                                                                        
C...EXTERNAL SUBROUTINES:                                             
C       NTRP;  CALCULATION OF INTERPOLATION COEFFICIENTS FOR SINGLE-
C              VARIABLE INTERPOLATIONS,                                 
C       NTRP1; CALCULATION OF INTERPOLATION COEFFICIENTS FOR FIRST      
C              VARIABLE IN 2-VARIABLE INTERPOLATIONS,                   
C       NTRP2; CALCULATION OF INTERPOLATION COEFFICIENTS FOR SECOND     
C              VARIABLE IN 2-VARIABLE INTERPOLATIONS,                   
C       GNTRP;  GETS VALUE IN SINGLE-VARIABLE INTERPOLATIONS,           
C       GGNTRP;  GETS VALUE IN 2-VARIABLE INTERPOLATIONS,               
C       CUBIC;  SOLVES VAN DER WAALS' EQUATION OF STATE FOR DENSITY.    
                                                                        
C     INCLUDE (TYPE STATEMENTS, ETC. FOR INITIALIZING ENTRY)
C     INCLUDE (TYPE STATEMENTS, ETC. FOR MAIN ENTRY)
C     DEFINITION (TYPE STATEMENTS, ETC. FOR MAIN ENTRY)
C     DEFINITION (TYPE STATEMENTS, ETC. FOR INITIALIZING ENTRY)
      REAL PROPS(NP)                                                    
      INTEGER ENTRY,ERROR,ERROUT,BIT1,BIT2,BIT3,BIT4,BIT5               
	INTEGER DUMN0,DUMIA
	DIMENSION DUMF(35),DUMFF(27,30),DUMA(1)
      LOGICAL VAPOR,GAS                                                 
      INTEGER L(4)                                                      
C     REAL G(NG,4),GG(N1,N2,N3),TT(N1),DD(N2),SAT(NS,8),C(8),ROOTS(2)
      REAL G(29,4),GG(27,30,8),TT(27),DD(30),SAT(40,8),C(8),ROOTS(2)
	COMMON /FLUDPC/ G,TT,DD,GG,SAT,C,L,NG,N1,N2,N3,NS
      COMMON /FLUIDC/ GAMMA,WL,WG,DENSL,DENSG,ENTL,ENTG,ENTHL,ENTHG     
      DATA BIT1,BIT2,BIT3,BIT4,BIT5,MAX2,MAX3/1,2,4,8,16,12,12/,        
     1     MAX4,MAX5,DXMAX,HUGE,SMALL,BIG/12,12,3.0,1.0E37,.001,1000./, 
     2     ERROUT / 6 /                                                 
C
C     INCLUDE (FUNCTION DEFINITIONS)
      RLIMIT(XMIN,X,XMAX)=AMAX1(XMIN,AMIN1(X,XMAX))                     
      TF(P,D)=(P+3.0*D**2)*(3.0-D)/(8.0*Z*D)                            
      PF(T,D)=8.0*Z*D*T/(3.0-D)-3.0*D**2                                
      HF(P,D)=1.125*(P/(3.0*D)-D)                                       
      SF(D)=ALOG((3.0-D)/D)                                             
      CPF(T,D)=1.0/(1.0-D*(3.0-D)**2/(4.0*T))                           
      A2F(T,D)=0.375*GAMMA*R*TC*(8.0*T/(3.0-D)*(1.0+D/(3.0-D))-6.0*D)   
                                                                        
C...INITIALIZE NORMALIZING VALUES.                                    
	IF (IGOTO.EQ.4) THEN
         R=C(1)
         TC=C(2)
         PC=C(3)
         DC=C(4)
C	RETURN
C
	ELSE IF (IGOTO.EQ.1) THEN
C     ENTRY FLUID (TEMP,PRES,DENS,PROPS,NP,ENTRY,VAPOR,ERROR)
C...MAIN ENTRY FOR PROPERTY CALCULATIONS.                             
                                                                        
C...CALLING ARGUMENTS:                                                
C       TEMP = FLUID TEMPERATURE,  SAME UNITS AS TC.                    
C       PRES = FLUID PRESSURE,  SAME UNITS AS PC.                       
C       DENS = FLUID DENSITY,  SAME UNITS AS DC.                        
C       PROPS = OTHER FLUID PROPERTIES:                                 
C         PROPS(1) = COMPRESSIBILITY, PRES/(R*DENS*TEMP).               
C         PROPS(2) = ENTROPY,  SAME UNITS AS R.                         
C         PROPS(3) = ENTHALPY,  SAME UNITS AS R*TC.                     
C         PROPS(4) = SPECIFIC HEAT, CV,  SAME UNITS AS R.               
C         PROPS(5) = SPECIFIC HEAT, CP,  SAME UNITS AS R.               
C         PROPS(6) = SONIC VELOCITY,  SAME UNITS AS SQRT(R*TC).         
C		 PROPS(7) = VISCOSITY, GRAMS/CM-SEC
C		 PROPS(8) = THERMAL CONDUCTIVITY, WATTS/CM-K
C       NP = NUMBER OF PROPERTIES TO BE CALCULATED.                     
C       ENTRY = INTEGER THAT SPECIFIES WHICH VARIABLES ARE INPUT:       
C             = 1 IF TEMPERATURE AND DENSITY ARE GIVEN.                 
C             = 2 IF PRESSURE AND DENSITY ARE GIVEN.
C             = 3 IF TEMPERATURE AND PRESSURE ARE GIVEN.                
C             = 4 IF PRESSURE AND ENTROPY ARE GIVEN.                    
C             = 5 IF PRESSURE AND ENTHALPY ARE GIVEN.                   
C       VAPOR = .TRUE. IF THE FLUID IS SATURATED.  IN THAT CASE,        
C               VALUES OF LIQUID AND GAS PHASES ARE GIVEN IN THE        
C               COMMON BLOCK /FLUIDC/.                                  
C       ERROR = ERROR FLAGS (BITS -- LEAST SIGNIFICANT = 1):            
C             ** IF ERROR = 0,  ALL IS WELL **                          
C         BIT 1 = OUT OF RANGE IN SAT TABLE.                            
C         BIT 2 = OUT OF RANGE IN G TABLE.                              
C         BIT 3 = OUT OF RANGE IN TT TABLE.                             
C         BIT 4 = OUT OF RANGE IN DD TABLE.                             
C         BIT 5 = CONVERGENCE NOT ACHIEVED IN SOLVING INVERSE FUNCTION. 
                                                                        
C     PROCEDURE (MAIN ENTRY INITIALIZATION)
         IF (NP.GT.N3) THEN
            WRITE (ERROUT,1) NP,N3
            STOP
 		ENDIF
         IF (ENTRY.LT.1 .OR. ENTRY.GT.5) THEN
            WRITE (ERROUT,2)
            STOP
         ENDIF
         KS=0
         K0=0
         K1=0
         K2=0
         ERROR=0
         ARG0=HUGE
         ARG1=HUGE
         ARG2=HUGE
         T=TEMP/TC
         D=DENS/DC
         P=PRES/PC
C
C     DO CASE (ENTRY,5)
		IF (ENTRY.EQ.1) THEN
C     CASE 1
C...GIVEN TEMPERATURE AND DENSITY.                                    
            IF (T.LT.1.0) THEN
C     PROCEDURE (TEST FOR VAPOR CONDITION AT (T,D))
C     PROCEDURE (SET UP FOR INTERPOLATION OF SATURATION DATA AT T)
               CALL NTRP (SAT(1,1),T,NS,L(1),KS,1,DUMF,DUMFF,DUMVAL)
C     PROCEDURE (GET SATURATED LIQUID (DL) AND GAS (DG) DENSITIES)
C              CALL GNTRP (4,SAT(1,3),DL)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,4,SAT(1,3),
     &            DUMFF,DL)
C              CALL GNTRP (4,SAT(1,4),DG)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,4,SAT(1,4),
     &            DUMFF,DG)
               VAPOR=D.GT.DG .AND. D.LT.DL
            ELSE
               VAPOR=.FALSE.
            ENDIF
            IF (VAPOR) THEN
C     PROCEDURE (GET SATURATION PRESSURE, PSAT)
C              CALL GNTRP (4,SAT(1,2),PSAT)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,4,
     &            SAT(1,2),DUMFF,PSAT)
               P=PSAT
            ELSE
C     PROCEDURE (GET Z BY DOUBLE INTERPOLATION AT (T,D))
C     PROCEDURE (SET UP FOR DOUBLE INTERPOLATION AT (T,D))
               IF (ARG1.NE.T) THEN
C                 CALL NTRP1 (TT,T,N1,L(3),K1,2)
                  CALL NTRP (TT,T,N1,L(3),K1,2,DUMF,DUMFF,DUMVAL)
                  ARG1=T
               ENDIF
               IF (ARG2.NE.D) THEN
C                 CALL NTRP2 (DD,D,N2,L(4),K2,3)
                  CALL NTRP (DD,D,N2,L(4),K2,3,DUMF,DUMFF,DUMVAL)
                  ARG2=D
               ENDIF
C              CALL GGNTRP (5,GG(1,1,1),Z)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,5,DUMF,
     &            GG(1,1,1),Z)
               Z=RLIMIT(SMALL,Z,BIG)
               P=PF(T,D)
            ENDIF
            PRES=P*PC
         ELSE IF (ENTRY.EQ.2) THEN
C     CASE 2
C...GIVEN PRESSURE AND DENSITY.                                       
            IF (P.LT.1.0) THEN
C     PROCEDURE (TEST FOR VAPOR CONDITION AT (P,D))
C     PROCEDURE (SET UP FOR INTERPOLATION OF SATURATION DATA AT P)
               CALL NTRP (SAT(1,2),AMAX1(P,SAT(1,2)),NS,L(1),KS,1,
     &         DUMF,DUMFF,DUMVAL)
C     PROCEDURE (GET SATURATED LIQUID (DL) AND GAS (DG) DENSITIES)
C              CALL GNTRP (4,SAT(1,3),DL)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,4,
     &            SAT(1,3),DUMFF,DL)
C              CALL GNTRP (4,SAT(1,4),DG)
               CALL NTRP (DUMA,DUMX,DUMN0,DUMIA,DUMOUT,4,
     &            SAT(1,4),DUMFF,DG)
               VAPOR=D.GT.DG .AND. D.LT.DL
            ELSE
               VAPOR=.FALSE.
            ENDIF.... keeps going with more cases but that is the jist of it

I'm really not sure why it is not returning me with density when I specify everything correctly, except I am not sure about how the common and implicit commands are affecting the code so it must be something to do with those.. The problem is that the G tables are "out of range"

Any help is greatly appreciated, and if i get it working I will be more than happy to send you a copy of it.
 
Physics news on Phys.org
The main program is missing array declarations for the variables in common block /FLUDPC/.
Common blocks must have the same size in all program, subroutine, and function units.