Користувач громіздко визначає кожен аспект алгоритму. Якщо алгоритм дозволяє вкладені компоненти, то жодної кінцевої кількості варіантів не буде достатньо. Тому вкрай важливо, щоб параметри не обов'язково "піднімалися" до верхнього рівня, як у випадку явних аргументів або параметрів шаблону. Іноді це називається "проблемою конфігурації" в інженерії програмного забезпечення. Я вважаю, що PETSc має унікально потужну систему управління конфігурацією. Він схожий на схему «Локатор послуг» у нарисі Мартіна Фаулера про інверсію контролю .
Система конфігурації PETSc працює за допомогою комбінації визначеної користувачем конфігурації, керованої об'єктами solver (із запитами отримання та встановлення) та базою даних параметрів. Будь-який компонент моделювання може оголосити параметр конфігурації, значення за замовчуванням та місце для розміщення результату. Вкладені об'єкти мають префікси, які можна скласти таким чином, що кожен об'єкт, який потребує конфігурації, може бути адресований незалежно. Самі параметри можна читати з командного рядка, середовища, файлів конфігурації або з коду. Коли опція оголошена, вказується рядок довідки та довідна сторінка, щоб -help
параметр був зрозумілим і щоб можна було записати правильно пов'язаний графічний інтерфейс.
Користувач викликає SetFromOptions
метод зробити сам конфігурацію об'єкта на основі параметрів командного рядка. Виклик цієї функції необов'язковий і не може бути викликаний, якщо користувач (особа, що пише код, який викликає PETSc) відкриває параметри через якийсь інший інтерфейс. Ми настійно рекомендуємо користувачеві виставляти базу даних з опціями, оскільки це дає кінцевому користувачеві (особі, яка запускає додаток) велику потужність, але це не потрібно.
Типова конфігурація, що називається через
PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol", /* options database key */
"Absolute tolerance for local truncation error", /* long description */
"TSSetTolerances", /* function and man page on topic */
ts->atol, /* current/default value *?
&ts->atol, /* place to store value */
&option_set); /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt); /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes); /* configure nonlinear solver. */
PetscOptionsEnd();
Примітки:
PetscOptionsList()
представляє користувачеві вибір з динамічного списку. Існує архітектура плагінів, яку нові реалізації можуть використовувати, щоб піддавати себе як першокласні абоненти. (Ці реалізації можна розмістити в спільних бібліотеках і використовувати як першокласні без перекомпіляції програм.)
SNESSetFromOptions()
рекурсивно налаштовує лінійні розв'язувачі, попередні кондиціонери та будь-які інші компоненти, які потребують конфігурації.