繁体   English   中英

在Scheme语言中,如何在与外部do-loop相连的内部do-loop中分配变量计数器?

[英]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.1007.1007.100column-water-vof-at-~.3fs.txt 而且,当然改变, 6.0007.0008.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM