Sulit bagi pengguna untuk menentukan setiap aspek dari suatu algoritma. Jika algoritma memungkinkan komponen bersarang, maka tidak ada jumlah opsi yang terbatas akan cukup. Oleh karena itu, sangat penting bahwa opsi tidak harus "menggembung" ke tingkat atas, seperti dalam kasus argumen eksplisit atau parameter templat. Ini kadang-kadang disebut "masalah konfigurasi" dalam rekayasa perangkat lunak. Saya percaya PETSc memiliki sistem unik yang kuat untuk manajemen konfigurasi. Ini mirip dengan pola Service Locator dalam esai Martin Fowler tentang inversi kontrol .
Sistem konfigurasi PETSc bekerja melalui kombinasi konfigurasi yang ditentukan pengguna yang dikelola oleh objek solver (dengan get and set queries) dan Options Database. Setiap komponen simulasi dapat mendeklarasikan opsi konfigurasi, nilai default, dan tempat untuk meletakkan hasilnya. Objek bersarang memiliki awalan yang dapat dikomposisikan, sehingga setiap objek yang membutuhkan konfigurasi dapat ditangani secara independen. Opsi itu sendiri dapat dibaca dari baris perintah, lingkungan, file konfigurasi, atau dari kode. Saat opsi dideklarasikan, string bantuan dan halaman manual ditentukan, sehingga -help
opsi tersebut dapat dimengerti dan sehingga GUI yang tertaut dengan benar dapat ditulis.
Pengguna memanggil SetFromOptions
metode untuk membuat objek mengkonfigurasi sendiri berdasarkan opsi baris perintah. Memanggil fungsi ini adalah opsional, dan tidak dapat dipanggil jika pengguna (orang yang menulis kode yang memanggil PETSc) mengekspos opsi melalui beberapa antarmuka lainnya. Kami sangat menyarankan agar pengguna mengekspos basis data opsi karena memberikan pengguna akhir (orang yang menjalankan aplikasi) banyak daya, tetapi tidak diperlukan.
Konfigurasi tipikal, dipanggil via
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();
Catatan:
PetscOptionsList()
menyajikan pengguna dengan pilihan dari daftar dinamis. Ada arsitektur plugin yang implementasi baru dapat digunakan untuk mengekspos diri mereka sebagai kelas pertama untuk penelepon. (Implementasi ini dapat ditempatkan di perpustakaan bersama dan digunakan sebagai kelas satu tanpa mengkompilasi ulang program.)
SNESSetFromOptions()
mengkonfigurasi pemecah linear, prekondisi, dan komponen lainnya yang memerlukan konfigurasi secara rekursif.