Все ответы об инженерном анализе

Параметризуем непараметризуемое в ANSYS Fluent при помощи TUI и Scheme

Аватар пользователя dvolkind
5 5727

В современных версиях 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, которая осуществляет подстановку значения параметра в команду текстового интерфейса. На что здесь следует обратить внимание:

  1. Предопределённый во Fluent макрос ti-menu-load-string4 нужен для передачи строк в виде команд в текстовый интерфейс.
  2. Вместо значения расхода используем директиву “~g” для подстановки “value”.
  3. После каждого аргумента подставляется символ новой строки “~%”.

Считываем в текущую сессию 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

Комментарии

Аватар пользователя i_torus

Несколько дополнений.

  • Считываем в текущую сессию Fluent созданный файл mFlow.scm: File > Read > Scheme.

    Если сделать так, то после закрытия и повторного открытия Fluent - придется повторять все заново.
    Чтобы изменения стали постоянными, нужно загрузить mFlow.scm через Workbench: ячейка Setup > Register Startup Scheme File… в контекстном меню.

    mFlow.scm лучше расположить в рабочей директории Fluent, т.е. в директории, которую он открывает при выборе File > Read > Scheme.
     

  • Обычно параметров много, и создавать для каждого параметра именую функцию - накладно.
    В этом случае достаточно вставить саму лямбду непосредственно в поле Scheme Procedure окна Use in Scheme Procedure, либо выполнить в консоли (TUI):

    /define/parameters/input-parameters/advance/use-in scheme-proc "massFlow" 38.7 (lambda (value) (ti-menu-load-string (format #f "/define/per-c/m-r-s ~g0~%0.5~%2~%1~%0~%" value)))

    Файл mFlow.scm уже не нужен.
     

  • (ti-menu-load-string (format #f "/define/per-c/m-r-s ~g0~%0.5~%2~%1~%0~%" value))

    3. После каждого аргумента подставляется символ новой строки “~%”.

    Он не нужен, и только затрудняет чтение. Альтернатива:

    (ti-menu-load-string (format #f "/define/per-c/m-r-s ~d 0 0.5 2 1 0" value))

    или

    (ti-menu-load-string (format #f "/define/per-c/m-r-s ~a 0 0.5 2 1 0" value))

     

  • Так как задаем только один параметр, то лучше не менять остальные, используя "_":

    (ti-menu-load-string (format #f "/define/per-c/m-r-s ~a _ _ _ _ _" value))

     

  • И все же рекомендуется использовать "args->string" для передачи параметров:

    (ti-menu-load-string (args->string '/define/per-c/m-r-s value '_ '_ '_ '_ '_))

     

  • По сути, "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)".

    В итоге получится:

    (lambda (value) (rp-var-value-set! 'periodic/mass-flow value))

    или, немного сократив:

    (lambda (a) (rp-var-value-set! 'periodic/mass-flow a))

    Это наиболее быстрый способ, т.к. весь GUI и TUI (консоль) работает как надстройка над Scheme.
     

Подробнее про используемые функции:

И что удивительно, эти функции (the-environment) не имеют описания того, что они конкретно делают, даже входные параметры не описаны.

Аватар пользователя i_torus

Цитата:
И что удивительно, эти функции (the-environment) не имеют описания того, что они конкретно делают, даже входные параметры не описаны.

Но зато доступен исходный код.

Код функции можно посмотреть, использовав команду (pp). Примеры:

(pp init-flow)
(pp flow-init)
(pp wb-update-solution)
(pp wb-solve)

 

Аватар пользователя i_torus

Некоторые функции сами используют pp для вывода кода, как например (show-solution-monitors).

Аватар пользователя i_torus

Для просмотра кода TUI-псевдонимов (aliases), таких как it, wc, ls, … нужно добавить "?" перед именем: ?it, ?wc, ?ls.

Аватар пользователя dvolkind

Большое спасибо за ценные дополнения! Только сейчас увидел

Добавить комментарий

Войдите или зарегистрируйтесь, чтобы отправлять комментарии