小羊 发表于 2015-9-2 16:43:41

编译Fortran代码时出现错误和警告

各位大侠,我在练习《Aspen plus getting started customizing unit operation models》中的例子putting the models equations in the user subroutine 时,按照书上的代码编写,但是在编译的时候弹出如下错误,请问该如何解决。我已经检查过了,提示中133行的那个MW,书上给的代码里,确实没有定义,所以是书上代码错误了吗?还请各位高手指教,急!谢谢大家!

小羊 发表于 2015-9-2 16:43:41

这是我照着敲的代码   
   SUBROUTINE HFUM (NMATI,MSIN,    NINFI,   SINFI,NMATO,
   2                   SOUT,   NINFO,SINFO,   IDSMI,IDSII,
   3                   IDSMO,IDSIO,NTOT,    NSUBS,IDXSUB,
   4                   ITYPE,NINT,   INT,   NREAL,REAL,
   5                   IDS,    NPO,    NBOPST,NIWORK, IWORK,
   6                   NWORK,WORK,   NSIZE,   SIZE,   INTSIZ,
   7                   LD   )
C
      IMPLICIT NONE
#include "ppexec_user.cmn"
#include "dms_plex.cmn"
      Real*8 B(1)
        Equivalence (B(1),IB(1))
#include "dms_ncomp.cmn"
C
C   DECLARE arguments
C
      INTEGER NMATI, NINFI, NMATO, NINFO, NTOT,
   +      NSUBS, NINT,NPO,   NIWORK,NWORK,
   +      NSIZE, NREAL
c
      INTEGER IDSMI(2,NMATI),      IDSII(2,NINFI),
   +      IDSMO(2,NMATO),      IDSIO(2,NINFO),
   +      IDXSUB(NSUBS),ITYPE(NSUBS), INT(NINT),
   +      IDS(2,3),   NBOPST(6,NPO),
   +      IWORK(NIWORK),INTSIZ(NSIZE),LD
c
      REAL*8 MSIN(NTOT,NMATI),   SINFI(NINFI),
   +       SOUT(NTOT,NMATO),    SINFO(NINFO),
   +       WORK(NWORK),SIZE(NSIZE),REAL(NREAL)
C
C   DECLARE LOCAL VARIABLES
C
      INTEGER OFFSET, IERR, LDATA, KDIAG, IDX(10), NCP, I, J, INDEX
   +      LMW, NTUBES, IPERM, IRET, IFAIL
      REAL*8DIAM, LEN, DIFF, CG, REJ_COEF, C1, C2, C3, C4, P_PERM,
   +      DELTA_P, RHO, MU, FIN, CIN, PIN, UAVE, RE, SC,
   +      CP, CR, KM, JM, FP, PRET, XMW, X(10), FLOW
C   DECLARE FUNCTIONS
      INTEGER USRUTL_GET_REAL_PARAM,
   +      USRUTL_GET_INT_PARAM,
   +      USRUTL_SET_REAL_PARAM
        INTEGER DMS_IFCMNC
        REAL*8DLOG
C
C   BEGIN EXECUTABLE CODE
C   GET CONFIGURED REAL VARIABLES FROM ASPEN PLUS
      IFAIL=0
        INDEX=0
        IERR=USRUTL_GET_REAL_PARAM('DIAM',INDEX,DIAM)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING HYDRAULIC DIAMETER'
          IFALL=1
        END IF
C
      IERR=USRUTL_GET_REAL_PARAM('LEN',INDEX,LEN)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING LENGTH'
          IFALL=1
        END IF
C
      IERR=USRUTL_GET_REAL_PARAM('DIFF',INDEX,DIFF)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING DUFFUSIVITY'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('GEL_CONC',INDEX,CG)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING GEL CONCENTRATION'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('REJ_COEF',INDEX,REJ_COEF)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING REJECTION COEFFICIENT'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('COEF1',INDEX,C1)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING COEF1'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('COEF2',INDEX,C2)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING COEF2'
          IFALL=1
        END IF
c
      IERR=USRUTL_GET_REAL_PARAM('COEF3',INDEX,C3)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING COEF3'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('COEF4',INDEX,C4)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING COEF4'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('PERM_PRES',INDEX,P_PERM)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING PERMEATE PRESSURE'
          IFALL=1
        END IF
C
        IERR=USRUTL_GET_REAL_PARAM('CELTA_P',INDEX,DELTA_P)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING PRESSURE DROP'
          IFALL=1
        END IF
C   GET CONFIGURED INTEGER VARIABLES FROM ASPEN PLUS
      IERR=USRUTL_GET_INT_PARAM('NTUBES', INDEX, NTUBES)
      IF (IERR .NE. 0) THEN
          WRITE (USER_NHSTRY,*) 'ERROR FETCHING NUMBER OF TUBES'
          IFALL=1
        END IF
C   CALCULATE VISCOSITY
      CALL SHS_CPACK(MSIN(1,1), NCP, IDX, X, FLOW)
        KDIAG=4
      CALL PPMON_VISCL(MSIN(NCOMP_NCC+2,1), MSIN(NCOMP_NCC+3,1), X, NCP,
   +               IDX, NBOPST, KDIAG, MU, IERR)
      IF (IERR .NE. 0) THEN
          WRITE(USER_NHSTRY, *) ' ERROR EVALUATING VISCOSITY FOR FEED'
          IFALL=1
        END IF
C
      IF (IFALL .EQ. 1) RETURN
C   GET LOCATION OF MOLECULAR WEIGHT DATA
      LMW=DMS_IFCMNC('MW')
C   MODEL EQUATIONS
      RHO=MSIN(NCOMP_NCC+8,1) / 1000
        MU=MU*10
        FIN=MSIN(NCOMP_NCC+1,1) * MSIN(NCOMP_NCC+9,1) / RHO*3600
        CIN=MSIN(2,1) * B(LMW+2) / FIN *3600000
        PIN=MSIN(NCOMP_NCC+3,1) / 101325
        UAVE=FIN / (DIAM**2*3.14*NTUBES/4) * 1000 / 3600
        RE=DIAM * UAVE * RHO / MU
        SC=MU / (RHO * DIFF)
C
      CP=CG * (1-REJ_COEF)
        KM=C1 * RE**C2 * SC**C3 * (DIAM/LEN)**C4 * DIFF/DIAM/100
C
      JM=KM * DLOG((CG - CP) / (CIN - CP))
        FP=JM * DIAM * LEN * 3.14 * NTUBES*100*3600/1000
C
      CR=(CIN - FP/FIN*CP) / (1 - FP/FIN)
C
      PRET=PIN-DELTA_P
C   ASSUME PEAMEATE STREAM IS FIRST,SWITCH IF NOT
      IPERM=1
        IRET=2
        IF (IDSMO(1,1) .EQ. 'RETE')THEN
          IPERM=2
          IRET=1
        END IF
C   FILL SOUT ARRY FOR PERMEATE STRAM
      SOUT(1,IPERM) = FP * RHO / 3600 / B(LMW+1)
        SOUT(2,IPERM) = FP * CP / 1000 /3600 / B(LMW+2)
      SOUT(3,IPERM) = SOUT(1,IPERM) + SOUT(2,IPERM)
      SOUT(4,IPERM) = MSIN(4,1)
        SOUT(5,IPERM) = P_PERM * 101325
C   FILL SOUT ARRAY FOR RETENTAT STREAM USING VALUES FROM PERMEATE STREAM
      SOUT(1,IRET) = MSIN(1,1) - SOUT(1,IPERM)
        SOUT(2,IRET) = MSIN(2,1) - SOUT(2,IPERM)
      SOUT(3,IRET) = SOUT(1,IRET) + SOUT(2,IRET)
      SOUT(4,IRET) = MSIN(4,1)
        SOUT(5,IRET) = PRET * 101325
C   NOW SET VALUES OF THE TWO VARIABLES DESIGNATED AS OUTPUT PARAMETERS
      IERR = USRUTL_SET_REAL_PARAM('CP_PROT', INDEX, CP)
        IF (IERR .NE. 0) THEN
          WRITE(USER_NHSTRY, *) 'ERROR STORING PERMEATE PROT CONC'
          IFALL=1
        END IF
C
      IERR = USRUTL_SET_REAL_PARAM('CR_PROT', INDEX, CR)
        IF (IERR .NE. 0) THEN
          WRITE(USER_NHSTRY, *) 'ERROR STORING RETENTATE PROT CONC'
          IFALL=1
        END IF
C
      RETURN
        END
页: [1]
查看完整版本: 编译Fortran代码时出现错误和警告