文章目录
  1. 1. 求解条件的选择
  2. 2. TUI操作
    1. 2.1. 数据类型
    2. 2.2. Scheme的常见语法糖
  3. 3. 常见问题

基本操作步骤是非常程式化的,已经记得很清楚了,不需要写了(懒

在几何正确的情况下,对于模拟质量影响最大的是网格和求解条件。网格主要在网格软件中控制(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=yno=n
  • Strings:用双引号包裹
  • Filenames:就是一种字符串,但是在不含空格时可以不带引号,但是这可能在某些时候与变量名混淆
  • Lists:其实Scheme中的一切都是列表,列表以一个空列表为结尾'()

Scheme的常见语法糖

  • 1
    (let (var val) exp1 exp2 ...)

定义局部变量,即把val赋值给var,只对exp1exp2……有效

  • 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循环的方法,但不比递归好懂……对于列表操作,有两个简单方法mapfor-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

常见问题

文章目录
  1. 1. 求解条件的选择
  2. 2. TUI操作
    1. 2.1. 数据类型
    2. 2.2. Scheme的常见语法糖
  3. 3. 常见问题