簡體   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