5.5 Решатель нелинейных систем

NOX предоставляет набор нелинейных методов которые могут быть легко интегрированы в приложения. Исторически большинство приложений имеют линейные решатели, в виде библиотек, и обеспечиваются своей собственной программой нелинейного решателя. NOX же предоставляет гораздо больший набор нелинейных методов, и может быть расширена путем разработки новых нелинейных методов.

Для решения систем нелинейных уравнений NOX использует методы подобные методу Ньютона. Метод Ньютона определяет последовательность множеств, который под определенными условиями сходятся к решению. Для этого применяется локальная полная линеаризация уравнений.

NOX не зависит от конкретных библиотек линейной алгебры. Пользователи могут сами объявлять классы унаследованные от абстрактного класса NOX::Abstract::Vector, в этом классе определены основные операции над векторами такие как скалярное произведение. Так же можно задавать классы унаследованные от NOX::Abstract::Group, в этом классе реализрвана функциональность линейной алгебры. NOX содержит реализацию этих абстрактных классов для матриц и векторов Epetra. Для использования этой реализации нужно в конфигурации задать параметр –enable-nox-epetra.

Для использования интерфейса NOX::Epetra необходимы два шага. Во-первых, нужно написать класс, реализующий интерфейс NOX::Epetra::Interface. Данный класс должен определять следующие методы:

1. Метод для вычисления для заданной. Синтаксис метода:

computeF(const Epetra_Vector&x, Epetra_Vector&y, FillType flag)

где x и y — вектора Epetra_Vector, flag — переменная перечисления, определяющая тип вычисления.

2. Метод для вычисления Якобиана:

computeJacobian(const Epetra_Vector& x, Epetra_Operator* Jac)

Данный метод опциональный, его необходимо реализовать, если пользователь хочет сам реализовать вычисление Якобиана.

3. Метод задающий матрицу предобуславливателя:

computePrecMatrix(const Epetra_Vector& x, Epetra_RowMatrix& M)

4. Метод для вычисления предобуславливателя, определенного пользователем:

computePreconditioner(const Epetra_Vector& x, Epetra_Operator& M)

Метод должен вычислять предобуславливатель, зависящий от решения и записывать его в переменную M.

Далее пользователь может реализовать интерфейс NOX::Epetra::Group, который будет содержать информацию о методе нахождения решения. Все конструкторы должны принимать следующие параметры:

Список параметров ввода и вывода, заданный через NOX::Parameter::List.

Начальное приближение решения (объект класса Epetra_Vector).

Оператор Якобиана и опционально оператор предобуславливателя. Якобиан можно задать как экземпляр Epetra_Operator

Epetra_Operator& J = UserProblem.getJacobian()

или же как MatrixFree

NOX::Epetra::MatrixFree & J = MatrixFree(userDefinedInterface, solutionVec)

или же создать через конечные разности NOX

NOX::Epetra::FiniteDifference & J = FIXME...

А так же пользователь обязан создать класс унаследованный от NOX::Epetra::Interface и создать группу NOX::Epetra::Group group (printParams, lsParams, interface)