Использование программного обеспечения для контроля версий для поддержки случаев моделирования OpenFOAM CFD
Для моей магистерской работы я работаю с открытым инструментом моделирования CFD OpenFOAM. Для тех, кто не знаком с его структурой:
Обычно вы создаете каталог для каждого случая моделирования. Этот каталог состоит из нескольких подкаталогов, в которых хранятся несколько файлов конфигурации ascii. Они определяют сетку, опции для решателя и т. Д.... в зависимости от сложности вашего моделирования, может быть довольно много настроек в нескольких файлах.
Поскольку часто требуется некоторое экспериментирование, пока вы не выясните рабочую настройку, очень помогли бы изменения контроля версий в этих файлах конфигурации и возможность возврата к предыдущим состояниям. Эта базовая функциональность должна предоставляться каждым программным обеспечением для контроля версий.
Я нашел эту запись в блоге об использовании git для отслеживания изменений в ваших конфигурационных файлах OpenFOAM. После того, как я настроил это сам, я могу подтвердить, что git действительно работает очень хорошо в этом случае.
Однако в записи также говорится об использовании ветвей для изменения параметров в одном случае. Очень часто мне нужно создавать слегка измененные копии моих дел, например, чтобы изучить влияние различных граничных условий на моё моделирование.
Использование разных веток здесь недостаточно, потому что мне нужно сравнивать результаты разных модификаций, и поэтому для каждого моделирования необходим свой рабочий каталог!
Моим решением было клонировать мой оригинальный репозиторий git-case для каждого модифицированного кейса. Но сейчас это становится очень громоздким, как только я хотел бы внести общие изменения в эту "семейство дел". Рассмотрим следующий сценарий:
- Есть "универсальная" папка
- Я создаю несколько клонов "generic", немного изменяя каждый случай потом
- Я понимаю, что испортил настройку в "универсальном", исправил ее, а затем хотел бы также обновить все клоны.
Поскольку git не позволяет "проталкивать вниз по течению" (поскольку "универсальный" репозиторий не знает о своих "дочерних элементах"), мне пришлось бы вручную извлекать каждый клон.
Моя идеальная установка будет выглядеть так:
- Один репозиторий для семейства дел
- У меня есть "общие" настройки для моего случая (скорее всего, в форме "основной" ветви)
- Изменения в моей "общей" настройке будут автоматически интегрированы во все измененные (под) случаи
- Когда мне нужно запустить и сравнить несколько версий, я могу просто "передать их на аутсорсинг" в отдельные рабочие каталоги, где они все еще автоматически синхронизируются с изменениями в "универсальные"
Другими словами, в отличие от оригинальной концепции, стоящей за git (работающей над подветвлениями и медленно перемещающей изменения вверх по течению к мастеру), в моем сценарии эта концепция более сопоставима с "наследованием изменений", как в объектно-ориентированном программировании.
Возможно ли это, или есть способ приблизиться к этому, чем моя текущая настройка git, которая включает в себя много толчков и толчков? Поскольку я работаю над этим только на локальной машине, стоит ли мне переходить на инструмент централизованного управления версиями, такой как subversion?
Обновить:
Благодаря предложениям я добился определенного прогресса. Я обнаружил, что скрипт git-new-workdir удовлетворяет почти всем моим требованиям, касающимся общих файлов конфигурации и "аутсорсинга" рабочих каталогов, без необходимости проталкивать и извлекать все изменения между каталогами (я также знаю, что он уже включен в качестве git основная функция для более свежих версий).
Что касается части "наследования изменений", я могу охватить большинство установок, позволяя всем производным ветвям отслеживать изменения в их локальной ветке восходящего потока. Слияние, скорее всего, можно автоматизировать с помощью перехватов после фиксации.
Единственный случай, когда этого не хватит, - это если ветка была получена несколькими "родительскими" ветвями. Пример настройки:
modified geometry <--- generic ---> generic 2D
\ /
\ /
> modified geometry 2D <
Прав ли я предположить, что git может управлять только одной веткой upstream для каждой ветки, и автоматическое объединение из двух веток upstream невозможно?