Параметризуем непараметризуемое в ANSYS Fluent при помощи TUI и Scheme
В современных версиях Fluent параметризовать можно практически всё - достаточно лишь запуститься из-под Workbench и найти рядом с полем ввода параметризуемой величины выпадающий список
или небольшую кнопку с буквой “P”.
Однако существуют поля ввода, для которых параметризация не предусмотрена. Примером может служить поле ввода массового расхода для периодических границ, которые лично я часто использую для создания развитых входных профилей.
Ниже мы рассмотрим, как обойти это ограничение.
Идея заключается в следующем: мы привязываем к параметру процедуру, которая использует в качестве аргумента его значение. Эта процедура вызывается при каждом изменении параметра и выполняет определённую нами текстовую команду (любому меню графического интерфейса соответствует определённая текстовая команда), подставляя в неё текущее значение параметра. Существует несколько эквивалентных способов реализации данного подхода1, и мы рассмотрим один из них на примере упомянутых выше периодических ГУ.
Первым делом нам нужно текстовую команду, аргумент которой мы хотим параметризовать, и понять, в каком порядке она будет принимать от нас аргументы. Структура текстового интерфейса интуитивно понятна, поэтому для нас не составит труда найти команду
/define/periodic-conditions/massflow-rate-specification?2
Далее нужно запустить диалог и нажать Enter в ответ на каждый из запросов – это позволит определить последовательность аргументов:
В результате получаем такую строку:
/define/periodic-conditions/massflow-rate-specification? 38.7 0 0.5 2 1 0
Теперь нам нужно создать в рабочей директории текстовый файл mFlow.scm следующего содержания:
(define per-mflow
(lambda (value )
(ti-menu-load-string (format #f "/define/per-c/m-r-s ~g0~%0.5~%2~%1~%0~%" value))))
Здесь мы на языке Scheme3 определяем процедуру per-mflow, которая осуществляет подстановку значения параметра в команду текстового интерфейса. На что здесь следует обратить внимание:
- Предопределённый во Fluent макрос ti-menu-load-string4 нужен для передачи строк в виде команд в текстовый интерфейс.
- Вместо значения расхода используем директиву “~g” для подстановки “value”.
- После каждого аргумента подставляется символ новой строки “~%”.
Считываем в текущую сессию Fluent созданный файл mFlow.scm: File > Read > Scheme.
Теперь нам нужно «повесить» на параметр загруженную процедуру: Define > Parameters > More > Use in Scheme Procedure:
В поле ввода процедуры указываем придуманное нами имя (то, что сразу после define):
После нажатия кнопки Define в списке Registered List должен появиться новый элемент. Если вернуться в Workbench, то можно увидеть появившийся параметр:
На этом хитрости заканчиваются. Теперь массовый расход стал обыкновенным входным параметром.
1 См. User’s Guide > 6.1.8.2. Working With Advanced Parameter Options
2 Подробнее о принципах работы с текстовым интерфейсом можно прочесть в User’s Guide > Chapter 2: Text User Interface (TUI). Список текстовых команд имеет отдельный раздел – Text Command List.
3 См. документацию http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref.pdf
4 См. Fluent Customization Manual > II. Creating Custom User Interfaces in Fluent > Appendix B. Reference Table For Fluent Macros
- Добавить комментарий
- цитата
- 5727 просмотров
Комментарии
Несколько дополнений.
Если сделать так, то после закрытия и повторного открытия Fluent - придется повторять все заново.
Чтобы изменения стали постоянными, нужно загрузить mFlow.scm через Workbench: ячейка Setup > Register Startup Scheme File… в контекстном меню.
mFlow.scm лучше расположить в рабочей директории Fluent, т.е. в директории, которую он открывает при выборе File > Read > Scheme.
Обычно параметров много, и создавать для каждого параметра именую функцию - накладно.
В этом случае достаточно вставить саму лямбду непосредственно в поле Scheme Procedure окна Use in Scheme Procedure, либо выполнить в консоли (TUI):
Файл mFlow.scm уже не нужен.
Он не нужен, и только затрудняет чтение. Альтернатива:
или
Так как задаем только один параметр, то лучше не менять остальные, используя "
_
":И все же рекомендуется использовать "
args->string
" для передачи параметров:По сути, "Mass Flow Rate" - это параметр модели (model-related variable; Scheme variable), он хранится в case-файле (и в ".set"), там же можно узнать и его имя "periodic/mass-flow", а зная его имя - можно напрямую задать его: "
(rp-var-value-set! 'periodic/mass-flow 38.7)
" или "(rpsetvar 'periodic/mass-flow 38.7)
".В итоге получится:
или, немного сократив:
Это наиболее быстрый способ, т.к. весь GUI и TUI (консоль) работает как надстройка над Scheme.
Подробнее про используемые функции:
rpsetvar
(6.8 User-Defined Scheme Variables) и%rpgetvar
(3.6.2 Accessing a Cached Scheme Variable in the Text Interface)rp-var-value-set!
:(the-environment)
И что удивительно, эти функции
(the-environment)
не имеют описания того, что они конкретно делают, даже входные параметры не описаны.Но зато доступен исходный код.
Код функции можно посмотреть, использовав команду
(pp)
. Примеры:Некоторые функции сами используют
pp
для вывода кода, как например(show-solution-monitors)
.Для просмотра кода TUI-псевдонимов (aliases), таких как
it
,wc
,ls
, … нужно добавить "?" перед именем:?it
,?wc
,?ls
.Большое спасибо за ценные дополнения! Только сейчас увидел
Добавить комментарий