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

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

         前阵子帮朋友解决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, double press, double yi[])
{
   return 1./RKEOS_spvol(temp, press); /* (Kg/m^3) */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_dvdp                                       */
/*           Returns dv/dp given T and rho                    */
/*------------------------------------------------------------*/
double RKEOS_dvdp(double temp, double density)
{
   double a1,a2,a1p,a2p,a3p,v,press;
   double afun = a0*pow(TCRIT/temp,NRK);
   press = RKEOS_pressure(temp, density);
   v = 1./density;
   a1 = c0-rgas*temp/press;
   a2 = -(bb*b0+rgas*temp*b0/press-afun/press);
   a1p = rgas*temp/(press*press);
   a2p = a1p*b0-afun/(press*press);
   a3p = afun*bb/(press*press);
   return -(a3p+v*(a2p+v*a1p))/(a2+v*(2.*a1+3.*v));
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_dvdt                                       */
/*           Returns dv/dT given T and rho                    */
/*------------------------------------------------------------*/
double RKEOS_dvdt(double temp, double density)
{
   double a1,a2,dadt,a1t,a2t,a3t,v,press;

   double afun = a0*pow(TCRIT/temp,NRK);
   press = RKEOS_pressure(temp, density);
   v = 1./density;
   dadt = -NRK*afun/temp;
   a1 = c0-rgas*temp/press;
   a2 = -(bb*b0+rgas*temp*b0/press-afun/press);
   a1t = -rgas/press;
   a2t = a1t*b0+dadt/press;
   a3t = -dadt*bb/press;
   return -(a3t+v*(a2t+v*a1t))/(a2+v*(2.*a1+3.*v));
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_Cp_ideal_gas                               */
/*           Returns ideal gas specific heat given T          */
/*------------------------------------------------------------*/
double RKEOS_Cp_ideal_gas(double temp)
{
   return (CC1+temp*(CC2+temp*(CC3+temp*(CC4+temp*CC5))));
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_H_ideal_gas                                */
/*           Returns ideal gas specific enthalpy given T      */
/*------------------------------------------------------------*/
double RKEOS_H_ideal_gas(double temp)
{
   return temp*(CC1+temp*(0.5*CC2+temp*(0.333333*CC3+temp*(0.25*CC4+temp*0.2*CC5))));
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_specific_heat                              */
/*           Returns specific heat given T and rho            */
/*------------------------------------------------------------*/
double RKEOS_specific_heat(double temp, double density, double yi[])
{
   double delta_Cp,press,v,dvdt,dadt;
   double afun = a0*pow(TCRIT/temp,NRK);
   press = RKEOS_pressure(temp, density);
   v = 1./density;
   dvdt = RKEOS_dvdt(temp, density);
   dadt = -NRK*afun/temp;
   delta_Cp = press*dvdt-rgas-dadt*(1.+NRK)/b0*log((v+b0)/v)
            + afun*(1.+NRK)*dvdt/(v*(v+b0));
   return RKEOS_Cp_ideal_gas(temp)+delta_Cp;  /* (J/Kg-K) */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy                                   */
/*           Returns specific enthalpy given T and rho        */
/*------------------------------------------------------------*/
double RKEOS_enthalpy(double temp, double density, double yi[])
{
   double delta_h ,press, v;
   double afun = a0*pow(TCRIT/temp,NRK);
   press = RKEOS_pressure(temp, density);
   v = 1./density;
   delta_h = press*v-rgas*temp-afun*(1+NRK)/b0*log((v+b0)/v);
   return H_REF+RKEOS_H_ideal_gas(temp)+delta_h;  /* (J/Kg) */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_entropy                                    */
/*           Returns entropy given T and rho                  */
/*------------------------------------------------------------*/
double RKEOS_entropy(double temp, double density, double yi[])
{
   double delta_s,v,v0,dadt,cp_integral;
   double afun = a0*pow(TCRIT/temp,NRK);
   cp_integral = CC1*log(temp)+temp*(CC2+temp*(0.5*CC3+temp*(0.333333*CC4+0.25*CC5*temp))) - cp_int_ref;
   v = 1./density;
   v0 = rgas*temp/P_REF;
   dadt = -NRK*afun/temp;
   delta_s = rgas*log((v-bb)/v0)+dadt/b0*log((v+b0)/v);
   return S_REF+cp_integral+delta_s; /* (J/Kg-K) */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_mw                                         */
/*           Returns molecular weight                         */
/*------------------------------------------------------------*/
double RKEOS_mw(double yi[])
{
   return MWT; /* (Kg/Kmol) */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_speed_of_sound                             */
/*           Returns s.o.s given T and rho                    */
/*------------------------------------------------------------*/
double RKEOS_speed_of_sound(double temp, double density, double yi[])
{
   double cp = RKEOS_specific_heat(temp, density, yi);
   double dvdt = RKEOS_dvdt(temp, density);
   double dvdp = RKEOS_dvdp(temp, density);
   double v = 1./density;
   double delta_c = -temp*dvdt*dvdt/dvdp;
   return sqrt(cp/((delta_c-cp)*dvdp))*v;  /* m/s */
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_rho_t                                      */
/*------------------------------------------------------------*/
double RKEOS_rho_t(double temp, double density, double yi[])
{
   return -density*density*RKEOS_dvdt(temp, density);
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_rho_p                                      */
/*------------------------------------------------------------*/
double RKEOS_rho_p(double temp, double density, double yi[])
{
   return -density*density*RKEOS_dvdp(temp, density);
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy_t                                 */
/*------------------------------------------------------------*/
double RKEOS_enthalpy_t(double temp, double density, double yi[])
{
   return RKEOS_specific_heat(temp, density, yi);
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy_p                                 */
/*------------------------------------------------------------*/
double RKEOS_enthalpy_p(double temp, double density, double yi[])
{
   double v = 1./density;
   double dvdt = RKEOS_dvdt(temp, density);

   return v-temp*dvdt;
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_viscosity                                  */
/*------------------------------------------------------------*/
double RKEOS_viscosity(double temp, double density, double yi[])
{
   double mu,tr,tc,pcatm;
   tr = temp/TCRIT;
   tc = TCRIT;
   pcatm = PCRIT/101325.;
   mu = 6.3e-7*sqrt(MWT)*pow(pcatm,0.6666)/pow(tc,0.16666)*(pow(tr,1.5)/(tr+0.8));
   return mu;
}

/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_thermal_conductivity                       */
/*------------------------------------------------------------*/
double RKEOS_thermal_conductivity(double temp, double density, double yi[])
{
   double cp, mu;
   cp = RKEOS_Cp_ideal_gas(temp);
   mu = RKEOS_viscosity(temp, density, yi);
   return (cp+1.25*rgas)*mu;
}

/* Export Real Gas Functions to Solver */
UDF_EXPORT RGAS_Functions RealGasFunctionList = 
{
   RKEOS_Setup,			/* initialize		*/
   RKEOS_density,		/* density		*/
   RKEOS_enthalpy,		/* enthalpy  		*/
   RKEOS_entropy,		/* entropy  		*/
   RKEOS_specific_heat,		/* specific_heat	*/
   RKEOS_mw,			/* molecular_weight  	*/
   RKEOS_speed_of_sound,	/* speed_of_sound  	*/
   RKEOS_viscosity,		/* viscosity		*/
   RKEOS_thermal_conductivity,	/* thermal_conductivity	*/
   RKEOS_rho_t,			/* drho/dT |const p 	*/
   RKEOS_rho_p,			/* drho/dp |const T 	*/
   RKEOS_enthalpy_t,		/* dh/dT |const p 	*/
   RKEOS_enthalpy_p		/* dh/dp |const T 	*/
};

编译结果报告很多莫名其妙的错误,如下图所示。

 一度以为是不是VC++ UDF Studio插件出现了bug,结果用传统的自带编译方式仍然是过不了。于是,找到2020R1版本的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)(const char *,...);
static void (*usersError)(const 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_Setup */
/*------------------------------------------------------------*/
void RKEOS_Setup(Domain *domain, cxboolean vapor_phase, char *species_list,
 int(*messagefunc)(const char *format,...),
 void (*errorfunc)(const 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", species_list);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_pressure */
/* Returns pressure 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 = pow(sqrt(-dd)+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(cell_t cell, Thread *thread, cxboolean vapor_phase, double temp, double press, double yi[])
{
 return 1./RKEOS_spvol(temp, press); /* (Kg/m3) */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_dvdp */
/* Returns dv/dp given T and rho */
/*------------------------------------------------------------*/
double RKEOS_dvdp(double temp, double density)
{
 double a1,a2,a1p,a2p,a3p,v,press;
 double afun = a0*pow(TCRIT/temp,NRK);
 press = RKEOS_pressure(temp, density);
 v = 1./density;
 a1 = c0-rgas*temp/press;
 a2 = -(bb*b0+rgas*temp*b0/press-afun/press);
 a1p = rgas*temp/(press*press);
 a2p = a1p*b0-afun/(press*press);
 a3p = afun*bb/(press*press);
 return -(a3p+v*(a2p+v*a1p))/(a2+v*(2.*a1+3.*v));
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_dvdt */
/* Returns dv/dT given T and rho */
/*------------------------------------------------------------*/
double RKEOS_dvdt(double temp, double density)
{
 double a1,a2,dadt,a1t,a2t,a3t,v,press;
 double afun = a0*pow(TCRIT/temp,NRK);
 press = RKEOS_pressure(temp, density);
 v = 1./density;
 dadt = -NRK*afun/temp;
 a1 = c0-rgas*temp/press;
 a2 = -(bb*b0+rgas*temp*b0/press-afun/press);
 a1t = -rgas/press;
 a2t = a1t*b0+dadt/press;
 a3t = -dadt*bb/press;
 return -(a3t+v*(a2t+v*a1t))/(a2+v*(2.*a1+3.*v));
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_Cp_ideal_gas */
/* Returns ideal gas specific heat given T */
/*------------------------------------------------------------*/
double RKEOS_Cp_ideal_gas(double temp)
{
 return (CC1+temp*(CC2+temp*(CC3+temp*(CC4+temp*CC5))));
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_H_ideal_gas */
/* Returns ideal gas specific enthalpy given T */
/*------------------------------------------------------------*/
double RKEOS_H_ideal_gas(double temp)
{
 return temp*(CC1+temp*(0.5*CC2+temp*(0.333333*CC3+
 temp*(0.25*CC4+temp*0.2*CC5))));
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_specific_heat */
/* Returns specific heat given T and rho */
/*------------------------------------------------------------*/
double RKEOS_specific_heat(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 double delta_Cp,press,v,dvdt,dadt;
 double afun = a0*pow(TCRIT/temp,NRK);
 press = RKEOS_pressure(temp, density);
 v = 1./density;
 dvdt = RKEOS_dvdt(temp, density);
 dadt = -NRK*afun/temp;
 delta_Cp = press*dvdt-rgas-dadt*(1.+NRK)/b0*log((v+b0)/v)
	 + afun*(1.+NRK)*dvdt/(v*(v+b0));
 return RKEOS_Cp_ideal_gas(temp)+delta_Cp; /* (J/Kg-K) */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy */
/* Returns specific enthalpy given T and rho */
/*------------------------------------------------------------*/
double RKEOS_enthalpy(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 double delta_h,press, v;
 double afun = a0*pow(TCRIT/temp,NRK);
 press = RKEOS_pressure(temp, density);
 v = 1./density;
 delta_h = press*v-rgas*temp-afun*(1+NRK)/b0*log((v+b0)/v);
 return H_REF+RKEOS_H_ideal_gas(temp)+delta_h; /* (J/Kg) */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_entropy */
/* Returns entropy given T and rho */
/*------------------------------------------------------------*/
double RKEOS_entropy(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 double delta_s,v,v0,dadt,cp_integral;
 double afun = a0*pow(TCRIT/temp,NRK);
 cp_integral = CC1*log(temp)+temp*(CC2+temp*(0.5*CC3+
 temp*(0.333333*CC4+0.25*CC5*temp)))
 - cp_int_ref;
 v = 1./density;
 v0 = rgas*temp/P_REF;
 dadt = -NRK*afun/temp;
 delta_s = rgas*log((v-bb)/v0)+dadt/b0*log((v+b0)/v);
 return S_REF+cp_integral+delta_s; /* (J/Kg-K) */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_mw */
/* Returns molecular weight */
/*------------------------------------------------------------*/
double RKEOS_mw(double yi[])
{
 return MWT; /* (Kg/Kmol) */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_speed_of_sound */
/* Returns s.o.s given T and rho */
/*------------------------------------------------------------*/
double RKEOS_speed_of_sound(cell_t cell, Thread *thread, double temp, double density, double P, 
 double yi[])
{
 double cp = RKEOS_specific_heat(cell, thread, temp, density, P, yi);
 double dvdt = RKEOS_dvdt(temp, density);
 double dvdp = RKEOS_dvdp(temp, density);
 double v = 1./density;
 double delta_c = -temp*dvdt*dvdt/dvdp;
 return sqrt(cp/((delta_c-cp)*dvdp))*v; /* m/s */
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_rho_t */
/*------------------------------------------------------------*/
double RKEOS_rho_t(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 return -density*density*RKEOS_dvdt(temp, density);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_rho_p */
/*------------------------------------------------------------*/
double RKEOS_rho_p(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 return -density*density*RKEOS_dvdp(temp, density);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy_t */
/*------------------------------------------------------------*/
double RKEOS_enthalpy_t(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 return RKEOS_specific_heat(cell, thread, temp, density, P, yi);
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_enthalpy_p */
/*------------------------------------------------------------*/
double RKEOS_enthalpy_p(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 double v = 1./density;
 double dvdt = RKEOS_dvdt(temp, density);
 return v-temp*dvdt;
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_viscosity */
/*------------------------------------------------------------*/
double RKEOS_viscosity(cell_t cell, Thread *thread, double temp, double density, double P, double yi[])
{
 double mu,tr,tc,pcatm;
 tr = temp/TCRIT;
 tc = TCRIT;
 pcatm = PCRIT/101325.;
 mu = 6.3e-7*sqrt(MWT)*pow(pcatm,0.6666)/pow(tc,0.16666)*
 (pow(tr,1.5)/(tr+0.8));
 return mu;
}
/*------------------------------------------------------------*/
/* FUNCTION: RKEOS_thermal_conductivity */
/*------------------------------------------------------------*/
double RKEOS_thermal_conductivity(cell_t cell, Thread *thread, double temp, 
 double density, double P, double yi[])
{
 double cp, mu;
 cp = RKEOS_Cp_ideal_gas(temp);
 mu = RKEOS_viscosity(cell, thread, temp, density, P, yi);
 return (cp+1.25*rgas)*mu;
}
/* Export Real Gas Functions to Solver */
UDF_EXPORT RGAS_Functions RealGasFunctionList =
{
 RKEOS_Setup, /* initialize */
 RKEOS_density, /* density */
 RKEOS_enthalpy, /* enthalpy */
 RKEOS_entropy, /* entropy */
 RKEOS_specific_heat, /* specific_heat */
 RKEOS_mw, /* molecular_weight */
 RKEOS_speed_of_sound, /* speed_of_sound */
 RKEOS_viscosity, /* viscosity */
 RKEOS_thermal_conductivity, /* thermal_conductivity */
 RKEOS_rho_t, /* drho/dT |const p */
 RKEOS_rho_p, /* drho/dp |const T */
 RKEOS_enthalpy_t, /* dh/dT |const p */
 RKEOS_enthalpy_p /* dh/dp |const T */
};

编译结果就能顺利通过。

 

 经过对比,原来是这些RKEOS_XXX的函数声明已经悄悄发生了变化,例如RKEOS_density函数,旧版本18.2中的声明是

double RKEOS_density(double temp, double press, double yi[])

而新版本2020R1中改成了

double RKEOS_density(cell_t cell, Thread *thread, cxboolean vapor_phase, double temp, double press, double yi[])

难怪编译老是过不了。大家引以为鉴,尽量找和当前使用版本一致的手册。

         编辑通过以后就可以点击加载按钮将UDF库加载到Fluent,控制台就可以看到“I_do_nothing”的宏成功加载的提示。

 

加载成功后,还需要进一步使用如下TUI命令才能让我们编译好的UDRGM被Fluent调用。 

/define/user-defined/real-gas-models/user-defined-real-gas-model

是否使用回答“yes”,然后输入库的名字“libudf”。

 此时,在Materials里面就会多出一个“real-gas-fluid”的气体物性,其特性就是我们UDF定义的真实气体模型。

 顺带说一句,一旦用TUI命令开启加载真实气体模型,UDF库就无法卸载,这是fluent自身的问题,和VC++ UDF Studio插件没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值