### 18.11.7. USER_STATEPT Example 1

The following example shows the usage of the user state point function to calculate the specific heat capacity for various materials. The heat capacity is calculated for a mixture (`MyAir`) as well as for each component of the mixture (`MyAir.N2 Ideal Gas`, `MyAir.O2 Ideal Gas`, `MyAir.CO2 Ideal Gas` and `MyAir.CO2 Const Prop`).

The CCL that is required to plot the efficiency in the CFX-Solver Manager is as follows:

    LIBRARY:
      CEL:
        FUNCTION: Function 1
          Argument Units = [[],[K],[Pa],[],[],[],[]]
          Option = User Function
          Result Units = [J kg^-1 K^-1]
          User Routine Name = User Routine 1
        END
        EXPRESSIONS:
          MyCp1 = Function 1(1,Tave,Pave,N2mf,O2mf,CO2mf,CO21mf)
          MyCp2 = Function 1(2,Tave,Pave,N2mf,O2mf,CO2mf,CO21mf)
          MyCp3 = Function 1(3,Tave,Pave,N2mf,O2mf,CO2mf,CO21mf)
          MyCp4 = Function 1(4,Tave,Pave,N2mf,O2mf,CO2mf,CO21mf)
          MyCp5 = Function 1(5,Tave,Pave,N2mf,O2mf,CO2mf,CO21mf)
    #
          A = 0.1 [J kg^-1 K^-2]
          MyCp  = 1004 [J kg^-1 K^-1] + A*Temperature
          CpCO2 = 851  [J kg^-1 K^-1] + A*Temperature
          CpO2  = 920  [J kg^-1 K^-1] + A*Temperature
          CpN2  = 1040 [J kg^-1 K^-1] + A*Temperature
    #
          Tave   = massFlowAve(Temperature)@Outflow
          Pave   = massFlowAve(Absolute Pressure)@Outflow
          N2mf   = massFlowAve(N2 Ideal Gas.Mass Fraction)@Outflow
          O2mf   = massFlowAve(O2 Ideal Gas.Mass Fraction)@Outflow
          CO2mf  = massFlowAve(CO2 Ideal Gas.Mass Fraction)@Outflow
          CO21mf = massFlowAve(CO2 Const Prop.Mass Fraction)@Outflow
        END
      END
      USER ROUTINE DEFINITIONS:
        USER ROUTINE: User Routine 1
          Calling Name = my_test
          Library Name = mytest
          Library Path = ..
          Option = User CEL Function
        END
      END
    END
    FLOW: Flow Analysis 1
      OUTPUT CONTROL:
        MONITOR OBJECTS:
          MONITOR POINT: Monitor Point 1
            Expression Value = MyCp1
            Option = Expression
          END
          MONITOR POINT: Monitor Point 2
            Expression Value = MyCp2
            Option = Expression
          END
          MONITOR POINT: Monitor Point 3
            Expression Value = MyCp3
            Option = Expression
          END
          MONITOR POINT: Monitor Point 4
            Expression Value = MyCp4
            Option = Expression
          END
          MONITOR POINT: Monitor Point 5
            Expression Value = MyCp5
            Option = Expression
          END
        END
        MONITOR OBJECTS:
          MONITOR BALANCES:
            Option = Full
          END
          MONITOR FORCES:
            Option = Full
          END
          MONITOR PARTICLES:
            Option = Full
          END
          MONITOR RESIDUALS:
            Option = Full
          END
          MONITOR TOTALS:
             Option = Full
          END
        END
        RESULTS:
          File Compression Level = Default
          Option = Standard
        END
      END
    END

The Fortran source code for this example is given below:

    #include "cfx5ext.h"
    dllexport(my_test)
          SUBROUTINE MY_TEST (
         &  NLOC, NRET, NARG, RET, ARGS, CRESLT, CZ,DZ,IZ,LZ,RZ )
    CC
    CD User routine: template for user CEL function
    CC
    CC --------------------
    CC        Input
    CC --------------------
    CC
    CC  NLOC   - size of current locale
    CC  NRET   - number of components in result
    CC  NARG   - number of arguments in call
    CC  ARGS() - (NLOC,NARG) argument values
    CC
    CC --------------------
    CC      Modified
    CC --------------------
    CC
    CC  Stacks possibly.
    CC
    CC --------------------
    CC        Output
    CC --------------------
    CC
    CC  RET()  - (NLOC,NRET) return values
    CC  CRESLT - 'GOOD' for success
    CC
    CC --------------------
    CC       Details
    CC --------------------
    CC
    CC  Template routine for user state point code
    CC
    CC======================================================================
    C
    C ------------------------------
    C        Argument list
    C ------------------------------
    C
          INTEGER   NLOC,NARG,NRET
    C
          CHARACTER CRESLT*(*)
    C
          REAL      ARGS(NLOC,NARG), RET(NLOC,NRET)
    C
          INTEGER IZ(*)
          CHARACTER CZ(*)*(1)
          DOUBLE PRECISION DZ(*)
          LOGICAL LZ(*)
          REAL RZ(*)
    C
    C ------------------------------
    C        External routines
    C ------------------------------
    C
          INTEGER  LENACT
          EXTERNAL LENACT
    C
    C ------------------------------
    C        Local Parameters
    C ------------------------------
    C
    C ------------------------------
    C        Local Variables
    C ------------------------------
    C
          INTEGER        NPROPIND, NTESTPROP, IMAT, NMAT, IPROP
          CHARACTER*(80) CPROPCALC, CPROPIND(6)
    C
          REAL           RPROPIND(6)
    C
          CHARACTER*(30) INDPROP(13)
          CHARACTER*(30) MAT(5)
    C
          DATA INDPROP /'Static Enthalpy','Static Entropy','Cp','Cv',
         &              'Dynamic Viscosity','Density',
         &              'Pressure','Absolute Pressure',
         &              'Temperature','Absolute Temperature',
         &              'Isentropic Compressibility',
         &              'Isothermal Compressibility',
         &              'Local Speed of Sound'/
    C
          DATA MAT     /'MyAir','MyAir.N2 Ideal Gas',
         &              'MyAir.O2 Ideal Gas','MyAir.CO2 Ideal Gas',
         &              'MyAir.CO2 Const Prop'/
    C
    C ------------------------------
    C        Stack pointers
    C ------------------------------
    C
    C=======================================================================
    C
    C ---------------------------
    C    Executable Statements
    C ---------------------------
    C
    C---- Initialize RET(1:NLOC*NRET) to zero.
    C
          CALL SET_A_0(RET,NLOC*NRET)
    C
    C-----------------------------------------------------------------------
    C     Setup data required for state point calculation
    C-----------------------------------------------------------------------
    C
          NPROPIND    = 6
    C
          CPROPIND(1) = 'Temperature'
          CPROPIND(2) = 'Absolute Pressure'
    C
          CPROPIND(3) = 'N2 Ideal Gas.mf'
          CPROPIND(4) = 'O2 Ideal Gas.mf'
          CPROPIND(5) = 'CO2 Ideal Gas.mf'
          CPROPIND(6) = 'CO2 Const Prop.mf'
    C
    C---- 'Material' number:
    C     --> '1': Mixture
    C         '2': N2 Ideal Gas
    C         '3': O2 Ideal Gas
    C         '4': CO2 Ideal Gas
    C         '5': CO2 Const Prop

          IMAT  = ARGS(NLOC,1)
    C
    C---- Input values of temperature and absolute pressure
    C
          RPROPIND(1) = ARGS(NLOC,2)
          RPROPIND(2) = ARGS(NLOC,3)
    C
    C---- Input values of component mass fractions
    C
          RPROPIND(3) = ARGS(NLOC,4)
          RPROPIND(4) = ARGS(NLOC,5)
          RPROPIND(5) = ARGS(NLOC,6)
          RPROPIND(6) = ARGS(NLOC,7)
    C
    C-----------------------------------------------------------------------
    C     Compute return variable value
    C-----------------------------------------------------------------------
    C
    C---- Compute Specific Heat capacity (= property ‘3’ in above list)
    C
          IPROP = 3
    C
          IF (IMAT.GT.1) THEN
            NPROPIND = 2
          ENDIF
    C
    C---- Create output property name
    C
          CPROPCALC = MAT(IMAT)(1:LENACT(MAT(IMAT)))//'.'//
         &            INDPROP(IPROP)
          CALL USER_STATEPT(RVALUE,CPROPCALC,CPROPIND,RPROPIND,
         &                  NPROPIND,'SKIP',CRESLT, CZ,DZ,IZ,LZ,RZ)
    C
    C---- Copy output property value to RET(1:NLOC,1).
    C     --> NLOC = 1
    C
          RET(1,1) = RVALUE
    C
          END

Release 18.2 - © ANSYS, Inc. All rights reserved.