前阵子帮朋友解决Fluent UDF中的真实气体模型(User Defined Real Gas Model,UDRGM)编译时踩到了一个很大的坑,这里连同详细编译使用过程一起记录一下,供有需求的朋友借鉴。
当时,使用的Fluent版本为2020R1,由于该朋友当时手头只有18.2的UDF手册,于是将手册中如下代码复制到VC++ UDF Studio插件(http://vcudfstudio.github.io)的源代码文件udf_source.cpp中,并点击编译按钮。该插件是在Visual Studio中集成化进行UDF编译调试的工具,十分高效。
/**************************************************************/
/* */
/* User-Defined Function: Redlich-Kwong Equation of State */
/* for Real Gas Modeling */
/* */
/* Author: Frank Kelecy */
/* Date: May 2003 */
/* Version: 1.02 */
/* */
/* This implementation is completely general. */
/* Parameters set for CO2. */
/* */
/**************************************************************/
#include "udf.h"
#include "stdio.h"
#include "ctype.h"
#include "stdarg.h"
/* The variables below need to be set for a particular gas */
/* CO2 */
/* REAL GAS EQUATION OF STATE MODEL - BASIC VARIABLES */
/* ALL VARIABLES ARE IN SI UNITS! */
#define RGASU UNIVERSAL_GAS_CONSTANT
#define PI 3.141592654
#define MWT 44.01
#define PCRIT 7.3834e6
#define TCRIT 304.21
#define ZCRIT 0.2769
#define VCRIT 2.15517e-3
#define NRK 0.77
/* IDEAL GAS SPECIFIC HEAT CURVE FIT */
#define CC1 453.577
#define CC2 1.65014
#define CC3 -1.24814e-3
#define CC4 3.78201e-7
#define CC5 0.00
/* REFERENCE STATE */
#define P_REF 101325
#define T_REF 288.15
/* OPTIONAL REFERENCE (OFFSET) VALUES FOR ENTHALPY AND ENTROPY */
#define H_REF 0.0
#define S_REF 0.0
static int (*usersMessage)(char *,...);
static void (*usersError)(char *,...);
/* Static variables associated with Redlich-Kwong Model */
static double rgas, a0, b0, c0, bb, cp_int_ref;
DEFINE_ON_DEMAND(I_do_nothing)
{
/* this is a dummy function to allow us */
/* to use the compiled UDFs utility */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_error */
/*------------------------------------------------------------*/
void RKEOS_error(int err, char *f, char *msg)
{
if (err)
usersError("RKEOS_error (%d) from function: %s\n%s\n",err,f,msg);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_Setup */
/*------------------------------------------------------------*/
void RKEOS_Setup(Domain *domain, char *filename,
void (*messagefunc)(char *format, ...),
void (*errorfunc)(char *format, ...))
{
rgas = RGASU/MWT;
a0 = 0.42747*rgas*rgas*TCRIT*TCRIT/PCRIT;
b0 = 0.08664*rgas*TCRIT/PCRIT;
c0 = rgas*TCRIT/(PCRIT+a0/(VCRIT*(VCRIT+b0)))+b0-VCRIT;
bb = b0-c0;
cp_int_ref = CC1*log(T_REF)+T_REF*(CC2+T_REF*(0.5*CC3+T_REF*(0.333333*CC4+0.25*CC5*T_REF)));
usersMessage = messagefunc;
usersError = errorfunc;
usersMessage("\nLoading Redlich-Kwong Library: %s\n", filename);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_pressure */
/* Returns density given T and density */
/*------------------------------------------------------------*/
double RKEOS_pressure(double temp, double density)
{
double v = 1./density;
double afun = a0*pow(TCRIT/temp,NRK);
return rgas*temp/(v-bb)-afun/(v*(v+b0));
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_spvol */
/* Returns specific volume given T and P */
/*------------------------------------------------------------*/
double RKEOS_spvol(double temp, double press)
{
double a1,a2,a3;
double vv,vv1,vv2,vv3;
double qq,qq3,sqq,rr,tt,dd;
double afun = a0*pow(TCRIT/temp,NRK);
a1 = c0-rgas*temp/press;
a2 = -(bb*b0+rgas*temp*b0/press-afun/press);
a3 = -afun*bb/press;
/* Solve cubic equation for specific volume */
qq = (a1*a1-3.*a2)/9.;
rr = (2*a1*a1*a1-9.*a1*a2+27.*a3)/54.;
qq3 = qq*qq*qq;
dd = qq3-rr*rr;
/* If dd < 0, then we have one real root */
/* If dd >= 0, then we have three roots -> choose largest root */
if (dd < 0.) {
tt = sqrt(-dd)+pow(fabs(rr),0.333333);
vv = (tt+qq/tt)-a1/3.;
} else {
tt = acos(rr/sqrt(qq3));
sqq = sqrt(qq);
vv1 = -2.*sqq*cos(tt/3.)-a1/3.;
vv2 = -2.*sqq*cos((tt+2.*PI)/3.)-a1/3.;
vv3 = -2.*sqq*cos((tt+4.*PI)/3.)-a1/3.;
vv = (vv1 > vv2) ? vv1 : vv2;
vv = (vv > vv3) ? vv : vv3;
}
return vv;
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_density */
/* Returns density given T and P */
/*------------------------------------------------------------*/
double RKEOS_density(double temp, do

本文记录了在Fluent 2020R1版本中使用VC++ UDFStudio插件编译用户自定义真实气体模型(UDRGM)时遇到的问题及解决过程。主要问题在于旧版18.2 UDF手册中的函数声明与新版不匹配,导致编译失败。更新为2020R1版本的源代码后,编译成功。加载UDF库后,还需通过TUI命令启用真实气体模型。注意,一旦启用,UDF库无法卸载。

3807

被折叠的 条评论
为什么被折叠?



