На языке 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, которая содержит число и соответствующую строку на основе округления.

Если вы все еще занимаетесь этой темой, я могу дополнить этот ответ более подробной информацией.

Другие вопросы по тегам