Проблема
В настоящее время я работаю над симуляцией Навье-Стокса с помощью конечных элементов, и я хотел бы изучить влияние различных параметров. Некоторые параметры указываются во входном файле или через параметры командной строки; другие параметры предоставляются в виде флагов в Makefile, поэтому мой код должен перекомпилироваться всякий раз, когда я изменяю эти параметры. Мне было бы интересно получить несколько советов о хорошем способе систематического изучения пространства параметров.
- Существуют ли полезные библиотеки / фреймворки C ++ / Python, которые могут помочь с такими вещами? Например, обнаружение boost.Program_options было большой помощью, поскольку возможно перегрузить параметры входного файла аргументами командной строки. Я также видел, как некоторые люди используют файл задания, достаточно эффективно описывающий каждый случай, и коллега предположил, что запись параметров в файлы vtu как блоки комментариев тоже может сработать.
- Возможно, вообще не стоит тратить на это много времени? Это просто отвлечение внимания и трата времени, и лучше всего просто тренироваться в процессе тестирования грубой силой и ad hoc?
Некоторые мысли
В настоящее время я делаю вещи в основном вручную, и я столкнулся со следующими проблемами:
- Именование тестовых случаев . Я попытался сохранить результаты в папках с именами параметров запуска, разделенных подчеркиванием, например
Re100_dt02_BDF1...
. Они быстро становятся длинными или трудными для чтения / шифрования, если их слишком сокращать. Кроме того, параметры действительного числа включают в себя,.
что неудобно / некрасиво. - Регистрация данных прогона . Иногда я хотел бы видеть результаты, записанные в терминал, а также сохраненные в текстовом файле. Этот ответ от StackOverflow, например, несколько полезен, но решения кажутся немного навязчивыми.
- Построение данных в соответствии с параметром . Требуется довольно много времени, чтобы собрать соответствующие данные из различных файлов журналов в один файл, который я затем могу построить, с лучшей системой, возможно, это станет проще.
- Запись комментариев на данные . После изучения результатов я записываю некоторые комментарии в текстовый файл, но иногда это сложно синхронизировать с папками результатов.
software
finite-element
python
c++
Матия Кечман
источник
источник
Ответы:
Просто несколько комментариев по двум вашим пунктам:
Регистрация данных прогона : Ваша лучшая ставка, вероятно, заключается в передаче результатов через команду tee , которая должна быть доступна в большинстве оболочек.
Построение данных в соответствии с параметром : я полагаю, это дело вкуса, но когда мне нужно выполнить сложное агрегирование данных, я сохраняю результаты в виде простого текста, считываю их в Matlab в виде матриц и выполняю все вычисления, построение графиков и даже вывод в формате LaTeX. оттуда. Очевидно, что любой язык программирования / скриптинга, с которым вы наиболее знакомы, даст вам лучшие результаты.
источник
tee
команда очень полезнаЕсли вы хотите написать что-то общего назначения, вы можете сделать это либо с помощью сценариев оболочки, если это что-то очень простое, как предлагает Педро , либо агрегировать на языке математического программирования более высокого уровня, таком как Python или MATLAB. Я согласен, что простые текстовые файлы полезны для меньших объемов данных, но вам, вероятно, следует перейти на двоичные данные для чего-то большего, чем несколько мегабайт.
С другой стороны, если вы просто проводите оценку параметров, я бы рекомендовал использовать программное обеспечение, специально предназначенное для этого. Некоторым исследователям в моем университете повезло с DAKOTA , набором инструментов для определения неопределенности из национальных лабораторий Sandia ( доступным по лицензии GNU Lesser General Public License ).
Вот выдержка из страницы Sandia, описывающая DAKOTA:
источник
bzip2
и7zip
которые предлагают еще лучшие коэффициенты сжатия для текста.В моей докторской работе я сталкиваюсь с такими же проблемами, как и вы. Поскольку я использую не мой код, у меня не такая гибкость, как у вас. Тем не менее, у меня есть несколько предложений.
Как предположил Педро, есть команда тройника. Но, если он недоступен, или вы хотите что-то встроенное в ваше программное обеспечение, я бы посоветовал взглянуть на
boost::iostreams
библиотеку. Он предоставляет механизмы для определения входных источников и выходных приемников, чего не делает стандартная библиотека. В частности, есть один,tee_device
который позволяет вам подключить два выходных приемника к вашему потоку, а другие потоки могут действовать как приемники. Это позволит вам сделать одновременный вывод вstdout
зависимости от конфигурации файла журнала.Я согласен, что это1
boost::program_options
может быть очень полезно при настройке вашего программного обеспечения. Тем не менее, у него есть пара недостатков, которые могут повлиять на ваши действия. Во-первых, если вам нужна иерархическая конфигурация, то файлы - это болезненный способ ее выполнить. Во-вторых, что более важно, у него нет возможностей вывода, поэтому вы не можете сохранить свое состояние в виде файла конфигурации для последующей проверки или возобновления остановленного кода. В качестве альтернативы я бы предложил использовать те, которые поддерживают файлы иерархической конфигурации, и сохранить деревья для последующего повторного использования. Это дает дополнительное преимущество, заключающееся в том, что если вам нужно проверить контрольный код вашего кода, вы можете сохранить его текущее состояние в качестве входных данных при перезапуске.ini
boost::program_options
boost::property_tree
Для сбора данных из различных вычислений я перебираю все файлы данных, которые я хотел бы включить в набор, затем использую awk для создания одной строки в файле и направляю все результаты в мой вывод. Это может занять пару минут, но, к сожалению, у меня нет лучшего способа.
Что касается обработки / комментирования ваших данных, я не могу не подчеркнуть полезность формата ноутбука Mathematica. Это позволяет мне организовывать свои наблюдения, предположения и визуализации в одном месте. Мои ноутбуки регулярно превышают 100 МБ. Для правильной оценки Mathematica выполняет так же хорошо, как Matlab для матричных задач. Кроме того, его можно использовать для заметок с полным математическим форматированием в режиме реального времени.
Хотелось бы, чтобы у меня было лучшее решение проблемы с именами, и это довольно пагубно. Возможно, стоит подумать о выводе некоторых ваших данных в базу данных из-за этого. Однако, если вы не хотите этого делать, рассмотрите возможность использования расширенных атрибутов в XFS для сбора более полной информации о моделировании и сохранения файла конфигурации вместе с данными, которые он использовал для создания.
1. В качестве примера, где требуются файлы иерархической конфигурации, мой друг изучал влияние различных геометрий наконечника в AFM, и каждая геометрия имела свой набор параметров. Кроме того, он тестировал несколько схем расчета, чтобы сравнить их с экспериментом, и у них были совершенно разные параметры.
источник
boost::property_tree
. Другая проблемаboost::program_options
заключается в том, что она непригодна для использования в качестве библиотеки только для заголовков, что неудобно, если вы хотите, чтобы ваше приложение запускалось на машине с только повышенными заголовками. Кстати, кто-нибудь знает, почему это так? В любом случае, это довольно маленькая библиотека. (Возможно, лучше разместить это в спискеboost::program_options
чтобы заставить его быть превращенным в библиотеку. Тем не менее, вы смотрели на утилиту bcp для извлечения подмножества наддува?Я узнаю PyTables при установке PETSC. И я предполагаю, что метод таблицы (или базы данных) хорошо подходит для исследования пространства параметров, хотя я еще не пробовал. Мы можем записывать каждый прогон с определенными параметрами, а затем мы можем обращаться к любым агрегатам, удовлетворяющим некоторым условиям, скажем, мы можем исправить dt, BDF1 и искать все соответствующие записи, чтобы изучить изменение из-за других параметров.
Я хотел бы услышать от людей, которые фактически используют метод таблицы (или базы данных) для исследования пространства параметров. Я буду признателен за подробные образцы.
источник
Исследование пространства параметров, которое вы пытаетесь сделать, может очень быстро стать громоздким. Есть так много разных способов сделать это, что нет единственного реального решения.
Обычно, когда вы достигаете этого предела в своей работе, вы можете исследовать иерархические форматы данных HDF5 . HDF5 позволяет хранить сложные выходные данные вашего моделирования в четко определенном формате файла. Преимущества в том, что ваши данные хранятся в одном четко определенном формате файла. Вы можете добавить в свой файл несколько прогонов симуляции, идентифицируемых различными параметрами, и управлять ими впоследствии. Данные могут быть сжаты, и их довольно легко извлечь с помощью различных инструментов. Есть простой apis для c / c ++ / python и т. Д. И множество инструментов командной строки для манипулирования файлами. Недостатком является то, что запись в hdf5 не так проста, как запись в консоль. Есть много примеров программ на примерах HDF5 .
источник
Вы хотите сохранить индексированную таблицу значений переменных. Индекс соответствует папке, в которой вы храните каждый ввод и вывод симуляции. Так что это всего лишь индекс, и вам не нужно беспокоиться об именовании или иерархиях папок, потому что вы посмотрите, какие значения параметров соответствуют каждой папке.
Теперь вы можете использовать эту таблицу для организации пост-обработки, построения графиков (анализа), ведения журналов и комментирования. Таблица занимает центральное место в рабочем процессе.
Это основная идея, и я описываю то, что вы можете сделать только концептуально. В своем первоначальном ответе я предложил изучить структуру, которую я разработал. Совсем недавно я открыл Суматру . Это намного более развито, чем мой индивидуально разработанный, изо всех сил аспирант, и плохо знакомы с усилиями Python, но я думаю, что он пытается сделать слишком много. Он сфокусирован на информации о происхождении, а моя структура - на эффективности рабочего процесса. Есть также наемный , священный и ленцет .
Что бы вы ни выбрали, я настоятельно рекомендую Python для решения этих типов задач, поскольку вы можете управлять всем своим рабочим процессом с помощью Python. В качестве небольшой истории я наблюдал, как мои коллеги работают с DAKOTA, bash, GNUplot, соглашениями по именованию файлов, sed / awk октавой ... и т. Д. делать свою вычислительную работу. Каждый из этих инструментов хорош сам по себе, но мощь Python как интегрирующего связующего языка действительно блестит, когда вы используете python для управления своей работой вместе с научным стеком python. У меня буквально не было проблем с управлением моей вычислительной работой после того, как я разработал свою среду.
/ мой первоначальный ответ следует /
Я считаю, что я решил эту проблему с помощью Python. Я думал обо всех этих проблемах.
Проверьте мое репо http://msdresearch.blogspot.com/2012/01/parameter-study-management-with-python.html
На данный момент я работаю над улучшением документирования моей структуры. (это более сложный процесс, чем заполнение файла readme!)
-Маджид альДосари
источник
Я склонен согласиться со следующей реализацией, которую я разработал в ходе моей исследовательской работы, что можно найти здесь , здесь и здесь .
Чтобы передать переменные в программу и затем изменить их, я использую парадигму использования сценария bash, где я определяю
а затем использовать в C / C ++
Большие преимущества этого в том, что:
Кроме того, я всегда передаю idName, для которого каждый файл, написанный этим исполняемым файлом, будет иметь начальную идентификацию (может сопровождаться другими параметрами, если вы хотите), и они также получают каталог экспорта = idName, который создается на скрипт bash, и все файлы этого исполняемого файла сохраняются на нем. Таким образом, результаты упорядочены по каталогам (необязательно).
источник
Вы можете проверить sfepy, которая является программой с конечными элементами, почти полностью написанной на python. У этого также есть типовая проблема Навье Стокса. Порядок работы сфепов очень прост.
источник
Вы думали об использовании базы данных MySQL? Я никогда не делал этого, но я мог представить, что вы можете запросить эту систему очень хорошо! Возможно, другие системы, такие как MongoDB, лучше. Итак, это всего лишь идея.
источник