На языке Scheme, как назначить счетчик переменных во внутреннем цикле do, связанном с внешним циклом do?
Я хочу прочитать 10 файлов дел в Ansys Fluent, и для каждого файла дел есть 10 файлов данных для чтения. Ansys Fluent использует язык программирования Scheme. Мне удалось получить некоторые ответы на отдельные проблемы в коде здесь ( Оценка переменной с плавающей запятой на языке Scheme) и здесь ( Как увеличить счетчик в цикле do на языке Scheme?), Но при сборе отдельных ответов я понял, что мне нужен новый код для счетчика, который используется для чтения файлов данных через 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.100
, 7.100
и т.д., когда j
изменяет значение в верхнем цикле, что-то вроде j.100
и добавьте это значение в экспортируемый текстовый файл column-water-vof-at-~.3fs.txt
, И, конечно, измениться, 6.000
в 7.000
, 8.000
..., что-то вроде j+1.000
? Это очень смутило меня, потому что я использовал метод проб и ошибок, чтобы добиться этого!
1 ответ
Как получить номер. Если 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))))
Если это не работает, вам нужно отредактировать, в какой реализации вы используете. например. Ракетка имеет format
который отличается, но он также поддерживает SRFI-48, поэтому я проверил это с (require srfi/48)
, Я предпочитаю использовать SRFI, а не версию реализаций, поскольку портирование на другую реализацию или ревизию RNRS позже будет проще.
В Ansys Fluent нет четкого стандарта схемы и полной числовой башни. Использование "смеси 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, которая содержит число и соответствующую строку на основе округления.
Если вы все еще занимаетесь этой темой, я могу дополнить этот ответ более подробной информацией.