Fluent 自带了几个 Addon 程序,通过命令可以加载。
/define/models> addon-modules
FLUENT Addon Modules:
0. none
1. MHD Model
2. Fiber Model
3. PEM Fuel Cell Model
4. SOFC Fuel Cell Model
5. Population Balance Model
Enter Module Number: [0]
那么怎么才能自己来编写 Addon 程序呢,先卖个关子,看看目前成果。
加载 Addon Module,显示了一行文字并换行,载入UDF文件。
Addon Module 的构成包括 UDF 和 Scheme 文件,其中 UDF 文件是必须的,Scheme 文件不是必须的。
但自带模块的 Scheme 文件都是经过编译的 FASL 文件。
经过努力,居然读懂了文件中数字对应的代码,不禁有些自得。
有机会的话,写一个完整的 Addon Module。
看看 scheme 代码和 FASL 代码的对应关系
首先是 scheme 代码,用于定义新 rp-var。
(define make-new-rpvar
(lambda (name default type)
(if (not (rp-var-object name))
(rp-var-define name default type #f)
)
(prf-update-all-rpvars)
)
)
翻译成 FASL 代码:(这里省略了文件开始部分)
123
137
1124
1138
139
1310
01125
1126
11311
138
0011312
138
139
1310
120
011313
0000
----------------------------------------------------------------------------------------------------------------------
其实,fluent 加载 UDF 时也会自动加载 FASL 文件,如果存在的话。所以 UDF 的目录结构就是问题的关键了。
----------------------------------------------------------------------------------------------------------------------
FASL 文件中,如果是 if 分支,必须同时实现条件为真和假时的代码,不然程序就会挂掉。
最近知道了 FLUENT 编译 fasl 代码的命令: (sf "/path/to/filename_without_ext")
给一个对比的例子:
原始代码
(define (hy-append-to-file fn s) (let ((port (open-file fn "a"))) (format port "~a\n" s) (close-output-port port) ) ) (define factorial (lambda (n) (let fact ((i n)) (if (= i 0) 1 (* i (fact (- i 1))) ) ) ) )
sf 之后的代码:
(define lambda *unbound* begin set! if %= %* %- #f) (hy-append-to-file fn s port format close-output-port open-file factorial n fact i) 120 130 1121 1131 132 011121 1133 01123 1134 133 17"~a\n"132 01135 133 0001136 131 17"a"0000 120 (define 137 factorial 1121 (lambda 1138 (n 011121 ) (let 1139 ((fact)) 01123 (begin 1124 (set! 139 fact 1121 11310 01125 1126 1310 140 0141 1127 1310 1139 1128 1310 141 0000001139 138 000129 000