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

时间:2017-12-17 22:53:59

标签: variables scheme counter do-loops

我想在Ansys Fluent中读取10个案例文件,每个案例文件中有10个要读取的数据文件。 Ansys Fluent使用Scheme编程语言。 我必须设法在这里(Evaluating a floating point variable in Scheme language)和这里的代码中找到个别问题的答案  (How to increase counter in a do-loop within Scheme language?),但在收集各个答案时,我意识到我需要一个新的代码用于通过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

下一个循环...

那么,当datafilenum更改时,如何将此代码中从5.100开始的6.100更改为7.1007.100j等上部循环中的值,如j.100,并将此值附加到导出的文本文件column-water-vof-at-~.3fs.txt。当然,更改6.0007.0008.000 ......,类似于j+1.000?这让我非常困惑,因为我用了试验和错误来实现它!

2 个答案:

答案 0 :(得分:1)

如何获得号码。如果j为6并且您希望6.1使用标准数学运算为其添加1/10

(define j 6)
(+ j 1/10)
; ==> 61/10 (aka 6.1 exact)

函数format 不是标准,因此存在许多竞争实现。在SRFI-48 Intermediate Format Strings中,您可以将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会更容易。

答案 1 :(得分:0)

Ansys Fluent没有明确的Scheme标准,也没有完整的数字塔。使用“ MIT方案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中的本机快速结构,其中包含一个数字和一个基于舍入的相应字符串。

如果您仍然在这个话题上,我可以进一步详细说明这个答案。