动网格流沙版完美整理.docx
《动网格流沙版完美整理.docx》由会员分享,可在线阅读,更多相关《动网格流沙版完美整理.docx(34页珍藏版)》请在冰豆网上搜索。
动网格流沙版完美整理
动网格
让网格动起来
(1)—闲谈动网格
在固体有限元计算中,网格运动实非什么稀奇事儿。
而且在绝多数固体计算的基本物理量是网格的节点位移,所以,固体计算中,网格节点运动是对的,没有运动反而不正常了。
也可以这么说:
正因为计算域内部节点间的相对运动,才导致了内应力的产生。
流体计算与固体完全不同。
其根源在于它们使用的网格类型不同。
当前固体有限元计算采用的是拉格朗日网格,而流体计算则大多数采用的欧拉网格。
如果说把拉格朗日网格中的节点点看作是真实世界的物质原子的话,那么欧拉网格的节点则好比是真实世界中的一个个传感器,它们总是呆在相同的位置,真实的记录着各自位置上的物理量。
正常情况下,欧拉网格系统是这样的:
计算域和节点保持位置不变,发生变化的是物理量,网格节点就像一个个布置在计算域中的传感器,记录该位置上的物理量。
这其实是由流体力学研究方法所决定的。
宏观与微观的差异决定了固体力学计算采用拉格朗日网格,流体计算采用欧拉网格。
关于这部分的详细解说,可以参阅任何一本计算流体动力学书籍。
世界是公平的。
有利必有弊。
朗格朗日网格适合计算节点位移,然而对于过大的网格变形却难以处理。
欧拉网格生来可以处理大变形(因为节点不动),然而对于对于节点运动的处理,则是其直接软肋。
然而很不幸的是,现实生活中有太多网格边界运动的实例。
如汽车发动机中的气缸运动、阀门开启与关闭、机翼的运动、飞机投弹等等等等举不胜举。
计算流体动力学计算的基本物理量通常为:
速度、温度、压力、组分。
并不计算网格节点位移。
因此要让网格产生运动,通常给节点施加的物理约束是速度。
CFD中的动网格大体分为两类:
(1)显式规定的网格节点速度。
配合瞬态时间,即可很方便的得出位移。
当然一些求解器(如FLUENT)也支持稳态动网格,这时候可以直接指定节点位移。
(2)网格节点速度是通过求解得到的。
如6DOF模型基本上都属于此类。
用户将力换算成加速度,然后将其积分成速度。
对于第一类动网格问题,在fluent中通常可以使用profile与UDF进行网格设置,通过规定节点或区域的速度、角速度或位移等方式来显式确定网格的运动,通常大部分的动网格问题都归于此类。
而对于第二类问题,通常涉及到力的计算,力在流体中通常是对压力进行积分而来。
将力转换为速度或位移,一般涉及到加速度、转动惯量等物理量的计算。
在fluent中,可以使用6DOF模型进行处理,在CFX中,可以使用刚体模型(13.0以上版本才有)。
在FLUENT中,动网格涉及的内容包括:
(1)运动的定义。
主要是PROFILE文件与UDF中的动网格宏。
(2)网格更新。
FLUENT中关于网格更新方法有三种:
网格光顺、动态层、网格重构。
需要详细了解这些网格更新方法的运作机理,每个参数所代表的具体含义及设置方法,每种方法的适用范围。
动网格的最在挑战来自于网格更新后的质量,避免负体积是动网格调试的主要目标。
在避免负网格的同时,努力提高运动更新后的网格质量。
让网格动起来
(2)—PROFILE文件
这里要说的PROFILE文件,只针对利用于网格运动定义之用的瞬态profile文件。
其它类型的profile文件,可参阅FLUENT用户文档,里头有详细的描述。
在ANSYSFLUENT中,有两种方式用于指定瞬态网格区域及边界条件:
(1)与标准profile格式相同的瞬态profile文件
(2)表格格式的瞬态profile文件。
对于这两种方式,网格域及边界条件的变化均只与时间有关。
然而如果使用了in-cylinder模型,则用户可以使用crank角代替时间变量。
1、标准瞬态profile文件
一个标准瞬态profile文件格式如下:
((profile-nametransientnperiodic?
)
(field_name_1a1a2a3…an)
(field_name_2b1b2b3…bn)
.
.
.
(field_name_rr1r2r3…rn)
)
注意:
(1)profile-name:
profile名,必须全部为小写字母,少于64个字符。
(2)transient为保留关键字,不可随便更改。
(3)n表示每一个场变量所包含的变量个数。
(4)periodic?
用于标识是否使用周期,1为使用时间周期,0表示不使用时间周期。
(5)通常field_name_1为time,后面的变量值为升序排列。
(6)所有的值,包括坐标值,都必须使用SI单位制。
fluent读入profile文件时不进行单位转换。
一个实际的例子:
((sampleprofiletransient30)
(time123)
(u102030)
)
解读:
(1)profile名为sampleprofile,读入该profile文件后,合适的地方出现的变量名为sampleprofile。
(2)在3个时间点上定义了值,分别为1s,2s,3s。
其中1s时的x方向速度值为10m/s,2s时刻对应的速度值为20m/s,3s时刻对应的速度值为30m/s。
u,v,w是表示x,y,z三方向的速度,也可以使用v_x,v_y与v_z,旋转速度使用omega_x,omega_y,omega_z变量名。
一个使用crankangle替代time的例子:
((exampletransient31)
(angle0180360)
(temperature300500300)
)
2、表格瞬态profile文件
表格格式与标准格式有很大的差异。
表格格式如下:
profile_namen_fieldn_dataperidoic?
field_1field_2field_3…field_4
v-1-1v-2-1………v-n_field_1
v-1-2v-2-2………v-n_field-2
.
.
.
v-1-n_datav-2-n_data………v-n_field-n_data
说明:
与标准格式类似,profile_name为profile名,体现在fluent中为运动变量名。
格式要求与标准格式一致:
小写,少于64个字符。
field_1通常为time,表示时间。
后方接着的是各个变量名。
v-1-1表示field_1的第一个值,依此类推,v-1-2表示第二个值。
按升序排列。
peridoic?
表示是否采用时间周期,1表示采用,0表示不采用。
一个例子:
sampleprofile230
timeu
110
220
330
解读:
第一行:
sampleprofile表示profile名,fluent读入此profile后,将会在使用profile的地方显示该profile名。
2表示两个场变量(time与u)或者说是表的列数,3表示一共有3个数据点或者说表有三行。
0表示不使用周期。
第二行:
定义场变量。
一共是两个场变量:
time与u,通常time放在第一个。
第三行到最后一行:
第一个值表示时间值,第二个值表示u的值。
定义了1s时的x方向速度值为10m/s,2s时刻对应的速度值为20m/s,3s时刻对应的速度值为30m/s。
若使用周期,则必须定义一个周期内的时间物理量的变化。
简单来说,就是最后一行的物理量的值与第一行物理量的值相同。
如下一个例子:
periodprofile241
timeu
010
120
230
310
也可以使用crankangle代替时间进行变量定义:
exaple231
angletemperature
0300
180500
360300
请注意:
使用列表形式的profile,只能使用TUI命令读入到fluent中:
file>read-transient-table
让网格动起来(3)—实例1:
Profile定义运动
本次实例采用的场景来自于流体中高速飞行的物体。
如子弹、火箭、导弹等。
这里只是为了说明profile在动网格运动定义中的应用,因此为了计算方便不考虑高速问题。
问题描述如下图所示:
如图所示,1为运动刚体,2为计算域。
由于不考虑也没办法考虑刚体的变形,因此在构建面域的时候,将1中的部分通过布尔运算去除。
计算域总长度为300mm,其中固体运动最大位移为300-40-30-6mm=224mm。
为了防止固体边界与计算域边界发生重叠,我们使运动最大距离为200mm。
运动速度v=0.4t,这样可能计算运动完200mm需要的时间为1s。
采取5个时间数据点分别为:
0,0.25,0.5,0.75,1s,相对应的速度为:
0,0.1,0.2,0.3,0.4m/s。
profile文件如下:
((moveVelocitytransient50)
(time00.250.50.751)
(v_x00.10.20.30.4)
)
(1)将计算域离散为网格。
由于三角形网格非常适合于2D动网格,因此本例使用三角形网格。
若要使用四边形网格,则需要进行滑移面处理。
详细的说明将留待以后网格更新的时候进行。
同样的,也不进行边界层处理。
简化问题描述,设定四周为wall壁面,中间区域为rigidwall,在动网格中进行设定。
全局网格尺寸为2mm,运动边界网格尺寸1mm,网格单元总数19671,节点总数9832。
(2)启动fluent,读入msh文件
选择2D求解器,勾选双精度选项。
检查单位,确保使用的单位为mm。
选用瞬态求解器。
general中的其它选项采取默认。
如下图所示。
(3)选用标准k-e湍流模型,材料使用水。
设定cellzonecondition将默认域介质设定为water。
由于本例使用全封闭计算域,所有边界类型为wall,所以boundarycondition采用默认设置。
(4)读入profile文件
利用file>profile…菜单读入已准备好的profile文件。
(5)激活动网格选项
如下图所示。
勾选smoothing、layering、remeshing选项。
各选项的参数设置分别如下图所示。
(6)定义运动区域
定义中间刚体壁面为rigidbody,选择运动profile为读入的profile文件movevelocity,设置meshingoptions中的cellheight为1mm。
该参数用于网格的分裂与合并。
当网格高度大于1.4时进行分裂,小于0.2时合并。
预览zone的运动与网格运动。
注意在预览网格运动之前保存case文件。
(7)定义其它选项
如动画、节点物理量监测等。
(8)总结
对于类似本例的纯外流场问题,通过都不利用动网格进行计算。
主要原因在于:
(1)网格发生运动后的质量不好,通常都会低于原始网格质量。
(2)动网格计算开销比较大。
因为每次网格运动时要计算网格节点的位置。
要例所示的问题,一般使用相对运动的原理:
刚体不动,运动的是流动介质。
然而在一些特殊的场合(比如火箭发射后的整流罩分离等)则必须使用到动网格。
让网格动起来(4)—动网格UDF宏
虽然瞬态PROFILE文件可以在一定程度上定义网格运动,然而其存在着一些缺陷。
最主要的一些缺陷存在于以下一些方面:
(1)PROFILE无法精确的定义连续的运动。
其使用离散的点值进行插值。
如果想获得较为精确的运动定义,势必要定义很多点。
(2)一些情况下无法使用profile。
比如稳态动网格。
在FLUENT中定义网格运动,更多的是采用UDF宏。
fluent中与动网格有关的UDF宏一共有5个,其中四个用于常规的网格运动定义,一个用于6DOF模型。
这些宏分别为:
DEFINE_CG_MOTION、DEFINE_DYNAMIC_ZONE_PROPERTY、DEFINE_GEOM、DEFINE_GRID_MOTION、DEFINE_SDOF_PROPERTIES
注意:
动网格宏只能为编译型UDF。
1、DEFINE_CG_MOTION
最常用的运动网格宏。
用户可以使用该宏定义每一时间步上的线速度或角速度来指定fluent中某一特定区域的运动。
DEFINE_CG_MOTION(name,de,vel,omega,time,dtime)
参数说明:
name:
UDF的名字。
体现在fluent中表现为可选择的函数列表。
Dynamic_Thread*dt:
存储了用户所指定的动网格属性和结构指针。
realvel[]:
线速度。
vel[0]为x方向速度,vel[1]为y方向速度,vel[2]为z方向速度
realomega[]:
角速度。
与线速度定义相同。
realtime:
当前时间。
realdtime:
时间步长。
函数返回值为:
void
从函数的参数类型,配合c语言的参数调用方式可知,vel,omega为数值类型,属于传入类型。
因此只需在函数体中显式定义vel与omega即可将速度传入fluent求解器。
time与dtime是用于定义速度的。
详细实例可参看fluentudf文档p182。
2、DEFINE_DYNAMIC_ZONE_PROPERTY
该宏能用于以下一些场合:
(1)在in-cylinder应用中定义旋转中心。
(2)定义变化的网格层高度。
第一种用法:
DEFINE_DYNAMIC_ZONE_PROPERTY(name,dt,swirl_center)
参数说明:
name:
UDF名。
Dynamic_Thread*t:
指向存储动网格属性结构的指针。
若没有动态区域位于当前计算的旋转中心,则fluent内部将该参数设置为NULL.
real*swirl_center:
swirl_center为一个具有3个元素的数值,表示旋转中心的x,y,z坐标。
返回值为:
void。
具体实例可参看udf手册p183。
第二种用法:
在使用动态层方法时定义变化的网格高度。
参数与第一种用法略有不同。
DEFINE_DYNAMIC_ZONE_PEOPERTY(name,dt,height)
参数说明:
name:
UDF名
Dynamic_Threaddt:
指向存储动网格属性结构的指针
real*height:
一个实数指针,指向动态层高度为时间或crank角的函数。
返回值:
void
具体实例参看fluentudf手册P185
3、DEFINE_GEOM
用户可以使用此宏定义变化区域的几何。
默认情况下,ansysfluent提供了机制用于定义节点沿平面或柱面运动。
当ansysfluent更新了变形区域上的节点时(例如通过弹簧光顺或局部面重构之后),会通过调用DEFINE_GEOM宏重新定位节点。
请注意该宏只能作为编译型UDF使用。
函数说明:
DEFINE_GEOM(name,d,dt,position)
参数说明:
name:
UDF名
Domain*d:
指向计算域的指针
Dynamic_Thread*dt:
指向存储用户指定的动网格参数的指针
real*position:
指向存储位置信息的数组。
此函数没有返回值。
详细实例可参阅FLUENTUDF手册P187.
4、DEFINE_GRID_MOTION
默认情况下,ANSYSFLUENT通过使用固体运动方程来更新动态区域的节点位置。
这意味着动态区域的节点之间没有相对运动。
但是如果用户需要独立的控制每一个节点的运动的话,则可以通过使用DEFINE_GRID_MOTION宏来实现。
例如网格运动UDF可以更新由于流固耦合所导致的弯曲形成的节点坐标。
此UDF宏只能用于编译型。
函数说明:
DEFINE_GRID_MOTION(name,d,dt,time,dtime)
参数说明:
name:
UDF名
Domain*d:
计算域指针
Dynamic_Thread*dt:
指向存储了动网格参数的结构的指针
realtime:
当前时间
realdtime:
时间步
返回类型:
void。
具体实例可参阅FLUENTUDF手册P188
让网格动起来(5)—配置UDF编译环境
FLUENTUDF中关于动网格的DEFINE宏均要求为编译型。
FLUENT的UDF运行环境有两种:
解释型与编译型。
虽然两种方式都是采用编译,但是编译方式及编译后获得的结果是不同的。
编译型UDF需要通过Complied进行编译,编译后得到相应的dll文件。
而解释型UDF则是通过Interprete进行加载,不会生成dll文件。
据我的直觉,编译型UDF可能利用了钩子函数的技术。
一、编译型UDF与解释型UDF的差异(翻译自UDF手册)
1、解释型UDF
一个精简的平台
都能被作为编译型UDF使用
不需要C编译器(利用FLUENT自身的编译器)
比编译型UDF反应慢
在方法方面受到较多的限制
无法被链接到编译系统或其它库
只能使用预定义宏访问存储于ansysfluent中的数据
2、编译型UDF
比解释型UDF反应迅速
没有诸多C语法限制
能够使用其它语言编写的函数
当具有一些解释型UDF不能处理的功能时,无法作为解释型UDF使用
3、选取原则
对于小型的、简单的功能,使用解释型UDF
复杂功能使用编译型UDF。
(如具有较大的CPU开销、需要访问公共库)
二、配置UDF编译环境
对于编译型UDF,在fluent中加载时,需要调用C编译器将其编译成DLL文件。
这里的C编译器虽说理论上是没有任何限制的,但是在windows环境下还是推荐使用microsoftvisualc++,在linux环境下推荐使用GCC。
我们这里只说windows环境下编译环境的配置问题。
visualc++最高版本是6.0,再往后就是microsoftvisualstudio7.0、8.0、9.0、10.0。
其中7.0对应microsoftvisualstudio2003,8.0对应2005,9.0对应2008,10.0对应2010。
在一些老版的fluent中,通常需要配置环境变量。
配置环境变量的方法,网络上很多,可以搜索。
这里讲的是通过修改udf.bat文件来配置编译环境。
在fluent12.0之后的版本中,可以通过修改udf.bat文件的方式进行编译环境配置。
该文件位于
xx\ANSYSInc\v140\fluent\ntbin\win64目录下。
本人安装的fluent是64bit的,版本为14.0。
不同版本的fluent,该文件所处的位置可能不同。
大家可以利用windows的文件搜索功能寻找该文件。
注意若是安装了icepak,则会有两个udf.bat文件,一定要注意我们只针对fluent目录下的该文件。
我们用记事本打开此文件,由于本机上安装的是microsoftvisualstudio2010,因此只需要关注图中橙色线框中的部分。
现在来分析橙色框中的语句。
有过DOS经验的人可能嫌我罗嗦,不过我还是要说一下。
因为现在有DOS经验的人越来越少了。
(1)第8行:
echo是dos中助于在屏幕上写出一段文本。
这与c语言中的printf,c#中的Console.WriteLine,JAVA中的System.Print的功能是一样的,只是在屏幕上打出后面一段文字,我们可以忽略了。
(2)第10行:
设定MSVC_DEFAULT的值。
其实是一个赋值语句。
容易理解。
一会儿需要动它。
(3)第11行:
ifexist是判断,判断后面的vcvarsall.bat文件是否存在,若存在,则设置变量MSVC的值。
(4)第12行:
判断MSVC是否为空,若不为空,则进入msvc_env100标记行。
找到该标记行,其内容位于86~89行。
该标记行的内容为:
(1)设定msvc_version为100
(2)调用vcvarsall.bat文件,利用amd64,因为我安装的fluent版本是64bit,若32bit版本会有所不同。
(5)跳转到ms_c_end行,该行是一个结束标记行。
看起来复杂,其实人们要做的工作很少。
用户所要做的仅仅是修改第10行的内容。
修改microsoftvisualstudio的安装路径。
若vc是全默认安装,则什么都不需修改,否则改为正确的路径。
如本机的microsoftstudio安装在d:
\programfiles目录下,只需将第10行修改为:
setMSVC_DEFAULT=D:
\ProgramFiles\MicrosoftVisualStudio10.0
就可以了。
剩下要做的工作是:
在fluent启动面板中勾选Environment标签页下的setupcompilationEnvironmentforUDF选项。
该选项默认是选中的,且不同的版本该选项所处的位置可能有所不同。
三、总结
配置12.0以上fluentUDF编译环境,需要进行的工作:
(1)找到fluent安装目录下的udf.bat文件
(2)打开udf.bat文件,修改对应本机安装的microsoftvisualstudio版本的路径
OK了!
这种方式配置UDF编译环境不需要考虑计算机的操作系统。
让网格动起来(6)—动网格参数图解
Fluent的动网格设置,主要是通过dynamicmesh面板进行设置。
动网格面板如下图所示。
主要包括两部分内容:
(1)MeshMethods
(2)DynamicMeshZones。
另外还包括网格域运动预览及网格运动预览。
整个动网格面板通过勾选DynamicMesh选项而激活。
1、MeshMethods(网格更新方法)
该部分主要用于网格或网格域在运动过程中,设置计算域中网格节点位置更新方法。
fluent中有三种主要网格更新方法:
(1)网格光顺方法
(2)动态层方法(3)网格重构。
对于3D模型,还包括in-cylinder、six-dof、ImplicitUpdate三种选项。
其中in-cyliner用于发动机气缸模拟,six-dof主要用于流体作用于刚体,预测刚体运动。
implicitupdate用于设定网格更新方式。
默认采用显式方式,勾选此选项可设定网格以隐式方式更新。
2、动态网格域
用于定义网格运动的区域及运动类型。
FLUENT中网格运动类型主要有:
静止、刚体运动、变形区域、用户自定义域、耦合域。
静止域在网格运动过程中,区域内节点位置保持不变。
虽然说默认情况下不设定区域运动,则该区域为静止,但是一些情况下还是需要显式设定某些区域为静止域,尤其是在一些与刚体域相连的区域处理上。
刚体运动域:
这是fluent动网格中最常见的运动类型。
通过规定刚体的速度或位移来控制运动。
变形域:
由于边界运动导致节点变形。
变形域通常与刚体域是相连的。
自定义域:
用户可以使用UDF定义自己需要的域
耦合域:
节点位移由耦合求解器计算,在流固耦合计算中,耦合面上通常设定为耦合域类型。
让网格动起来(7)—网格光顺
FLUENT中的网格光顺(smoothing)主要采用两种方法:
弹簧光顺与扩散光顺。
其中弹簧光顺包含有:
弹簧光顺、边界层光顺、拉普拉斯光顺。
扩散光顺分为:
基于壁面距离的扩散光顺与基于单元体积的扩散光顺。
一、弹簧/拉普拉斯/边界层光顺
1、弹簧光顺需要设置的参数
主要有四个参数需要设置:
SpringConstantFactor(弹簧常数因子),BoundaryNodeRelaxation(边界节点松弛),ConvergenceToler