利用VC++UDFStudio插件编译和使用真实气体模型(UDRGM)及踩过的大坑

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

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

         前阵子帮朋友解决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

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值