Fluent学习笔记
基本操作步骤是非常程式化的,已经记得很清楚了,不需要写了(懒
在几何正确的情况下,对于模拟质量影响最大的是网格和求解条件。网格主要在网格软件中控制(Gambit);而求解条件,比如湍流模型的设置、数值算法的设置则是计算流体力学方面的内容。
求解条件的选择
参见计算流体动力学。
TUI操作
其实TUI不怎么常用,但是记录操作的宏文件.jou
文件的语法与TUI是一致的,只需注意:TUI中的操作可以交互的设置参数,.jou
中则需要一次给齐。
TUI中的命令以类似目录树的形式存储,也就是说,创建一对interface
的命令是这样的:
1 | > /define/mesh-interfaces/create |
之后再跟上对应的参数。特别的,由于Fluent基于Scheme写成,凡是被括号完全包起来的行将被视为Scheme语句,例如驱使GUI界面完成Check Mesh
的动作:
1 | (cx-gui-do cx-activate-item "MenuBar*MeshMenu*Check") |
Scheme是函数式语言Lisp的一门方言,基本语法就是
1
2 > (function arg1 arg2 ...)
>
就连接受返回值的变量也是当参数给出的。
定义变量和函数采用同样的语法,例如定义\(y\triangleq\sqrt{1-x^2}\):
1
2 > (define (y x) (sqrt (-1.0 (* x x))))
>
一些注意事项:
;
开头的行为注释!
开头的行为shell命令,
不能作为分隔符,而是代表默认值- 很多命令可以用缩写(Abbreviation)或者别名(Alias)
数据类型
- Numbers:不需要在意整数与浮点,例如
-1.2E-5, #b11111, #x1f
- Booleans:主要用在各种确认的位置,
yes
=y
,no
=n
- Strings:用双引号包裹
- Filenames:就是一种字符串,但是在不含空格时可以不带引号,但是这可能在某些时候与变量名混淆
- Lists:其实Scheme中的一切都是列表,列表以一个空列表为结尾
'()
Scheme的常见语法糖
1
(let (var val) exp1 exp2 ...)
定义局部变量,即把val
赋值给var
,只对exp1
、exp2
……有效
1
(lambda (var ...) exp1 exp2 ...)
匿名函数
'
表示引用,即不进行解析,原样传值,如'(+ 2 3)
分支结构:
1
2
3
4(define (abs n)
(if (< n 0)
(- 0 n)
n))1
2
3
4
5
6
7(define (abs n) ; 翻译成Python:
(cond ; if n == 0:
((= n 0) 0) ; return 0
((< n 0) (- 0 n)) ; elif n < 0:
(else n))) ; return 0 - n
; else:
; return n此外,还有类似于C中
switch
的:1
2
3
4(case (+ x y)
((1 3 5 7 9) "odd")
((0 2 4 6 8) "even")
(else "out of range"))循环结构:娘炮才用循环,真男人就要用递归(不是)。以阶乘为例,简单的递归导致每一层函数都加载在内存中;采用自带返回值的“尾递归”,Scheme会将其处理为循环,不占资源,例如:
1
2
3
4
5
6
7
8(define (fact-tail n)
(fact-rec n n))
(define (fact-rec n p)
(if (= n 1)
p
(let ((m (- n 1)))
(fact-rec m (* p m)))))
其实还有一个do
循环的方法,但不比递归好懂……对于列表操作,有两个简单方法map
和for-each
,二者略有区别(“Map stores the return values of each call to the function, while for-each does not”)……但我没看懂
1
2
3
4
5
6
7
8
9
10
11
12> (map (lambda (x) (* x 2)) '(1 2 3 4 5 6))
(2 4 6 8 10 12)
> (for-each (lambda (x)
(display (* x 2))
(newline))
'(1 2 3 4 5 6))
2
4
6
8
10
12