Общий формат файлов-словарей OpenFOAM
Итак, в OpenFOAM существует единый текстовый формат для ввода и вывода данных. На английском файлы называются dictionary files. В рамках этой статьи, я буду называть их прсто файлы-словари либо файлы. Как правило, суть ясна из контекста или от него не зависит. Формат файлов-словарей является общим для всех файлов, используемых при работе с OpenFOAM. Это и файлы с исходными данными для генерации сетки, или файлы, сетки после её генерации утилитой blockMesh. или файлы настроек решателя. Этот же формат у результирующих файлов решения задачи, размещенных в папках временных шагов. Решатель автоматически сохраняет их в процессе решения задачи, используя встроенный функционал генерации и чтения файлов-словарей.
Информация об этом формате на английском языке доступна в официальной документации по пакету на сайте. Это документация по версии openfoam.org, однако она остается в силе и для файлов-словарей версии openfoam.com. Кстати, о разнице в версиях OpenFOAM и о соглашениях в нумерации версий можно прочитать на форуме cfd-online.com. Причина того, что версии две, те же самые, по которым есть множество версий Linux: «Почему нет?»
Комментарии в файлах-словарях оформляются так же, как в С++ (// и /*…*/).
Типы записей в файлах-словарях
Четыре типа записей: словари, списки, поля, отдельные переменные (скаляр, вектор или тензор). Списки и словари могут включать другие типы, например векторы или скаляры.
1. Словари
Предназначение: Хранить набор пар имя-значение. Как правило, содержит текстовые и числовые параметры, заголовок, настройки решателей.
Отличить можно по наличию фигурных скобок {…}.
Примеры: Словарь FoamFile является заголовком в каждом файле OpenFOAM.
Ещё пример: blockMeshSample05/system/fvSchemes и fvSolutions содержат словари в качестве всех записей.
2. Списки
Предназначение: Список параметров. Число элементов списка м.б. либо задано, либо нет. Тип элементов списка тоже может быть задан.
Отличить можно по наличию круглых скобок и точки с заптяой (…); В них заключены элементы списка.
Примеры: См. списки Vertices и Blocks в файле blockMeshSample05/system/blockMeshDict — это списки вершин и блоков. Они заданы для того, чтобы утилита blockMesh построила по этим данным сетку.
Или, например, список с указанием числа элементов списка (19456 точек) см. файл: blockMeshSample05/constant/polymesh/points
3. Поля (физические)
Предназначение: Поле состоит из нескольких записей. Задается по отдельности наружное поле и внутреннее.
Отличить можно по наличию ключевых слов dimensions, internalField, boundaryField.
Примеры: См. файлы p и U в папке blockMeshSample05/0 (в этой папке заданы поля во внутренней области и на границах в нулевой момент времени)
4. Отдельные переменные
Предназначение: Просто пара имя-значение. Если значение состоит из одной цифры, это скаляр. Из трех — вектор, а из 9 — тензор. Могут иметь размерность заданную в показателях степени базовых единиц измерения системы СИ. Например [0 2 -1 0 0 0 0] слева направо: кг, метр, секунда, кельвин, моль, ампер, кандела. Указанная единица измерения означает [m^2/s]
Примеры: См. controlDict в папке blockMeshSample05/system
Отдельная переменная с размерностью: см. файл blockMeshSample05/constant/transportProperties
Архив с файлами примеров взят из видео по blockMesh на YouTube.
Об отступах и не особой строгости формата
Файлы-словари OpenFOAM являются текстовыми файлами (ASCII). Для их редактирования подходит vim, nano, gedit или любой другой текстовый редактор. В формате нет необходимых отступов или табуляции и пустых строк. Определение пары ключевое «слово и значение» может быть разбито на две строки, если это нужно для удобочитаемости файла. Также, нет необходимости ставить спец-символы продолжения строки при переносе. Обязательным является наличие заголовка в начале файла, а также пробела между ключевым словом и значением.
Итак, с точки зрения отступов и размещения ключевых слов, файлы-словари имеют относительно свободный формат. Посмотрите на следующие фрагменты файла blockMeshDict:
Оба приведенных фрагмента одинаково работают при генерации сетки утилитой blockMesh. В принципе, чтение словарного файла и генерация сетки сработает если в одном словаре описать его элементы по-разному, но вряд-ли это может пригодиться:
Программирование ввода-вывода в OpenFOAM
С точки зрения программирования, работа с файлами-словарями OpenFOAM осуществляется методами класса IOdictionary.
Для изучения принципов работы с OpenFOAM на уровне программирования, рекомендуется обратиться к примерам. В частности, для изучения работы с файлами-словарями, к примеру номер 01 «Input-Output». Я проверял компиляцию и работу этого примера с текущей версией OpenFOAM-v2106.
В заключении об остальных примерах
Итак, мы рассмотрели то, что для работы с вводом и выводом в OpenFOAM используется единый формат файлов-словарей, которые могут содержать разного типа данные. Рассмотрели, какие могут быть данные и рассмотрели специфику и строгость формата.
OpenFOAM устанавливается с большим количеством примеров в папке tutorial. Самые простые- в папке \tutorials\incompressible\icoFoam и \tutorials\basic.
Суть работы с OpenFOAM сводится, как правило, к работе именно с текстовыми файлами-словарями. Благодаря этой характеристике, пакет с одной стороны не удобен, а с другой, его интерфейс предельно прост и не требует изучения. Другое дело — знание различных типов записей, которые должны быть или могут быть приведены в конфигурационных файлах-словарях при формировании задачи в OpenFOAM.