Nó là khó khăn cho người dùng để xác định mọi khía cạnh của một thuật toán. Nếu thuật toán cho phép các thành phần lồng nhau, thì không có số lượng tùy chọn hữu hạn nào là đủ. Do đó, điều quan trọng là các tùy chọn không nhất thiết phải "nổi bong bóng" lên mức cao nhất, như trong trường hợp đối số rõ ràng hoặc tham số mẫu. Điều này đôi khi được gọi là "vấn đề cấu hình" trong công nghệ phần mềm. Tôi tin rằng PETSc có một hệ thống mạnh mẽ duy nhất để quản lý cấu hình. Nó tương tự như mẫu Trình định vị dịch vụ trong bài tiểu luận về sự đảo ngược quyền kiểm soát của Martin Fowler .
Hệ thống cấu hình của PETSc hoạt động thông qua sự kết hợp của cấu hình do người dùng chỉ định được quản lý bởi các đối tượng người giải (với các truy vấn get và set) và Cơ sở dữ liệu tùy chọn. Bất kỳ thành phần nào của mô phỏng đều có thể khai báo tùy chọn cấu hình, giá trị mặc định và vị trí để đặt kết quả. Các đối tượng lồng nhau có các tiền tố có thể được tạo thành, sao cho mọi đối tượng cần cấu hình có thể được xử lý độc lập. Các tùy chọn có thể được đọc từ dòng lệnh, môi trường, tệp cấu hình hoặc từ mã. Khi một tùy chọn được khai báo, một chuỗi trợ giúp và trang man được chỉ định, để -help
tùy chọn đó có thể hiểu được và để có thể viết GUI được liên kết chính xác.
Người dùng gọi một SetFromOptions
phương thức để làm cho một đối tượng tự cấu hình dựa trên các tùy chọn dòng lệnh. Gọi chức năng này là tùy chọn và có thể không được gọi nếu người dùng (người viết mã gọi PETSc) đang hiển thị các tùy chọn thông qua một số giao diện khác. Chúng tôi đặc biệt khuyên người dùng nên phơi bày cơ sở dữ liệu tùy chọn vì nó cung cấp cho người dùng cuối (người đang chạy ứng dụng) một sức mạnh lớn, nhưng không bắt buộc.
Một cấu hình điển hình, được gọi thông qua
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();
Ghi chú:
PetscOptionsList()
trình bày cho người dùng một sự lựa chọn từ một danh sách động. Có một kiến trúc plugin mà các triển khai mới có thể sử dụng để hiển thị bản thân như là hạng nhất cho người gọi. (Những triển khai này có thể được đặt trong các thư viện dùng chung và được sử dụng làm lớp đầu tiên mà không cần biên dịch lại chương trình.)
SNESSetFromOptions()
cấu hình đệ quy các bộ giải tuyến tính, tiền điều kiện và bất kỳ thành phần nào khác cần cấu hình.