UDF 第3章写UDFs
本章包含了FLUENT中如何写UDFs的概述。
3.1 概述
3.2写解释式UDFs的限制
3.3 FLUENT中UDFs求解过程的顺序
3.4 FLUENT网格拓扑
3.5 FLUENT数据类型
3.6 使用DEFINE Macros定义你的UDF
3.7在你的UDF源文件中包含udf.h文件
3.8 定义你的函数中的变量
3.9函数体
3.10 UDF 任务
3.11 为多相流应用写UDFs
3.12在并行中使用你的UDF
3.1概述(Introduction)
在你开始编写将挂到FLUENT代码以增强其标准特征的UDF之前,你必须知道几个基本的要求。首先,UDFs必须用C语言编写。它们必须使用FLUENT提供的DEFINE macros来定义。UDFs必须含有包含于源代码开始指示的udf.h文件;它允许为DEFINE macros和包含在编译过程的其它FLUENT提供的函数定义。UDFs只使用预先确定的宏和函数从FLUENT求解器访问数据。通过UDF 传递到求解器的任何值或从求解器返回到UDF的,都指定为国际(SI)单位。总之,当写UDF时,你必须记住下面的FLUENT要求。UDFs:
1.采用C语言编写。
2.必须为udf.h文件有一个包含声明。
3.使用Fluent.Inc提供的DEFINE macros来定义。
4.使用Fluent.Inc提供的预定义宏和函数来访问FLUENT求解器数据。
5.必须使返回到FLUENT求解器的所有值指定为国际单位。
3.2写解释式UDFs的限制(Restriction on Writing Interpreted UDFs)
无论UDFs在FLUENT中以解释还是编译方式执行,用户定义C函数(说明在Section 3.1中)的基本要求是相同的,但还是有一些影响解释式UDFs的重大编程限制。FLUENT解释程序不支持所有的C语言编程原理。解释式UDFs不能包含以下C语言编程原理的任何一个:
1.goto 语句。
2.非ANSI-C原型语法
3.直接的数据结构查询(direct data structure references)
4.局部结构的声明
5.联合(unions)
6.指向函数的指针(pointers to functions)
7.函数数组。
在访问FLUENT求解器数据的方式上解释式UDFs也有限制。解释式UDFs不能直接访问存储在FLUENT结构中的数据。它们只能通过使用Fluent提供的宏间
接地访问这些数据。另一方面,编译式UDFs没有任何C编程语言或其它注意的求解器数据结构的限制。
3.3 FLUENT求解过程中UDFs的先后顺序(Sequencing of UDFs in the FLUENT Solution Process)
当你开始写UDF代码的过程时(依赖于你写的UDF的类型),理解FLUENT求解过程中UDFs调用的内容或许是重要的。求解器中包含连接你写的用户定义函数的call-outs。知道FLUENT求解过程中迭代之内函数调用的先后顺序能帮助你在给定的任意时间内确定那些数据是当前的和有效的。
分离式求解器
在分离式求解器求解过程中(Figure 3.3.1),用户定义的初始化函数(使用DEFINE_INIT定义的)在迭代循环开始之前执行。然后迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。接着,求解守恒方程,顺序是从动量方程和后来的压力修正方程到与特定计算相关的附加标量方程。守恒方程之后,属性被更新(包含用户定义属性)。这样,如果你的模型涉及到气体定律,这时,密度将随更新的温度(和压力and/or 物质质量分数)而被更新。进行收敛或者附加要求的迭代的检查,循环或者继续或停止。
Figure 3.3.1: Solution Procedure for the Segregated Solver
耦合求解器
在耦合求解器求解过程中(Figure 3.3.2),用户定义的初始化函数(使用
DEFINE_INIT定义的)在迭代循环开始之前执行。然后,迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。接着,FLUENT求解连续、动量和(适合的地方)能量的控制方程和同时地一套物质输运或矢量方程。其余的求解步骤与分离式求解器相同(Figure 3.3.1)。
Figure 3.3.2: Solution Procedure for the Coupled Solver
3.4 FLUENT 网格拓扑
在我们开始讨论FLUENT特殊的数据类型之前,你必须理解网格拓扑学的术语因为FLUENT数据类型是为这些实体定义的。下面是显示在Figure 3.4.1中的网格实体的定义。
单元(cell)区域被分割成的控制容积
单元中心(cell center)FLUENT中场数据存储的地方
面(face)单元(2D or 3D)的边界
边(edge)面(3D)的边界
节点(node)网格点
单元线索(cell thread)在其中分配了材料数据和源项的单元组面线索(face thread)在其中分配了边界数据的面组
节点线索(node thread)节点组
区域(domain)由网格定义的所有节点、面和单元线索的组合
Figure 3.4.1: Grid Terminology
3.5 FLUENT数据类型(FLUENT Data Types)
除了标准的C语言数据类型如real, int 等可用于在你的UDF中定义数据外,还有几个FLUENT指定的与求解器数据相关的数据类型。这些数据类型描述了FLUENT中定义的网格的计算单位(见Figure 3.4.1)。使用这些数据类型定义的变量既有代表性地补充了DEFINE macros的自变量,也补充了其它专门的访问FLUENT求解器数据的函数。
一些更为经常使用的FLUENT数据类型如下:
cell_t
face_t
Thread
Domain
Node
cell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单
元的整数索引。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数索引。
Thread数据类型是 FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。
Node数据类型也是FLUENT中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。
Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。
!!注意,FLUENT中所有数据类型都是情形敏感的(case-sensitive)。
3.6 使用DEFINE Macros定义你的UDF(Defining Y our UDF Using DEFINE Macros)
Fluent.Inc为你提供了一套你必须使用它来定义你的UDF的预定义函数。这些定义UDFs的函数在代码中作为宏执行,可在作为DEFINE(全部大写)宏的文献中查阅。对每个DEFINE 宏的完整描述和它的应用例子,可参考第四章。DEFINE宏的通用格式为:
DEFINE_MACRONAME(udf_name, passed-in variables)
这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的必须用小写字母指定。一旦函数被编译(和连接),你为你的UDF选择的名字在FLUENT 下拉列表中将变成可见的和可选的。第二套输入到DEFINE 宏的自变量是从FLUENT求解器传递到你的函数的变量。
在下面的例子中,宏
DEFINE_PROFILE(inlet_x_velocity, thread, index)
用两个从FLUENT传递到函数的变量thread和index定义了名字为inlet_x_velocity的分布函数。这些passed-in变量是边界条件区域的ID(作为指向thread的指针)而index确定了被存储的变量。一旦UDF被编译,它的名字(例如,inlet_x_velocity)将在FLUENT适当的边界条件面板(例如,Velocity Inlet 面板)的下拉列表中变为可见的和可选的。
!!注意,所有用于DEFINE宏的自变量必须放在你的源代码的同一行上。分割DEFINE的声明为几行可能导致编译错误。
3.7在你的UDF源文件中包含udf.h文件(Including the udf.h File in Y our UDF Source File)
DEFINE 宏的定义位于称为udf.h(见附录A的列表)的头文件中。为了使DEFINE 宏延伸到编译过程,你必须在你写的每个UDF源文件的开始包含udf.h 文件。#include "udf.h"
/* Always include udf.h when writing a UDF. It translates the DEFINE */
/* and other macros into C, which is what the compiler understands. */
通过在你的UDF源文件中包含udf.h,编译过程中所有的DEFINE宏的定义与源代码一起被包含进来。udf.h文件也为所有的C库函数头文件包含#include指示,与大部分头文件是针对Fluent提供的宏和函数是一样的(例如,mem.h)。除非有另外的指示,没必要在你的UDF中个别地包含这些头文件。
还有,当你编译你的UDF时,你不必放置udf.h的拷贝在你的当地目录下;一旦你的UDF被编译,FLUENT求解器会自动地从Fluent.Inc/fluent6.x/src/目录来读取udf.h文件。
举例
从前面部分的宏
DEFINE_PROFILE(inlet_x_velocity, thread, index)
定义在udf.h文件中为
#define DEFINE_PROFILE(name, t, i) void name(Thread *t, int i)
在编译过程中延伸为
void inlet_x_velocity(Thread *thread, int index)
名字为inlet_x_velocity的函数不返回值由于它被声明为空的数据类型。
3.8在你的函数中定义变量(Defining Variable in Y our Function)
在你的UDF源文件中包含了udf.h头文件后,你必须定义真实的变量。使用把它们定义在所有函数之外的全局变量(如果它们被源文件中大部分或所有函数共享)是非常方便的。关于全局变量的信息见Section 2.5.3。局部于函数的任何变量必须在函数内声明。局部变量的信息见Section 2.5.2。
3.9函数体(Functin Body)
你的UDF源文件中的C函数体被包含在DEFINE声明之下的一对大括号内,显示在下面的例子中。在这个例子中,mu_lan和temp是局部变量。只有cell_viscosity 函数认识它们。
例子
DEFINE_PROPERTY(cell_viscosity, cell, thread)
{
real mu_lam;
real temp = C_T(cell, thread);
if (temp > 288.)
mu_lam = 5.5e-3;
else if (temp > 286.)
mu_lam = 143.2135 - 0.49725 * temp;
else
mu_lam = 1.;
return mu_lam;
}
3.10 UDF任务(UDF Tasks)
UDF可执行的任务有五种不同的类型:
1.返回值
2.修改自变量
3.返回值和修改自变量
4.修改FLUENT变量(不能作为自变量传递)
5.写信息到(或读取信息从)case或data文件
函数能返回值,除非它们在udf.h文件中被定义为void。如果它们不返回值,它们能修改自变量,修改存储在内存中的变量,或与case和data文件一起执行输入输出(I/O)任务。
在Section 3.10.1-3.10.5中,提供了描述上面提到的五种不同的函数任务中每一种的UDF源代码例子。
3.10.1 返回值的函数(Function that Return a Value)
下面的UDF是一个返回值到FLUENT求解器的函数例子。名为cell_viscosity的函数计算了依赖温度的粘度值(mu_lam)并返回这个值到求解器。
/********************************************************************/ /* UDF that returns a value to the solver */ /* Specifies a temperature-dependent viscosity property */ /********************************************************************/ #include "udf.h"
DEFINE_PROPERTY(cell_viscosity, cell, thread)
{
real mu_lam;
real temp = C_T(cell, thread);
if (temp > 288.)
mu_lam = 5.5e-3;
else if (temp > 286.)
mu_lam = 143.2135 - 0.49725 * temp;
else
mu_lam = 1.;
return mu_lam;
}
cell_viscosity使用了DEFINE_PROPERTY 宏(在Section 4.3.6中描述)来定义。DEFINE_PROPERTY返回一个udf.h中指定的real数据类型。两个real变量传入函数:通过函数计算的层流粘度mu_lam; 和C_T(cell,thread)的值,它是在考虑中的单元的温度值。温度值在它下降范围的基础上被检测,mu_lam的适当值被计算。在函数结尾,mu_lam的计算值被返回。
3.10.2修改自变量的函数(Function that Modify an Argument)
下面的UDF是一个修改一个自变量的函数的例子。名字为user_rate的函数为一个两种气态物质的的简单系统产生一个自定义的体积反应速率。Real指针rr作为自变量传递给函数,指针指向的变量在函数内被修改。
/**************************************************************/
/* UDF that modifies one of its arguments */
/* Specifies a reaction rate in a porous medium */
/**************************************************************/
#include "udf.h"
#define K1 2.0e-2
#define K2 5.
DEFINE_VR_RA TE(user_rate, c, t, r, mole_weight, species_mf, rr, rr_t)
{
real s1 = species_mf[0];
real mw1 = mole_weight[0];
if (FLUID_THREAD_P(t) && THREAD_VAR(t).fluid.porous)
*rr = K1*s1/pow((1.+K2*s1),2.0)/mw1;
else
*rr = 0.;
}
user_rate使用了DEFINE_VR _RATE宏(见Section 4.3.14)来定义。该函数执行一个当前考虑的单元是否在多孔区域的测试,这个反应速率只应用于多孔区域。real指针变量rr是一个传递给函数的自变量。UDF使用废弃操作符* 分配反应速率值给废弃指针*rr。指针rr指向的目标是设置反应速率。通过这个操作,存储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身。(关于废弃指针的详细内容见[3])。
3.10.3返回一个值和修改一个自变量的函数(Functions that Return a Value ans Modify an Argument)
下面的UDF是一个修改它的自变量并返回一个值到FLUENT求解器的函数例子。名字为user_swirl的函数修改ds自变量,指定旋转速度源项并返回它到求解器。
/**************************************************************/
/* UDF that returns a value and modifies an argument */
/* Specifies a swirl-velocity source term */
/**************************************************************/
#include "udf.h"
#define OMEGA 50. /* rotational speed of swirler */
#define WEIGHT 1.e20 /* weighting coefficients in linearized equation */
DEFINE_SOURCE(user_swirl, cell, thread, dS, eqn)
{
real w_vel, x[ND_ND], y, source;
C_CENTROID(x, cell, thread);
y = x[1];
w_vel = y*OMEGA; /* linear w-velocity at the cell */
source = WEIGHT*(w_vel - C_WSWIRL(cell,thread));
dS[eqn] = -WEIGHT;
return source;
}
user_swirl使用DEFINE_SOURCE宏来定义(在Section 4.3.8中描述)。
DEFINE_SOURCE返回一个在udf.h中指定的数据类型。函数采用自变量ds(它是数组的名字)并设置由eqn指定的元素为关于w速度(w_vel)导数的值。(这是z动量方程源项)。这个函数也计算了旋转速度源项的值source,并返回这个值到求解器。
3.10.4修改FLUENT变量的函数(Functions that Modify a FLUENT Variable)下面的UDF是一个修改存储在内存中FLUENT变量的函数例子。名字为inlet_x_velocity的函数使用F_PROFILE(a Fluent Inc. provided utility)来修改存储在内存中的x速度分布边界条件。
/********************************************************************/ /* UDF that modifies a FLUENT solver variable */ /* Specifies a steady-state velocity profile boundary condition */ /********************************************************************/
#include "udf.h"
DEFINE_PROFILE(inlet_x_velocity, thread, index)
{
real x[ND_ND]; /* this will hold the position vector */
real y;
face_t f;
begin_f_loop(f, thread)
{
F_CENTROID(x,f,thread);
y = x[1];
F_PROFILE(f, thread, index) = 20. - y*y/(.0745*.0745)*20.;
}
end_f_loop(f, thread)
}
inlet_x_velocity使用DEFINE_PROFLIE宏来定义(在Section 4.3.5中描述)。它的自变量是thread和index。Thread是一个指向面线索的指针,而index是一个每个循环内为变量设置数值标签的整数。DEFINE_PROPERTY在udf.h文件中一个返回void的数据类型。
函数由声明变量f作为face_t数据类型开始。一维数组x和变量y是real 数据类型。循环宏用来在区域中每个面上循环以创建型线或数据数组。在每个循环内,F_CENTROID为含有index f的面输出面质心的值(数组x),index f在由thread 指向的线索上。存储在x[1]中的y坐标分配给变量y,它用于计算x速度。然后这个值分配给F_PROFILE, 它使用整数index(由求解器传递个它)来设置内存中面上的x速度值。
3.10.5写入Case或Data文件或从中读取的函数(Functions that Write to or Read from a Case or Data File)
下面的C源代码包含了写信息到data文件和读回它的函数例子。这是一个包含多个连接在一起的UDFs的单个C文件例子。
/******************************************************************/
/* UDFs that increment a variable, write it to a data file */ /* and read it back in */ /******************************************************************/
#include "udf.h"
int kount = 0; /* define global variable kount */
DEFINE_ADJUST(demo_calc, domain)
{
kount++;
printf("kount = %d\n",kount);
}
DEFINE_RW_FILE(writer, fp)
{
printf("Writing UDF data to data file...\n");
fprintf(fp, "%d",kount); /* write out kount to data file */
}
DEFINE_RW_FILE(reader, fp)
{
printf("Reading UDF data from data file...\n");
fscanf(fp, "%d",&kount); /* read kount from data file */
}
在顶部的列表中,整数kount被定义为全局的(由于它被源代码文件中的所有三个函数使用)并初始化为0。名字为demo_calc的第一个函数,使用DEFINE_SDJUST 宏来定义。(关于DEFINE_ADJUST的详细信息见Section 4.2.1)。在demo_calc中,kount的值每次迭代后增加因为每次迭代调用DEFINE_ADJUST一次。名字为writer的第二个函数,使用DEFINE_RW_FILE 宏来定义。(关于DEFINE_RW_FILE的详细信息见Section 4.2.4)。当保存数据文件时,它指示FLUENT写当前kount值到数据文件。名字为reader的第三个函数,当读取数据文件时,它指示FLUENT从这个数据文件中读取kount的值。这三个函数一起工作如下。如果你运行10次迭代计算(kount将增加到值为10)并保存这个数据文件,当前kount(10)的值被写入你的数据文件。如果你读这个数据返回到FLUENT并继续计算,kount将以值10开始随着每次迭代继续增加。注意,你可尽你所想的保存静态变量,但是必须保证以与它们被写的相同顺序来读取它们。
3.11为多相流应用写UDFs(Writing UDFs for Mulutiphase Applications)
当一个多相流模型在FLUENT中被激活时,属性和变量的存储和对单相一样应当为所有相的混合设置它们。这可以通过使用附加线索(thread)和区域数据结构在代码中得以表明。
3.11.1多相应用的数据结构(Data Structure for Multiphase Applications)
区域和线程(Domains and Threads)
在多相流应用中,最高级别的区域被用作超级区域。每相占据的区域用作子区域
第三种类型区域是相互作用区,为了定义相间的相互作用才引入它的。当混合属
性和变量必要时(所有相的和),超级区域用于这些数量而子区域携带了单相的
信息。在单一相中混合的概念用于描述所有种类(成分)的和而在多相中它描述
了所有相的总和。这个区别是非常重要的因为以后代码将延伸到多相多组分(例
如,这里相是种类的混合)。
由于求解器的数据存储在线程(thread)数据结构中,线程必须既和超级区域相
联系又和每个子区域相联系。就是说,对定义在超级区域上的每个单元或面线程,
有相应的单元或面线程定义在每个子区域上。定义在超级区域每个线程上的某些
信息与子区域每个相应线程上的共享。与超级区域相关的线程被用作超级线程,
而与子区域相关的线程被用作相级别线程或子线程。区域和线程的层次总结在
Figure 3.11.1中。
Figure 3.11.1: Domain and Thread Structure Hierarchy
Figure 3.11.1也引入了domain_id和phase_domain_indexed的概念。domain_id在UDFs中用于辨别超级区域从主要和次要的相级别区域中。超级区域的domain_id值总是被指定为1。相互作用区域也有相同的domain_id。domain_ids不必要如Figure3.11.1显示的顺序排列。dhase_domain_index 在UDFs中用于从次要相级别线程中辨别主要相级别线程。对主要相级别线程,
phase_domain_index总是分配值为0。
访问数据(Accessing Data)
当你写UDF或为多相应用使用宏时,参考与尝试访问其属性的相(subdomain)或混合(super domain)相关的数据结构(thread or domain)是很重要的。作为例子,宏C_R(c,t)将返回线程t
的单元c上的密度。如果t是指向超级线程的指针,那么返回的是混合密度。如果t是指向子线程的指针,那么返回的是相密度。
当传递到你的UDF的线程或区域指针不被你的函数需要时,也有一些例子。这取决于你使用的多相模型,你尝试修改的属性或项(例如,你使用的那个DEFINE宏),还有受到影响的相或混合。为了更好地理解这点,回想一个混合模型和欧拉多相模型之间区别的例子。在混合模型中,为混
合相求解单一的动量方程,混合相的属性由它的相的总和来决定。在欧拉模型中,动量方程为每一相求解。当使用混合模型时,FLUENT允许你直接为混合相指定动量源项(使用
DEFINE_SOURCE),但是不能为欧拉模型。对后者,你可以为单个相指定动量源项。因此,多相模型及被UDF修改的项,决定了那哪个区域或线程是需要的。
从求解器传递到你的UDF的特定的区域或线程的结构取决于你使用的DEFINE宏。例如,DEFINE_INIT和DEFINE_ADJUST函数总是传递与超级区域相关的区域结构。
DEFINE_ON_DEMAND函数不能传递任何区域结构。如果你的UDF不能明确地传递指针到你的函数定义要求的线程或区域,那么你可以使用multiphase-specific utility macro找会它(见第6章)。为了你方便使用,表3.11.1-3.11.6总结了每个多相模型和相,在该相上为每个给定变量指定了UDF。从这些信息,你可推断出那些区域结构是从求解器传递到UDF的。
单相和多相模型应用UDFs之间的区别(Differences Between UDFs for Single-Phase and Multiphase Applications)
注:在许多例子中,为单相流动写的UDF源代码和为多相流动写的是相同的。例如,假设函数只从它被连接(hooked)到的相级别区域访问数据,为单相边界型线(使用DEFINE_PROFIEL定义的)写的C代码为多相边界型线写的代码之间是没有区别的。然而,如果那些函数从除混合级别区域之外的任何区域访问数据,调整和初始化UDFs的代码对单相和多相流动是不同的。
3.11.2 对多相模型使用UDFs(Using UDFs for Multiphase Models)
在多相模型中,从求解器传递到你的UDF的数据结构(例如区域和线程指针)取决于你使用的DEFINE宏。传递哪一个特定的区域或线程取决于函数连接到求解器的什么地方。例如,被连接到混合模型的函数传递超级区域结构,而连接到特定相的函数传递子区域结构。表3.11.1-3.11.6列举了DEFINE和对每个多相模型UDF被连接到的相。从这些信息你可推断出那些数据结构被传递。回想DEFINE_ADJUST和DEFINE_INIT UDFs are hardwired to the mixture-level domain,而
3.12在并行下使用你的UDF(Using Your UDF in Parallel)
如果你想在FLUENT并行版本中使用UDF,你必须添加一些额外的代码行到你的UDF。例如,如果你的UDF通过在面上循环计算总和,那么每个处理器需要为它拥有的面计算局部和,然后,在循环结尾,全局和将必须执行。如果这个“并行化”的修改没有进入你的UDF代码,那么这时总和常被分解成若干量,那些线程上的序号为零的面的计算节点将被0除从而导致浮点错误。
为real数全局求和的操作是PRF_GRSUM1。你必须沿着对每个计算节点的总和添加这个操作到你的代码,例子的代码显示如下。
/******************************************************************/ /* Sample code demonstrating parallelizing a UDF */ /******************************************************************/ /* compute local sum on each compute-node */
a = 0;
begin_f_loop() /* loop over faces */
{
a += ...; /* put your local sum function here */
}
end_f_loop
a = PRF_GRSUM1(a); /* compute global sum, and assign it to */
/* variable named a */
Fluent经典问题及解答 1 对于刚接触到FLUENT新手来说,面对铺天盖地的学习资料和令人难读的FLUENT help,如何学习才能在最短的时间内入门并掌握基本学习方法呢?(#61) 2 CFD计算中涉及到的流体及流动的基本概念和术语:理想流体和粘性流体;牛顿流体和非牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。(13楼) 3 在数值模拟过程中,离散化的目的是什么?如何对计算区域进行离散化?离散化时通常使用哪些网格?如何对控制方程进行离散?离散化常用的方法有哪些?它们有什么不同?(#80) 4 常见离散格式的性能的对比(稳定性、精度和经济性)(#62) 5 在利用有限体积法建立离散方程时,必须遵守哪几个基本原则?(#81) 6 流场数值计算的目的是什么?主要方法有哪些?其基本思路是什么?各自的适用范围是什么?(#130) 7 可压缩流动和不可压缩流动,在数值解法上各有何特点?为何不可压缩流动在求解时反而比可压缩流动有更多的困难?(#55) 8 什么叫边界条件?有何物理意义?它与初始条件有什么关系?(#56) 9 在一个物理问题的多个边界上,如何协调各边界上的不同边界条件?在边界条件的组合问题上,有什么原则? 10 在数值计算中,偏微分方程的双曲型方程、椭圆型方程、抛物型方程有什么区别?(#143) 11 在网格生成技术中,什么叫贴体坐标系?什么叫网格独立解?(#35) 12 在GAMBIT的foreground和background中,真实体和虚实体、实操作和虚操作四个之间是什么关系? 13 在GAMBIT中显示的“check”主要通过哪几种来判断其网格的质量?及其在做网格时大致注意到哪些细节?(#38) 14 画网格时,网格类型和网格方法如何配合使用?各种方法有什么样的应用范围及做网格时需注意的问题?(#169) 15 对于自己的模型,大多数人有这样的想法:我的模型如何来画网格?用什么样的方法最简单?这样做网格到底对不对?(#154) 16 在两个面的交界线上如果出现网格间距不同的情况时,即两块网格不连续时,怎么样克服这种情况呢?(#40) 17 依据实体在GAMBIT建模之前简化时,必须遵循哪几个原则?(#170) 18 在设置GAMBIT边界层类型时需要注意的几个问题:a、没有定义的边界线如何处理?b、计算域内的内部边界如何处理(2D)?(#128) 19 为何在划分网格后,还要指定边界类型和区域类型?常用的边界类型和区域类型有哪些?(#127) 20 何为流体区域(fluid zone)和固体区域(solid zone)?为什么要使用区域的概念?FLUENT是怎样使用区域的?(#41) 21 如何监视FLUENT的计算结果?如何判断计算是否收敛?在FLUENT中收敛准则是如何定义的?分析计算收敛性的各控制参数,并说明如何选择和设置这些参数?解决不收敛问题通常的几个解决方法是什么?(9楼) 22 什么叫松弛因子?松弛因子对计算结果有什么样的影响?它对计算的收敛情况又有什么样的影响?(7楼)
网格质量与那些因素有关? 网格质量本身与具体问题的具体几何特性、流动特性及流场求解算法有关。因此,网格质量最终要由计算结果来评判,但是误差分析以及经验表明,CFD计算对计算网格有一些一般性的要求,例如光滑性、正交性、网格单元的正则性以及在流动变化剧烈的区域分布足够多的网格点等。对于复杂几何外形的网格生成,这些要求往往并不可能同时完全满足。例如,给定边界网格点分布,采用Laplace 方程生成的网格是最光滑的,但是最光滑的网格不一定满足物面边界正交性条件,其网格点分布也很有可能不能捕捉流动特征,因此,最光滑的网格不一定是最好的网格。对计算网格的一个最基本的要求当然是所有网格点的Jacobian必须为正值,即网格体积必须为正,其他一些最常用的网格质量度量参数包括扭角(skew angle)、纵横比(aspect ratio、Laplacian)、以及弧长(arc length)等。通过计算、检查这些参数,可以定性的甚至从某种程度上定量的对网格质量进行评判。Parmley等给出了更多的基于网格元素和网格节点的网格质量度量参数。有限元素法关于插值逼近误差估计的理论,实际上也对网格单元的品质给出了基本的规定:即每个单元的内切球半径与外切球半径之,应该是一个适当的,与网格疏密无关的常数。 实体与虚体的区别 在建模中,经常会遇到实体、实面与虚体、虚面,虚体的计算域也可以进行计算并得到所需的结果。那么它们的区别是什么呢? 对于求解是没有任何区别的,只要你能在虚体或者实体上划分你需要的网格。关键是看你网格生成的质量如何,与实体虚体无关。 gambit的实体和虚体在生成网格和计算的时候对于结果没有任何影响,实体和虚体的主要区别有以下几点: 1.实体可以进行布尔运算但是虚体不能,虽然不能进行布尔运算,但是虚体存在merge,split 等功能。 2.实体运算在很多cad软件里面都有,但是虚体是gambit的一大特色,有了虚体以后,gambit 的建模和网格生成的灵活性增加了很多。 3.在网格生成的过程中,如果有几个相对比较平坦的面,你可以把它们通过merge合成一个,这样,作网格的时候,可以节省步骤,对于曲率比较大的面,可能生成的网格质量不好,这时候,你可以采取用split的方式把它划分成几个小面以提高网格质量。 在Fluent中进行非稳态(unsteady)计算时如何设置步长?
Fluent动网格----layering个一个简单实例我这几天看了点动网格技术方面的东西,在学习过程中发现这方面的例子很少,自己也走了一些弯路。现在还好,弄明白了一些,能够应付现在我的工作。为了让更多学习者快速了解动网格,我打算尽量把我学习心得在这里和大家分享,这里给出一个layering的一个简单例子。 1.Gambit画网格 本例很简单,在Gambit里画一个10*10的矩形,网格间隔为1,也就是有100个网格,具体见下图。都学动网格的人了,不至于这个不会做! 这里需要注意一个问题:设置边界条件的时候,一定要把要移动的边单独设定,本例中一右边界作为移动的边,设成wall就可以,这里再后面需要制定。 2.编写UDF #include "udf.h" #include "unsteady.h" #include "stdio.h" #include "stdlib.h" /************************************************************/ real current_time = 0.0 ; Domain * domain ; Thread * thread ; real NV_VEC( origin ),NV_VEC( force ),NV_VEC( moment ) ; /************************************************************/ DEFINE_CG_MOTION(throttle,dt,vel,omega,time,dtime) { current_time = CURRENT_TIME ; vel[0] = 30; Message("time=%f omega=%f\n",current_time) ; }
======== FLUENT基础知识总结 仅仅就我接触过得谈谈对fluent的认识,并说说哪些用户适合用,哪些不适合fluent对我来说最麻烦的不在里面的设置,因为我本身解决的就是高速流动可压缩N-S方程,而且本人也是学力学的,诸如边界条件设置等概念还是非常清楚的同时我接触的流场模拟,都不会有很特别的介质,所以设置起来很简单。 对我来说,颇费周折的是gambit做图和生成网格,并不是我不会,而是gambit 对作图要求的条件很苛刻,也就是说,稍有不甚,就前功尽弃,当然对于计算流场很简单的用户,这不是问题。有时候好几天生成不了的图形,突然就搞定了,逐渐我也总结了一点经验,就是要注意一些小的拐角地方的图形,有时候做布尔运算在图形吻合的地方,容易产生一些小的面最终将导致无法在此生成网格,fluent里面的计算方法是有限体积法,而且我觉得它在计算过程中为了加快收敛速度,采取了交错网格,这样,计算精度就不会很高。同时由于非结构网格,肯定会导致计算精度的下降,所以我一贯来认为在fluent里面选取复杂的粘性模型和高精度的格式没有任何意义,除非你的网格做的非常好。 而且fluent5.5以前的版本(包括5。5),其物理模型,(比如粘性流体的几个模型)都是预先设定的,所以,对于那些做探索性或者检验新方法而进行的模拟,就不适合用。 同时gambit做网格,对于粘性流体,特别是计算湍流尺度,或者做热流计算来说其网格精度一般是不可能满足的,除非是很小的计算区域。所以,用fluent 做的比较复杂一点的流场(除了经典的几个基本流场)其计算所得热流,湍流,以及用雷诺应力模拟的粘性都不可能是准确的,这在物理上和计算方法已经给fluent判了死刑,有时候看到很多这样讨论的文章,觉得大家应该从物理和力学的本质上考虑问题。 但是,fluent往往能计算出量级差不多的结果,我曾经做了一个复杂的飞行器热流计算,高超音速流场,得到的壁面热流,居然在量级上是吻合的,但是,从计算热流需要的壁面网格精度来判断,gambit所做的网格比起壁面网格所满足的尺寸的要大了至少2个数量级,我到现在还不明白fluent是怎么搞的。 综上,我觉得,如果对付老板的一些工程项目,可以用fluent对付过去,但是如果真的做论文,或者需要发表文章,除非是做一些技术性工作,比如优化计算一般用fluent是不适合的。 我感觉fluent做力的计算是很不错的,做流场结构的计算,即使得出一些涡,也不是流场本身性质的反应,做低速流场计算,fluent的优势在于收敛速度快,但是低速流场计算,其大多数的着眼点在于对流场结构的探索,所以计算得到的
GAMBIT使用说明 GAMBIT是使用FLUENT进行计算的第一个步骤。在GAMBIT 中我们将完成对计算模型的基本定义和初始化,并输出初始化结果供FLUENT的计算需要。以下是使用GAMBIT的基本步骤。 1.1定义模型的基本几何形状 如左图所示的按钮就是用于构造模型的基本几何形状的。当按下这个按钮时,将出现 如下5个按钮,它们分别是用以定义点、线、面、体的几何形状的。 值得注意的是我们定义这些基本的几何元素的一般是依照以下的顺序: 点——线(两点确定一线)——面(3线以上确定一面)——体(3面以上确定体)对各种几何元素的操作基本方式是:首先选中所要进行的操作,再定义完成操作所要的其他元素,作后点“APPL Y”按钮完成操作。以下不一一重复。 下面我们分别介绍各个几何元素的确定方法: 1.1.1点的操作 对点的操作在按下点操作按钮后进行(其他几何元素的操作也是这样)。点有以下几种主要操作 定义点的位置按钮,按下后出现下面对话框 Coordinate Sys.:用以选择已有坐标系中进行当前操 作的坐标系 Type:可以选择3种相对坐标系为当前坐标系:笛卡 儿坐标、柱坐标、球坐标。 以下通过在Global 中直接输入点的x、y、z值定义点, 注意这里的坐标值是绝对坐标值,而Local中输入的是相 对坐标值,一般我们使用绝对坐标值。 Label:为所定义的点命名。 在完成以上定义后就可以通过进行这个点 的定义,同时屏幕左半部的绘图区中将出现被定义的点。 用关闭此对话框。 查看所有点的几何参数按钮(在以后的操作中也可以查看其他元素的几何参数) 在Vertices栏中选择被查询的点,有两种选择方式(其他几 何元素的选择与此类似): ①按住shift键的同时用鼠标左键取点
Fluent经典问题及答疑2 51 对于出口有回流的问题,在出口应该选用什么样的边界条件(压力出口边界条件、质量出口边界条件等)计算效果会更好?(#42) 52 对于不同求解器,离散格式的选择应注意哪些细节?实际计算中一阶迎风差分与二阶迎风差分有什么异同?(#69) 53 对于FLUENT的耦合解算器,对时间步进格式的主要控制是Courant数(CFL),那么Courant 数对计算结果有何影响?(#43) 54 在分离求解器中,FLUENT提供了压力速度耦和的三种方法:SIMPLE,SIMPLEC及PISO,它们的应用有什么不同?(#44) 55 对于大多数情况,在选择选择压力插值格式时,标准格式已经足够了,但是对于特定的某些模型使用其它格式有什么特别的要求? (#60) 56 计算流体力学中在设定初始条件和边界条件的时候总是要先选择一组湍流参数,并给出其初值。如何选择并给出这些初值呢?有什么经验公式或者别的好的办法吗?(#73) 57 讨论在数值模拟过程中采用四面体网格计算效果好,还是采用六面体网格更妙呢?(#70) 58 如何将自己用C语言编辑的程序导入到FLUENT中?在利用UDF编写程序时需注意哪些问题?(#157) 59 在UDF中compiled型的执行方式和interpreted型的执行方式有什么不同?(#72) 60 在用gambit的时候,导入pro/e的stp文件后,在消去最短边的时候,有些最短边不能消去,其是空间线段,用面merge的方法和连接点的方法都不行,请问该怎么消去这类短边?(#144) 61 FLUENT help和GAMBIT help能教会我们(特别是刚入门的新手)学习什么基本知识?(#126) 62 FLUENT如何做汽车外流场计算的模拟?并且怎么可以得到汽车的阻力系数和升力系数?(#170) 63 FLUENT模拟飞行器外部流场,最高MA多少时就不准确了?MA达到一定的程度做模拟需注意哪些问题?(#125) 64 在用gambit建模,保存成*.msh文件时总是出现No entity的错误:Continuum Entity fluid does not contain any valid entity and is not written! Boundary Entity wall does not contain any validentity and is not written! 不知道是什么问题?产生的原因是什么?如何解决?(#150) 65 在做燃烧模拟的时候,入口燃料温度定义为蒸发/离解开始时的温度(也就是,为离散相材料指定的蒸发温度“Vaporization Temperature”),这是指水分蒸发温度吗?一般是多少?(#196) 66 在计算煤粉燃烧时遇到这样的问题: Warning: volatile + combustible fraction for lignite is greater than 1.0shell conduction zones 如何解决? 67 FLUENT控制方程是无因次的还是有因次的?如果是无因次的,怎么无因次的? 68 做飞机设计时,经常计算一些翼型,可是经常出现计算出来的阻力是负值,出现负值究竟是什么原因,是网格的问题还是计算参数设置的问题?(#71) 69 FLUENT中的Turbulent intensify是如何定义的?该值应该是小于等于100%,可是我的计算中该值达到400%,不知为何? 70 边界条件中湍流强度怎么设置:入口边界条件中的湍流强度和出口边界条件中的回流湍流强度怎么设置?是取默认值10%吗?(#135) 71 关于Injection中的Total Flow rate:injection 选surface,此时选了好几个面(面积不一定完全相同,但颗粒的入口速度相同),那Total Flow Rate 是指几个面的总流量还是某一个面的啊?只能处理完全相同的面吗?(#160) 72 FLUENT中能不能做插值:在ansys中的模型节点坐标和FLUENT中模型的节点坐标不一致,能
Fluent必知的一些基本概念! 连续性方程不收敛是怎么回事? 在计算过程中其它指数都收敛了,就continuity不收敛是怎么回事 这和Fluent程序的求解方法SIMPLE有关。SIMPLE根据连续方程推导出压力修正方法求解压力。由于连续方程中流场耦合项被过渡简化,使得压力修正方程不能准确反映流场的变化,从而导致该方程收敛缓慢。 你可以试验SIMPLEC方法,应该会收敛快些。 湍流与黏性有什么关系? 湍流和粘性都是客观存在的流动性质。 湍流的形成需要一定的条件,粘性是一切流动都具有的。 流体流动方程本身就是具非线性的。 NS方程中的粘性项就是非线性项,当然无粘的欧拉方程也是非线性的。 粘性是分子无规则运动引起的,湍流相对于层流的特性是由涡体混掺运动引起的。 湍流粘性是基于湍流体的parcel湍流混掺是类比于层流体中的分子无规则运动,只是分子无规则运动遥远弱些吧了。不过,这只是类比于,要注意他们可是具有不同的属性。粘性是耗散的根源,实际流体总是有耗散的。 而粘性是制约湍流的。 LANDAU说,粘性的存在制约了湍流的自由度。 湍流粘性系数和层流的是不一样的,层流的粘性系数基本可认为是常数,可湍流中层流底层中粘性系数很小,远小于层流时的粘性系数;而在过渡区,与之相当,在一个数量级;在充分发展的湍流区,又远大于层流时的粘性系数.这是鮑辛内斯克1987年提出的。 1 FLUENT的初始化面板中有一项是设置从哪个地方开始计算(compute from),选择从不同的边界开始计算有很大的区别吗?该怎样根据具体问题选择从哪里计算呢?比如有两个速度入口A和B,还有压力出口等等,是选速度入口还是压力出口?如果选速度入口,有两个,该选哪个呀?有没有什么原则标准之类的东西? 一般是选取ALL ZONE,即所有区域的平均处理,通常也可选择有代表性的进口(如多个进口时)进行初始化。对于一般流动问题,初始值的设定并不重要,因为计算容易收敛。但当几何条件复杂,而且流动速度高变化快(如音速流动),初始条件要仔细选择。如果不收敛,还应试验不同的初始条件,甚至逐次改变边界条件最后达到所要求的条件。 2 要判断自己模拟的结果是否是正确的,似乎解的收敛性要比那些初始条件和边界条件更重要,可以这样理解吗?也就是说,对于一个具体的问题,初始条件和边界条件的设定并不是唯一的,为了使解收敛,需要不断调整初始条件和边界条件直到解收敛为止,是吗?如果解收敛了,是不是就可以基本确定模拟的结果是正确的呢? 对于一个具体的问题,边界条件的设定当然是唯一的,只不过初始化时可以选择不同的初始条件(指定常流),为了使解的收敛比较好,我一般是逐渐的调节边界条件到额定值("额定值"是指你题目中要求的入口或出口条件,例如计算一个管内流动,要求入口压力和温度为10MPa和3000K,那么我开始叠代时选择入口压力和温度为1MPa和500K(假设,这看你自己问题了),等流场计算的初具规模、收敛的较好了,再逐渐调高压力和温度,经过好几次调节后最终到达额定值10MPa和3000K,这样比一开始就设为10MPa和3000K收敛的要好些)这样每次叠代可以比较容易收敛,每次调节后不用再初始化即自动调用上次的解为这次的初始解,然后继续叠代。即使解收敛了,这并
1 对于刚接触到FLUENT新手来说,面对铺天盖地的学习资料和令人难读的FLUENT help,如何学习才能在最短的时间内入门并掌握基本学习方法呢? 学习任何一个软件,对于每一个人来说,都存在入门的时期。认真勤学是必须的,什么是最好的学习方法,我也不能妄加定论,在此,我愿意将我三年前入门FLUENT心得介绍一下,希望能给学习FLUENT的新手一点帮助。 由于当时我需要学习FLUENT来做毕业设计,老师给了我一本书,韩占忠的《FLUENT流体工程仿真计算实例与应用》,当然,学这本书之前必须要有两个条件,第一,具有流体力学的基础,第二,有FLUENT 安装软件可以应用。然后就照着书上二维的计算例子,一个例子,一个步骤地去学习,然后学习三维,再针对具体你所遇到的项目进行针对性的计算。不能急于求成,从前处理器GAMBIT,到通过FLUENT进行仿真,再到后处理,如TECPLOT,进行循序渐进的学习,坚持,效果是非常显著的。如果身边有懂得FLUENT 的老师,那么遇到问题向老师请教是最有效的方法,碰到不懂的问题也可以上网或者查找相关书籍来得到答案。另外我还有本《计算流体动力学分析》王福军的,两者结合起来学习效果更好。 2 CFD计算中涉及到的流体及流动的基本概念和术语:理想流体和粘性流体;牛顿流体和非牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。 https://www.doczj.com/doc/0b17144157.html,/dvbbs/viewFile.asp?BoardID=61&ID=1411 A.理想流体(Ideal Fluid)和粘性流体(Viscous Fluid): 流体在静止时虽不能承受切应力,但在运动时,对相邻的两层流体间的相对运动,即相对滑动速度却是有抵抗的,这种抵抗力称为粘性应力。流体所具备的这种抵抗两层流体相对滑动速度,或普遍说来抵抗变形的性质称为粘性。粘性的大小依赖于流体的性质,并显著地随温度变化。实验表明,粘性应力的大小与粘性及相对速度成正比。当流体的粘性较小(实际上最重要的流体如空气、水等的粘性都是很小的),运动的相对速度也不大时,所产生的粘性应力比起其他类型的力如惯性力可忽略不计。此时我们可以近似地把流体看成无粘性的,这样的流体称为理想流体。十分明显,理想流体对于切向变形没有任何抗拒能力。这样对于粘性而言,我们可以将流体分为理想流体和粘性流体两大类。应该强调指出,真正的理想流体在客观实际中是不存在的,它只是实际流体在某些条件下的一种近似模型。 B.牛顿流体(Newtonian Fluid)和非牛顿流体(non-Newtonian Fluid): 日常生活和工程实践中最常遇到的流体其切应力与剪切变形速率符合下式的线性关系,称为牛顿流体。而切应力与变形速率不成线性关系者称为非牛顿流体。图2-1(a)中绘出了切应力与变形速率的关系曲线。其中符合上式的线性关系者为牛顿流体。其他为非牛顿流体,非牛顿流体中又因其切应力与变形速率关系特点分为膨胀性流体(Dilalant),拟塑性流体(Pseudoplastic),具有屈服应力的理想宾厄流体(Ideal Bingham Fluid)和塑性流体(Plastic Fluid)等。通常油脂、油漆、牛奶、牙膏、血液、泥浆等均为非牛顿流体。非牛顿流体的研究在化纤、塑料、石油、化工、食品及很多轻工业中有着广泛的应用。图2-1(b)还显示出对于有些非牛顿流体,其粘滞特性具有时间效应,即剪切应力不仅与变形速率有关而且与作用时间有关。当变形速率保持常量,切应力随时间增大,这种非牛顿流体称为震凝性流体(Rheopectic Fluid)。当变形速率保持常量而切应力随时间减小的非牛顿流体则称为触变性流体(Thixotropic Fluid)。 C.可压缩流体(Compressible Fluid)和不可压缩流体(Incompressible Fluid):
Fluent经典问题及答疑 1 对于刚接触到FLUENT新手来说,面对铺天盖地的学习资料和令人难读的FLUENT help,如何学习才能在最短的时间内入门并掌握基本学习方法呢?(#61) 2 CFD计算中涉及到的流体及流动的基本概念和术语:理想流体和粘性流体;牛顿流体和非牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。(13楼) 3 在数值模拟过程中,离散化的目的是什么?如何对计算区域进行离散化?离散化时通常使用哪些网格?如何对控制方程进行离散?离散化常用的方法有哪些?它们有什么不同?(#80) 4 常见离散格式的性能的对比(稳定性、精度和经济性)(#62) 5 在利用有限体积法建立离散方程时,必须遵守哪几个基本原则?(#81) 6 流场数值计算的目的是什么?主要方法有哪些?其基本思路是什么?各自的适用范围是什么?(#130) 7 可压缩流动和不可压缩流动,在数值解法上各有何特点?为何不可压缩流动在求解时反而比可压缩流动有更多的困难?(#55) 8 什么叫边界条件?有何物理意义?它与初始条件有什么关系?(#56) 9 在一个物理问题的多个边界上,如何协调各边界上的不同边界条件?在边界条件的组合问题上,有什么原则? 10 在数值计算中,偏微分方程的双曲型方程、椭圆型方程、抛物型方程有什么区别?(#143) 11 在网格生成技术中,什么叫贴体坐标系?什么叫网格独立解?(#35) 12 在GAMBIT的foreground和background中,真实体和虚实体、实操作和虚操作四个之间是什么关系? 13 在GAMBIT中显示的“check”主要通过哪几种来判断其网格的质量?及其在做网格时大致注意到哪些细节?(#38) 14 画网格时,网格类型和网格方法如何配合使用?各种方法有什么样的应用范围及做网格时需注意的问题?(#169) 15 对于自己的模型,大多数人有这样的想法:我的模型如何来画网格?用什么样的方法最简单?这样做网格到底对不对?(#154) 16 在两个面的交界线上如果出现网格间距不同的情况时,即两块网格不连续时,怎么样克服这种情况呢?(#40) 17 依据实体在GAMBIT建模之前简化时,必须遵循哪几个原则?(#170) 18 在设置GAMBIT边界层类型时需要注意的几个问题:a、没有定义的边界线如何处理?b、计算域内的内部边界如何处理(2D)?(#128) 19 为何在划分网格后,还要指定边界类型和区域类型?常用的边界类型和区域类型有哪些?(#127) 20 何为流体区域(fluid zone)和固体区域(solid zone)?为什么要使用区域的概念?FLUENT 是怎样使用区域的?(#41) 21 如何监视FLUENT的计算结果?如何判断计算是否收敛?在FLUENT中收敛准则是如何定义的?分析计算收敛性的各控制参数,并说明如何选择和设置这些参数?解决不收敛问题通常的几个解决方法是什么?(9楼) 22 什么叫松弛因子?松弛因子对计算结果有什么样的影响?它对计算的收敛情况又有什么样的影响?(7楼) 23 在FLUENT运行过程中,经常会出现“turbulence viscous rate”超过了极限值,此时如何解决?而这里的极限值指的是什么值?修正后它对计算结果有何影响?(#28)
G. Falkovich, Fluid Mechanics: A Short Course for Physicists L.D. Landau and E.M. Lifshitz, “Fluid Mechanics” - a classic G.K. Batchelor, “An Introduction to Fluid Dynamics” - complements Landau G.B. Whitman; “Linear and Nonlinear Waves” - yet another great one J. Lighthill; “Waves in Fluids” - excellent and accessible U. Frisch; “Turbulence-The Legacy of A.N. Kolmogorov” – classic book on urbulence ala’ K41 A. Townsend; “The Structure of Turbulent Shear Flow” –classic book on urbulence in real systems 上面诸位推荐流体力学教材若干,我另外推荐一本可能更侧重计算流体力学(CFD)的书:Computational Methods for Fluid Dynamics 2002 Joel Henry Ferziger, Milovan Peri? 这本书不算太旧,作者是斯坦福计算流体力学专业的教授,公认的计算流体力学方面的专家,springer出品,质量应该不会太差。 推荐几本我自己学的书吧。我个人非常反感将流体力学讲成数学课的做法。 基础书: 1.Frank White, Fluid Mechanics 2.J.D. Anderson, Computational Fluid Dynamics 3.吴子牛,空气动力学 4.朱克勤,许春晓,粘性流体力学 进阶书: 1.Toro, Riemann Solvers and Numerical Methods for Fluid Dynamics 2.D.C. Wilcox, Turbulence Modelling for CFD 3.Pope, Turbulent Flows 我来说一下,也是一个参考,也希望大家尽快上手,免得走弯路。 当初我在学习的时候(现在我依然在学习),看过很多计算流体力学和流体力学的书,当初我还分不清什么是计算流体力学和流体力学,有限体积有限差分,于是我把有关流体力学和计算流体力学的书都买了(下载)。 但我做的是计算流体力学——有限体积法的相关基础内容。如果你和我做的一样的内容: 1. 计算流体力学而非流体力学; 2. 有限体积法而非有限差分; 3. 需要获取普适性理论而非湍流、燃烧等; 推荐以下: 初级:《数值传热学》,中文。 初级:An Introduction to Computational Fluid Dynamics The Finite Volume Method 2nd Edition 中级:Computational Methods for Fluid Dynamics 这三本书已经没有必要评论。真正看过的都懂得。红色那本书我购入4本原版,赠送给我工作室的相关人员(好吧作为发起者目前没有经营收入,只能以书籍表示大家的支持)
2004-06 FLUENT流体工程仿真计算实例与应用韩占忠王敬兰小平北京理工大学出版社 第一章流体力学基础与fluent简介 第二章二维流动与传热的数值计算 第一节冷、热水混合器内部二维流动 第二节喷管内二维非定常流动 第三节三角翼的可压缩外部绕流 第四节三角翼不可压缩的外部绕流(空化模型应用) 第五节vof模型的应用 第六节组分传输与气体燃烧 第三章三维流动与传热的数值计算 第一节冷、热水混合器内的三维流动与换热 第二节粘性流体通过圆管弯头段的三维流动 第三节三维稳态热传导问题 第四节动网格问题 第五节叶轮机械的mixing plane模型 2004-09 计算流体动力学分析CFD软件原理与应用王福军清华大学出版社(偏重理论)
第1章计算流动力学基础知识 第2章基于有限体积法的控制方程离散 第3章基于SIMPLE算法的流场数值计算 第4章三维流模型及其在CFD中的应用 第5章边界条件的应用 第6章网格的生成 第7章FLUENT软件的基本用法 第8章CFD综合应用实例 2007-02 FLUENT技术基础与应用实例王瑞金张凯王刚清华大学出版社 第1章Fluent概述 第2章流体力学基础知识 第3章流体力学数值模拟基础 第4章Fluent软件介绍 第5章速度场的计算 第6章温度场的计算 第7章多相流模型 第8章凝固和融化模型 第9章可动区域中流动问题的模拟 第10章动网格模型 第11章UDF和UDS 第12章Fluent并行计算 第13章Tecplot软件
2008-07 Fluent高级应用与实例分析江帆,黄鹏清华大学出版社 第1章 CFD基础 第2章Fluent基本介绍 第3章Gambit的使用 3.3建模及网格划分实例 3.3.1 二维轴对称维多辛斯基曲线喷嘴 3.3.2三维贯通管 第4章通用后处理Tecplot使用入门 4.5.6绘制三维流场图 第5章多相流基本模型 5.4气穴影响 5.5选择通用多相流模型 5.6设置一般的多相流问题 5.6.10包含体积力 5.6.15可压缩VOF和混合模型计算的输入 5.6.16凝固/熔解VOF计算的输入 第6章多相流计算实例 6.1沉淀池活性污泥沉降的计算 6.2泄洪坝气固液三相流的计算 第7章动网格计算方法概述 第8章UDF使用指南 8.3.2查询多相组分的宏 8.5.3 UDF的VC++编译 8.5.4编译相关问题 第9章动网格计算实例 9.1悬浮生物载体在移动床运动的模拟 9.2齿轮泵的动态模拟 第10章滑移网格基础 第11章滑移网格的计算实例 11.1 转笼生物反应器的内部流场计算 11.2车辆交会的动态模拟 11.3滑移网格模型和动网格模型计算比较 11.3.4转笼生物反应器计算结果上的区别 第12章UDF的高级用法
Fluent必知的一些基本概念! 1、连续性方程不收敛是怎么回事?在计算过程中其它指数都收敛了,就continuity不收敛是怎么回事? 答:这和Fluent程序的求解方法SIMPLE有关。SIMPLE根据连续方程推导出压力修正方法求解压力。由于连续方程中流场耦合项被过渡简化,使得压力修正方程不能准确反映流场的变化,从而导致该方程收敛缓慢。你可以试验SIMPLEC方法,应该会收敛快些。 2、湍流与黏性有什么关系? 答:湍流和粘性都是客观存在的流动性质。湍流的形成需要一定的条件,粘性是一切流动都具有的。流体流动方程本身就是具非线性的。NS方程中的粘性项就是非线性项,当然无粘的欧拉方程也是非线性的。 粘性是分子无规则运动引起的,湍流相对于层流的特性是由涡体混掺运动引起的。粘性是耗散的根源,实际流体总是有耗散的。而粘性是制约湍流的。 湍流粘性系数和层流的是不一样的,层流的粘性系数基本可认为是常数,可湍流中层流底层中粘性系数很小,远小于层流时的粘性系数;而在过渡区,与之相当,在一个数量级;在充分发展的湍流区,又远大于层流时的粘性系数.这是鲍辛内斯克1987年提出的。3、FLUENT的初始化面板中有一项是设置从哪个地方开始计算(compute from),选择从不同的边界开始计算有很大的区别吗?该怎样根据具体问题选择从哪里计算呢?比如有两个速度入口A 和B,还有压力出口等等,是选速度入口还是压力出口?如果选速度入口,有两个,该选哪个呀?有没有什么原则标准之类的东西?答:一般是选取ALL ZONE,即所有区域的平均处理,通常也可选择有代表性的进口(如多个进口时)进行初始化。对于一般流动问题,初始值的设定并不重要,因为计算容易收敛。但当几何条件复杂,而且流动速度高变化快(如音速流动),初始条件要仔细选择。如果不收敛,还应试验不同的初始条件,甚至逐次改变边界条件最后达到所要求的条件。 4、要判断自己模拟的结果是否是正确的,似乎解的收敛性要比那些初始条件和边界条件更重要,可以这样理解吗?也就是说,对
第10章应用举例 本章包含了FLUENT中UDFs的应用例子。 10.1 边界条件 10.2源项 10.3物理属性 10.4反应速率(Reacting Rates) 10.5 用户定义标量(User_Defined Scalars) 10.1边界条件 这部分包含了边界条件UDFs的两个应用。两个在FLUENT中都是作为解释式UDFs被执行的。 10.1.1涡轮叶片的抛物线速度入口分布 要考虑的涡轮叶片显示在Figure 10.1.1中。非结构化网格用于模拟叶片周围的流 场。区域从底部周期性边界延伸到顶部周期性边界,左边是速度入口,右边是压 力出口。 Figure 10.1.1: The Grid for the Turbine Vane Example 常数x速度应用于入口的流场与抛物线x速度应用于入口的流场作了比较。当采用分段线性分布的型线的应用是有效的对边界型线选择,多项式的详细说明只能通过用户定义函数来完成。 常数速度应用于流场入口的结果显示在Figure 10.1.2和Figure 10.1.3中。当流动移动到涡轮叶片周围时初始常速度场被扭曲。 Figure 10.1.2: Velocity Magnitude Contours for a Constant Inlet x Velocity
Figure 10.1.3: Velocity Vectors for a Constant Inlet x Velocity 现在入口x速度将用以下型线描述: 这里变量y在人口中心是0.0,在顶部和底部其值分别延伸到0745 。这样x速度在 .0 入口中心为20m/sec,在边缘为0。 UDF用于传入入口上的这个抛物线分布。C源代码(vprofile.c)显示如下。函数使用了Section 5.3中描述的Fluent提供的求解器函数。/***********************************************************************/
FLUENT经典问题 FLUENT经典问题 1 对于刚接触到FLUENT新手来说,面对铺天盖地的学习资料和令人难读的FLUENT help, 如何学习才能在最短的时间内入门并掌握基本学习方法呢? 学习任何一个软件,对于每一个人来说,都存在入门的时期。认真勤学是必须的,什么是最好的学习方法,我也不能妄加定论,在此,我愿意将我三年前入门FLUENT心得介绍一下,希望能给学习FLUENT的新手一点帮助。 由于当时我需要学习FLUENT来做毕业设计,老师给了我一本书,韩占忠的《FLUENT流体工程仿真计算实例与应用》,当然,学这本书之前必须要有两个条件,第一,具有流体力学的基础,第二,有FLUENT安装软件可以应用。然后就照着书上二维的计算例子,一个例子,一个步骤地去学习,然后学习三维,再针对具体你所遇到的项目进行针对性的计算。 不能急于求成,从前处理器GAMBIT,到通过FLUENT进行仿真,再到后处理,如TECPLO T,进行循序渐进的学习,坚持,效果是非常显著的。如果身边有懂得FLUENT的老师,那么遇到问题向老师请教是最有效的方法,碰到不懂的问题也可以上网或者查找相关书籍来得到答案。另外我还有本《计算流体动力学分析》王福军的,两者结合起来学习效果更好。 2 CFD计算中涉及到的流体及流动的基本概念和术语:理想流体和粘性流体;牛顿流体和非 牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。 A.理想流体(Ideal Fluid)和粘性流体(Viscous Fluid): 流体在静止时虽不能承受切应力,但在运动时,对相邻的两层流体间的相对运动,即相对滑动速度却是有抵抗的,这种抵抗力称为粘性应力。流体所具备的这种抵抗两层流体相对滑动速度,或普遍说来抵抗变形的性质称为粘性。粘性的大小依赖于流体的性质,并显著地随温度变化。实验表明,粘性应力的大小与粘性及相对速度成正比。当流体的粘性较小(实际上最重要的流体如空气、水等的粘性都是很小的),运动的相对速度也不大时,所产生的粘性应力比起其他类型的力如惯性力可忽略不计。此时我们可以近似地把流体看成无粘性的,这样的流体称为理想流体。十分明显,理想流体对于切向变形没有任何抗拒能力。这样对于粘性而言,我们可以将流体分为理想流体和粘性流体两大类。应该强调指出,真正的理想流体在客观实际中是不存在的,它只是实际流体在某些条件下的一种近似模型。 B.牛顿流体(Newtonian Fluid)和非牛顿流体(non-Newtonian Fluid): 日常生活和工程实践中最常遇到的流体其切应力与剪切变形速率符合下式的线性关系,称为牛顿流体。而切应力与变形速率不成线性关系者称为非牛顿流体。图2-1(a)中绘出了切应力与变形速率的关系曲线。其中符合上式的线性关系者为牛顿流体。其他为非牛顿流体,非牛顿流体中又因其切应力与变形速率关系特点分为膨胀性流体(Dilalant),拟塑性流体(Pseudoplastic),具有屈服应力的理想宾厄流体(Ideal Bingham Fluid)和塑性流体(Pl astic Fluid)等。通常油脂、油漆、牛奶、牙膏、血液、泥浆等均为非牛顿流体。非牛顿流体的研究在化纤、塑料、石油、化工、食品及很多轻工业中有着广泛的应用。图2-1(b)
KINHIE Fluent菜鸟指南 Fluent 160问 Eric 2009-12-8
如何入门 学习任何一个软件,对于每一个人来说,都存在入门的时期。认真勤学是必须的,什么是最好的学习方法,我也不能妄加定论,在此,我愿意将我三年前入门FLUENT心得介绍一下,希望能给学习FLUENT的新手一点帮助。 由于当时我需要学习FLUENT来做毕业设计,老师给了我一本书,韩占忠的《FLUENT流体工程仿真计算实例与应用》,当然,学这本书之前必须要有两个条件: 第一,具有流体力学的基础,第二,有FLUENT安装软件可以应用。然后就照着书上二维的计算例子,一个例子,一个步骤地去学习,然后学习三维,再针对具体你所遇到的项目进行针对性的计算。不能急于求成,从前处理器GAMBIT,到通过FLUENT进行仿真,再到后处理,如TECPLOT,进行循序渐进的学习,坚持,效果是非常显著的。如果身边有懂得FLUENT的老师,那么遇到问题向老师请教是最有效的方法,碰到不懂的问题也可以上网或者查找相关书籍来得到答案。另外我还有本《计算流体动力学分析》王福军的,两者结合起来学习效果更好。 CFD计算中涉及到的流体及流动的基本概念和术语 理想流体和粘性流体;牛顿流体和非牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。 理想流体(Ideal Fluid)和粘性流体(Viscous Fluid) 流体在静止时虽不能承受切应力,但在运动时,对相邻的两层流体间的相对运动,即相对滑动速度却是有抵抗的,这种抵抗力称为粘性应力。流体所具备的这种抵抗两层流体相对滑动速度,或普遍说来抵抗变形的性质称为粘性。粘性的大小依赖于流体的性质,并显著地随温度变化。实验表明,粘性应力的大小与粘性及相对速度成正比。当流体的粘性较小(实际上最重要的流体如空气、水等的粘性都是很小的),运动的相对速度也不大时,所产生的粘性应力比起其他类型的力如惯性力可忽略不计。此时我们可以近似地把流体看成无粘性的,这样的流体称为理想流体。十分明显,理想流体对于切向变形没有任何抗拒能力。这样对于粘性而言,我们可以将流体分为理想流体和粘性流体两大类。应该强调指出,
FLUENT经典问题作者:傅洁 1 对于刚接触到FLUENT新手来说,面对铺天盖地的学习资料和令人难读的FLU ENT help,如何学习才能在最短的时间内入门并掌握基本学习方法呢? 学习任何一个软件,对于每一个人来说,都存在入门的时期。认真勤学是必须的,什么是最好的学习方法,我也不能妄加定论,在此,我愿意将我三年前入门FLUENT心得介绍一下,希望能给学习FLUENT的新手一点帮助。 由于当时我需要学习FLUENT来做毕业设计,老师给了我一本书,韩占忠的《FLUENT流体工程仿真计算实例与应用》,当然,学这本书之前必须要有两个条件,第一,具有流体力学的基础,第二,有FLUENT安装软件可以应用。然后就照着书上二维的计算例子,一个例子,一个步骤地去学习,然后学习三维,再针对具体你所遇到的项目进行针对性的计算。不能急于求成,从前处理器GAMBIT,到通过FLUENT进行仿真,再到后处理,如TECPLOT,进 行循序渐进的学习,坚持,效果是非常显著的。如果身边有懂得FLUENT的老师,那么遇到问题向老师请教是最有效的方法,碰到不懂的问题也可以上网或者查找相关书籍来得到答案。另外我还有本《计算流体动力学分析》王福军的,两者结合起来学习效果更好。 2 CFD计算中涉及到的流体及流动的基本概念和术语:理想流体和粘性流体;牛顿流体和非牛顿流体;可压缩流体和不可压缩流体;层流和湍流;定常流动和非定常流动;亚音速与超音速流动;热传导和扩散等。 https://www.doczj.com/doc/0b17144157.html,/dvbbs/viewFile.asp?BoardID=61&ID=1 411 A.理想流体(Ideal Fluid)和粘性流体(Viscous Fluid): 流体在静止时虽不能承受切应力,但在运动时,对相邻的两层流体间的相对运动,即相对滑动速度却是有抵抗的,这种抵抗力称为粘性应力。流体所具备的这种抵抗两层流体相对滑动速度,或普遍说来抵抗变形的性质称为粘性。粘性的大小依赖于流体的性质,并显著地随温度变化。实验表明,粘性应力的大小与粘性及相对速度成正比。当流体的粘性较小(实际上最重要的流体如空气、水等的粘性都是很小的),运动的相对速度也不大时,所产生的粘性应力比起其他类型的力如惯性力可忽略不计。此时我们可以近似地把流体看成无粘性的,这样的流体称为理想流体。十分明显,理想流体对于切向变形没有任何抗拒能力。这样对于粘性而言,我们可以将流体分为理想流体和粘性流体两大类。应该强调指出,真正的理想流体在客观实际中是不存在的,它只是实际流体在某些条件下的一种近似模型。 B.牛顿流体(Newtonian Fluid)和非牛顿流体(non-Newtonian Fluid): 日常生活和工程实践中最常遇到的流体其切应力与剪切变形速率符合下式的线性关系,称为牛顿流体。而切应力与变形速率不成线性关系者称为非牛顿流体。图2-1(a)中绘出了切 应力与变形速率的关系曲线。其中符合上式的线性关系者为牛顿流体。其他为非牛顿流体,非牛顿流体中又因其切应力与变形速率关系特点分为膨胀性流体(Dilalant),拟塑性流体(Pseudoplastic),具有屈服应力的理想宾厄流体(Ideal Bingham Fluid)和塑性流体(P lastic Fluid)等。通常油脂、油漆、牛奶、牙膏、血液、泥浆等均为非牛顿流体。非牛顿流体的研究在化纤、塑料、石油、化工、食品及很多轻工业中有着广泛的应用。图2-1(b) 还显示出对于有些非牛顿流体,其粘滞特性具有时间效应,即剪切应力不仅与变形速率有关而且与作用时间有关。当变形速率保持常量,切应力随时间增大,这种非牛顿流体称为震凝