[英]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.