Kullanıcının bir algoritmanın her yönünü belirtmesi zahmetlidir. Algoritma iç içe bileşenlere izin veriyorsa, sınırlı sayıda seçenek yeterli olmaz. Bu nedenle, açık argümanlarda veya şablon parametrelerinde olduğu gibi seçeneklerin mutlaka en üst düzeye "kabarması" gerekmez. Buna bazen yazılım mühendisliğinde "yapılandırma sorunu" da denir. PETSc'nin konfigürasyon yönetimi için benzersiz bir güçlü sistemi olduğuna inanıyorum . Martin Fowler'in kontrolü tersine çevirme denemesindeki Servis Bulucu modeline benzer .
PETSc'nin yapılandırma sistemi, çözücü nesneleri (alma ve ayarlama sorguları ile) ve Seçenekler Veri Tabanı tarafından yönetilen kullanıcı tanımlı yapılandırmanın bir kombinasyonu ile çalışır. Simülasyonun herhangi bir bileşeni, bir yapılandırma seçeneği, varsayılan bir değer ve sonucu koymak için bir yer bildirebilir. İç içe nesnelerin, yapılandırılması gereken her nesnenin bağımsız olarak ele alınabileceği şekilde oluşturulabilen önekleri vardır. Seçeneklerin kendisi komut satırından, ortamdan, yapılandırma dosyalarından veya koddan okunabilir. Bir seçenek bildirildiğinde, -help
seçeneğin anlaşılabilir olması ve düzgün şekilde bağlanmış bir GUI'nin yazılabilmesi için bir yardım dizesi ve kılavuz sayfası belirtilir .
Kullanıcı SetFromOptions
, bir nesneyi komut satırı seçeneklerine göre yapılandırmak için bir yöntem çağırır . Bu işlevin çağrılması isteğe bağlıdır ve kullanıcı (PETSc'yi çağıran kişi kodu yazarken) seçenekleri başka bir arabirim üzerinden açıyorsa çağrılmayabilir. Son kullanıcıya (uygulamayı çalıştıran kişi) çok fazla güç sağladığı için, kullanıcının seçenekler veritabanını göstermesini önemle tavsiye ederiz, ancak gerekli değildir.
Yoluyla adlandırılan tipik bir yapılandırma
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();
Notlar:
PetscOptionsList()
kullanıcıya dinamik listeden bir seçenek sunar. Yeni uygulamaların kendilerini birinci sınıf olarak arayanlara göstermek için kullanabileceği bir eklenti mimarisi vardır. (Bu uygulamalar paylaşılan kütüphanelere yerleştirilebilir ve programları yeniden derlemeden birinci sınıf olarak kullanılabilir.)
SNESSetFromOptions()
doğrusal çözücüler, önkoşullar ve yapılandırmaya ihtiyaç duyan diğer bileşenleri özyinelemeli olarak yapılandırır.