0

我正在使用 CFD 模型研究臭氧水相互作用

臭氧在水中的传质和溶解臭氧分解过程被视为两个用户定义的函数(UDF),用C语言编程,然后将这两个UDF加载到Ansys Fluent求解器中。在编译代码时,我收到使用的错误 UDF 代码:

#include "udf.h"
#define vr 0.0025
#define dg 0.003
#define kl 0.0005
#define cn 6.0

DEFINE_VR_RATE(vol_reac_rate, c, t, r, mw, yi, rr, rr_t)
{
    real *rr
    real yi[0] = C_YI(cell,thread,0)

    *rr = vr*C_VOF(c,t)*C_R(c,t)*yi[0]/mw[0];
   
    return *rr;
} 
 /*define ozone decay volume reaction rate */


DEFINE_MASS_TRANSFER (liq_gas_transfer, cell, thread, from_index,from_species_index, to_index, to_species_index)
{
    real m_lg;
    Thread *gas, *liq;
    gas = THREAD_SUB_THREAD(thread, from_species_index);
    liq = THREAD_SUB_THREAD(thread, to_species_index);

        m_lg = kl*cn/dg *C_VOF(cell,gas); /*unit:[s^-1] */
    
    return (m_lg);
} /*define ozone mass transfer rate */

我得到的错误:

mass_transfer_udf.c
..\..\src\mass_transfer_udf.c(10): error C2082: redefinition of formal parameter 'rr'
..\..\src\mass_transfer_udf.c(10): error C2146: syntax error: missing ';' before identifier 'real'
..\..\src\mass_transfer_udf.c(10): error C2275: 'real': illegal use of this type as an expression
C:\PROGRA~1\ANSYSI~1\ANSYSS~1\v221\fluent\fluent22.1.0\src\main\global.h(198): note: see declaration of 'real'
..\..\src\mass_transfer_udf.c(10): error C2146: syntax error: missing ';' before identifier 'yi'
..\..\src\mass_transfer_udf.c(10): error C2065: 'thread': undeclared identifier
..\..\src\mass_transfer_udf.c(10): error C2223: left of '->storageArray' must point to struct/union
..\..\src\mass_transfer_udf.c(10): error C2065: 'cell': undeclared identifier
..\..\src\mass_transfer_udf.c(14): warning C4098: 'vol_reac_rate': 'void' function returning a value
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\HostX86\x64\cl.EXE"' : return code '0x2'
Stop.Error Object: #f

如何解决这些错误。我对 C 语言真的很陌生。

4

1 回答 1

0

错误/警告列表是相当字面的。如果您阅读每个描述,它会告诉您它正在标记的问题,并且通常会告诉您问题在代码中的确切位置。

因此,例如关于“形式参数的重新定义” 在大多数 C 编译器中,未显式键入的参数默认为 int. 所以在下面:

DEFINE_VR_RATE(vol_reac_rate, c, t, r, mw, yi, rr, rr_t)...  

所有参数都默认为 int int。并且错误:redefinition of formal parameter 'rr'告诉您在参数列表中rr 定义为,并试图将其重新定义为.intreal *rrreal

要消除错误,请在每个参数前面加上 C 类型,例如intfloatdoublecharreal(如果在您的环境中定义)。例如:

typedef  float real; //(your system may already have this type)

DEFINE_VR_RATE(real vol_reac_rate, int c, int t, int r, real mw, real yi[r], real rr, real rr_t)  

注意:我猜测上面需要的实际类型,根据需要进行更改。此外,由于yi[0]在代码中使用,因此必须将参数键入为数组或指针。这里我选择了数组,并随机用作rsize 的参数yiyi[r]

关于 “语法错误:缺少';'”:这只是标记缺少的;语句终止符。编辑这个:

    real *rr
    real yi[0] = C_YI(cell,thread,0)

对此:

    //real *rr;  //will already be defined in your parameter list
    yi[0] = C_YI(cell,thread,0); //ditto

关于_ “'real':非法使用这种类型作为表达式”
real在您的环境中被视为一种类型,因此应该仅用于键入变量,但您在表达式中使用它,如变量。;这个错误很可能是前面提到的错误之一,一旦你的函数参数被输入并被放置,它将不复存在。

关于_ “'thread':未声明的标识符” (也称为“单元格”) thread未在函数中使用它的范围内的任何地方声明C_YI()。它可能在头文件中,也可能在另一个.C文件中,但不在此编译器单元中。

关于 -"left of '->storageArray' 必须指向 struct/union"或者type 必须占据语句
的左侧。在您的代码中,它显然没有。structunion->storageArray

关于 "'vol_reac_rate': 'void' 函数返回值"
该函数vol_reac_rate(...)显然被键入为 a void,但在函数体中有一条return x语句。

于 2022-02-08T14:13:01.120 回答