问题
I want to read 10 case files in Ansys Fluent and for each case file there are 10 data files to be read. Ansys Fluent uses Scheme programming language. I have to managed to get some answers to individual problems in the code here (Evaluating a floating point variable in Scheme language) and here (How to increase counter in a do-loop within Scheme language?), but when collecting the individual answers I realized that I need a new code for the counter which is used to read the data files through do-loop. Here is the code with solutions from from other question included:
(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))))
What I'm trying to achieve here is: read the case file
Case10-time5-sec.cas
then it reads the 10 data files and plot the answer
Case10-time5-sec-5.100.dat
Case10-time5-sec-5.200.dat
...
Case10-time5-sec-6.000.dat
Next loop:
Case11-time6-sec.cas
read the 10 data files and plot answer
Case11-time6-sec-6.100.dat
Case11-time6-sec-6.200.dat
...
Case11-time6-sec-7.000.dat
Next loop...
So, how to change datafilenum
starting with 5.100
in this code to 6.100
, 7.100
, 7.100
etc. when j
changes value in the upper loop, something like j.100
and append this value to the exported text file column-water-vof-at-~.3fs.txt
. And, of course change, 6.000
to 7.000
, 8.000
..., something like j+1.000
? This got me very confused as I have used trial and error to achieve it!
回答1:
How to get the number. If j
is 6 and you want 6.1
you add 1/10
to it using standard math operations.
(define j 6)
(+ j 1/10)
; ==> 61/10 (aka 6.1 exact)
The function format
is not standard and thus there are many competing implementations. In SRFI-48 Intermediate Format Strings you can do this to get 61/10
to be displayed as 6.100
:
(format #f "~0,3F" (+ j 1/10))
; ==> "6.100"
So putting it all together:
(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))))
If this isn't working you need to edit in which implementation you are using. eg. Racket has format
which is different, but it also supports SRFI-48 so I tested this with (require srfi/48)
. I prefer to use a SRFI rather than the implementations version since porting to a different implementation or revision of RNRS later will be easier.
来源:https://stackoverflow.com/questions/47860246/in-scheme-language-how-to-assign-a-variable-counter-in-an-inner-do-loop-connect