Fluent Addon 程序解析

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




你可能感兴趣的:(Scheme,Module,ext,lambda)