关于aspen外挂fortran子程序的一些语句疑问。
在学习了六月痕前辈https://meng.horse/forum.php?mod=viewthread&tid=76210对fortran子程序的解释后,有以下几点疑问,请各位前辈指教。1.在计算反应物的浓度时 XL代表的具体是反应物的什么?
2.如果在反应速率中涉及到各个反应物的压力,当反应物的压力变化时,压力应该如何写入fortran的子程序?
C October 7 KL For Workshop Template
C September 25 KL
C
C User Kinetics Subroutine for RCSTR, RPLUG, RBATCH, PRES-RELIEF
C
SUBROUTINE USRKIN (SOUT, NSUBS,IDXSUB, ITYPE,NINT,
2 INT, NREAL,REAL, IDS, NPO,
3 NBOPST, NIWORK, IWORK, NWORK,WORK,
4 NC, NR, STOIC, RATES,FLUXM,
5 FLUXS,XCURR,NTCAT, RATCAT, NTSSAT,
6 RATSSA, KCALL,KFAIL, KFLASH, NCOMP,
7 IDX, Y, X, X1, X2,
8 NRALL,RATALL, NUSERV, USERV,NINTR,
9 INTR, NREALR, REALR, NIWR, IWR,
1 NWR, WR)
C
IMPLICIT NONE
C
C DECLARE VARIABLES USED IN DIMENSIONING
C
INTEGER NSUBS, NINT,NPO, NIWORK,NWORK,
+ NC, NR, NTCAT, NTSSAT,NCOMP,
+ NRALL, NUSERV,NINTR, NREALR,NIWR,
+ NWR
C
#include "ppexec_user.cmn"
EQUIVALENCE (RMISS, USER_RUMISS)
EQUIVALENCE (IMISS, USER_IUMISS)
C
C
C
C
C.....RCSTR...
#include "rcst_rcstri.cmn"
#include "rxn_rcstrr.cmn"
C
C.....RPLUG...
#include "rplg_rplugi.cmn"
#include "rplg_rplugr.cmn"
EQUIVALENCE (XLEN, RPLUGR_UXLONG)
EQUIVALENCE (DIAM, RPLUGR_UDIAM)
C
C.....RBATCH...
#include "rbtc_rbati.cmn"
#include "rbtc_rbatr.cmn"
C
C.....PRES-RELIEF...
#include "rbtc_presrr.cmn"
C
C.....REACTOR (OR PRES-RELIEF VESSEL) PROPERTIES...
#include "rxn_rprops.cmn"
EQUIVALENCE (TEMP, RPROPS_UTEMP)
EQUIVALENCE (PRES, RPROPS_UPRES)
EQUIVALENCE (VFRAC, RPROPS_UVFRAC)
EQUIVALENCE (BETA, RPROPS_UBETA)
EQUIVALENCE (VVAP, RPROPS_UVVAP)
EQUIVALENCE (VLIQ, RPROPS_UVLIQ)
EQUIVALENCE (VLIQS, RPROPS_UVLIQS)
C
#include "shs_stwork.cmn"
EQUIVALENCE (MKBAS, STWORK_NDUM)
EQUIVALENCE (MKPHAS, STWORK_NBLM)
EQUIVALENCE (MTAPP, STWORK_NCOVAR)
EQUIVALENCE (MKBASS, STWORK_NWR)
EQUIVALENCE (MTAPPS, STWORK_NIWR)
EQUIVALENCE (SSALT, STWORK_RDUM1)
EQUIVALENCE (VSALT, STWORK_RDUM2)
EQUIVALENCE (FSALT, STWORK_FFSALT)
#include "pputl_ppglob.cmn"
#include "dms_ncomp.cmn"
#include "dms_plex.cmn"
EQUIVALENCE (IB(1), B(1))
C
C DECLARE ARGUMENTS
C
INTEGER IDXSUB(NSUBS),ITYPE(NSUBS), INT(NINT),
+ IDS(2),NBOPST(6,NPO),IWORK(NIWORK),
+ IDX(NCOMP), INTR(NINTR),IWR(NIWR),
+ NREAL, KCALL, KFAIL, KFLASH,I
REAL*8 SOUT(1), WORK(NWORK),
+ STOIC(NC,NSUBS,NR),RATES(1),
+ FLUXM(1), FLUXS(1), RATCAT(NTCAT),
+ RATSSA(NTSSAT), Y(NCOMP),
+ X(NCOMP), X1(NCOMP), X2(NCOMP)
REAL*8 RATALL(NRALL),USERV(NUSERV),
+ REALR(NREALR),WR(NWR), XCURR
C
C
C DECLARE LOCAL VARIABLES
C
INTEGER IMISS, MKBAS, MKPHAS,MTAPP, MKBASS,
+ MTAPPS,LMW
REAL*8 REAL(NREAL),XL(3), B(1),RMISS, XLEN,
+ DIAM,TEMP,PRES,VFRAC, BETA,
+ VVAP,VLIQ,VLIQS, SSALT, VSALT,
+ FSALT, RTEMP, DENLIQ,CONAA, CONACT,
+ FTERM, STERM, RATE,SUMR
INTEGER XMW
#include "dms_ipoff1.cmn"
C
C INITIALIZE RATES
C
C
CSTATEMENT FUNCTIONS FOLLOW
C
C
C BEGIN EXECUTABLE CODE
C
XMW(I) = LMW + I
C
CSET PLEX OFFSETS
C
LMW = IPOFF1_IPOFF1(306)
DO 100 I = 1, NC
RATES(I) = 0D0
XL(I) = 0D0
100CONTINUE
C
DO 101 I = 1, NCOMP
XL(IDX(I)) = X(I)
101CONTINUE
C
C The structure in the array SOUT is as follows:
C
C SOUT(1) - SOUT(NCC) : Component flowrates(kg-moles/sec)
C SOUT(NCC+1) : Total flowrates(kg-moles/sec)
C SOUT(NCC+2) : Temperature(K)
C SOUT(NCC+3) : Pressure(N/SQM)
C SOUT(NCC+4) : Mass enthalpy(J/KG)
C SOUT(NCC+5) : Molar vapor fraction
C SOUT(NCC+6) : Molar liquid fraction
C SOUT(NCC+7) : Mass entropy(J/KG-K)
C SOUT(NCC+8) : Mass density(KG/CUM)
C SOUT(NCC+9) : Molecular Weight
C
C Details of this infomation can be found in the User Guide
C on page 17-10 for 8.5-6 or Reference Manual Vol. 6, User Models
C for Release 9.
C
C Set Reactor Temperature
C
RTEMP = SOUT(NCOMP_NCC+2)
C
C Get liquid mixture density
C
DENLIQ = 1.0 / STWORK_VL
C
C Compute Concentration for reactants:
C
C CONC(i) = X(i) * RHO
C
CONAA = XL(1) * DENLIQ
CONACT = XL(2) * DENLIQ
C
C
C
C CALCULATE RATES OF REACTIONS
C
C The rates must be set for every single component exists in the
C system(both reactants and products) according to stoichiometry.
C
C RATES - The rates for all components
C
C Acetone + Allyl Alcohol -> N-Propyl Propionate
C
FTERM = REALR(1) * EXP( -REALR(2) / PPGLOB_RGAS / RTEMP )
STERM = conaa * conact**0.5
RATE= FTERM * STERM * RCSTRR_VOLRC
RATES(1) = -rate
RATES(2) = -rate
RATES(3) = rate
C
C Checking Mass Balance for RATES Vector
C
SUMR = 1.0
DO 102 I=1,NCOMP_NCC
SUMR = SUMR + RATES(I)*B(XMW(I))
102CONTINUE
IF (DABS(1.0 - SUMR) .GT. 1E-6) THEN
WRITE(USER_NHSTRY,*)
+ 'Calculated Rates Not in Mass Balance!'
WRITE(USER_NHSTRY,*)
+ 'Errors in User Kinetics Subroutines!'
ENDIF
write(USER_NHSTRY,*) 'volrc = ', RCSTRR_VOLRC
write(USER_NHSTRY,*) 'vfrrc = ', RCSTRR_VFRRC
RETURN
#undef P_NPOFF1
END
关于Aspen外挂Fortran子程序的问题,我来结合工程实践解释下:
1 XL参数的具体含义:
在RPLUG(管式反应器)模块中,XL代表反应器长度(reactor length),通过EQUIVALENCE语句与RPLUGR_UXLONG变量关联。这个参数主要用于计算反应物浓度时考虑轴向位置的影响。浓度计算通常需要结合:
- 反应器长度XL
- 当前计算节点的位置
- 组分摩尔分数X/X1/X2
- 物性参数(密度、相态等)
2 反应物压力的动态处理方法:
当反应速率方程涉及组分分压时,建议采用以下步骤处理:
1 从RPROPS_UPRES获取系统总压(PRES变量)
2 通过Y数组(气相摩尔分数)或X数组(液相摩尔分数)计算分压
气相分压 = PRES * Y(IDX(i))
液相分压需要考虑活度系数(需调用物性方法)
3 在子程序中声明压力变量:
REAL*8 PARTIAL_PRESSURE
DO i=1,NCOMP
PARTIAL_PRESSURE = PRES * Y(IDX(i))
! 将分压值存入WORK数组备用
WORK(offset+i) = PARTIAL_PRESSURE
END DO
关键要点:
- 对于气液两相系统,需要先判断当前相态(通过VFRAC变量)
- 高压系统需考虑逸度替代分压(调用PPEXEC计算)
- 催化剂存在时(NTCAT>0),压力参数可能需要通过RATCAT数组传递
- 建议压力相关计算放在KCALL=1的判断块内(初始化阶段)
工程经验提示:
1 调试时先用固定压力值测试反应速率方程的正确性
2 压力单位需保持一致性(Aspen内部一般为Pa或bar)
3 涉及相变的系统要特别检查VFRAC和BETA参数
4 强烈建议在子程序开头添加压力值的调试输出语句
这个模板里已经包含了压力处理所需的基础变量(PRES/Y/X等),实际应用时建议参考RPROPS.cmn文件中的完整变量定义。
消除零回复-来自AI Deepseek机器人自动回复回复内容仅作参考,请甄别回复内容准确与否 {:1110_550:}{:1110_550:}{:1110_550:}
页:
[1]