[英]In Scheme language, how to assign a variable counter in an inner do-loop connected with the outer do-loop?
我想在 Ansys Fluent 中读取 10 个案例文件,对于每个案例文件,有 10 个数据文件要读取。 Ansys Fluent 使用 Scheme 编程语言。 我必须设法在此处(在 Scheme 语言中评估浮点变量)和此处(如何在 Scheme 语言中的 do-loop 中增加计数器? )中的代码中获得一些个别问题的答案,但是在收集个别答案时,我意识到我需要一个新的计数器代码,用于通过 do-loop 读取数据文件。 这是包含来自其他问题的解决方案的代码:
(do ((i 10 (+ i 1))
(j 5 (+ j 1)))
((>= i 20) 'my-return-value)
(ti-menu-load-string
(format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j))
(do ((datafilenum 5.100 (+ datafilenum 0.100)))
((>= datafilenum 6.000))
(ti-menu-load-string (format #f "/file/read-data \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec-~.3f.dat\"" i j i j datafilenum))
(ti-menu-load-string (format #f "/plot plot n \"C:/DataProcessing/Case~a-time~a-sec/test/water-vof/column-water-vof-at-~.3fs.txt\" y n n water vof y 0 1 0 16 ()" i j datafilenum))))
我想在这里实现的是:阅读案例文件
Case10-time5-sec.cas
然后它读取 10 个数据文件并绘制答案
Case10-time5-sec-5.100.dat
Case10-time5-sec-5.200.dat
...
Case10-time5-sec-6.000.dat
下一个循环:
Case11-time6-sec.cas
读取 10 个数据文件并绘制答案
Case11-time6-sec-6.100.dat
Case11-time6-sec-6.200.dat
...
Case11-time6-sec-7.000.dat
下一个循环...
因此,当j
更改上层循环中的值(例如j.100
并将此值附加到导出的文本文件column-water-vof-at-~.3fs.txt
时,如何将此代码中从5.100
开始的datafilenum
更改为6.100
、 7.100
、 7.100
等column-water-vof-at-~.3fs.txt
。 而且,当然改变, 6.000
到7.000
, 8.000
......,像j+1.000
? 这让我非常困惑,因为我已经使用反复试验来实现它!
如何获得号码。 如果j
是 6 并且您想要6.1
,则使用标准数学运算将1/10
添加到它。
(define j 6)
(+ j 1/10)
; ==> 61/10 (aka 6.1 exact)
函数format
不是标准的,因此有许多相互竞争的实现。 在SRFI-48 中间格式字符串中,您可以这样做以使61/10
显示为6.100
:
(format #f "~0,3F" (+ j 1/10))
; ==> "6.100"
所以把它们放在一起:
(do ((i 10 (+ i 1))
(j 5 (+ j 1)))
((>= i 20))
(ti-menu-load-string
(format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j))
(do ((datafilenum (+ j 1/10) (+ datafilenum 1/10)))
((>= datafilenum (+ j 1)))
(ti-menu-load-string (format #f "/file/read-data \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec-~0,3F.dat\"" i j i j datafilenum))
(ti-menu-load-string (format #f "/plot plot n \"C:/DataProcessing/Case~a-time~a-sec/test/water-vof/column-water-vof-at-~0,3Fs.txt\" y n n water vof y 0 1 0 16 ()" i j datafilenum))))
如果这不起作用,您需要编辑您正在使用的实现。 例如。 Racket 具有不同的format
,但它也支持 SRFI-48,因此我使用(require srfi/48)
对此进行了测试。 我更喜欢使用 SRFI 而不是实现版本,因为以后移植到 RNRS 的不同实现或修订版会更容易。
Ansys Fluent 没有明确的 Scheme 标准,也没有完整的数字塔。 使用“MIT Scheme 3 和 4 的混合物”。
当循环浮点数时,由于任意精度,尤其是将这些数字放入字符串时,总会出现问题。 正如您已经提到的,Fluent 不直接支持精确算术的小数。
你最终会得到这样的东西
Case11-time6-sec-6.100.dat
Case11-time6-sec-6.200.dat
...
Case11-time6-sec-6.499987987.dat
...
Case11-time6-sec-7.000.dat
到目前为止,我想出的最好的解决方案是编写一个函数来计算一个对,这是 Sheme 中的一个本地和快速结构,它包含一个数字和一个基于舍入的相应字符串。
如果您仍在讨论这个话题,我可以用更多细节来扩展这个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.