МКЭ-процессор. Главное окно МКЭ процессора. Подзадачи. Структура данных МКЭ. Решатели. Конечные элементы, страница 8

* Аналогично файлам с расширением .txt формируются файлы с расширением .loa, которые хранят соответствующие данные в бинарной форме.


8Решатели

Решатели используются в различных подзадачах, выполняемых с глобальными матрицами высокого порядка. Детали реализации определяются в классах решателей, производных от базового класса TSolverLineSist. Процесс решения управляется опциями решателя (для решения системы линейных уравнений - структура TSolveLineSystOptions, для остальных задач – соответствующие структуры, которые содержат TSolveLineSystOptions) и может отображаться на форме подзадачи (производной от формы класса TProcessForm).

8.1 Базовый класс решателя

В базовом классе определены функции доступа к опциям и индикации. Кроме того, объявлены пустые виртуальные процедуры:

int Factorization()

факторизация

int Solution()

решение

int Continue()

продолжение решения

int SetMatrix(CSIR_SymMatrix*)

установка указателя на матрицу

int SetRightVector(double*)

int SetResultVector(double*)

установка указателя на вектор

int CreateMatrix()

создание матрицы

void* GetMatrix()

доступ к матрице

Предполагается, что факторизация выполняется один раз с получением факторизованной или частично факторизованной матрицы, которая может быть использована для многократного решения подзадачи на каждом шаге итерационного процесса.

Процедура решения вызывается, когда факторизованная матрица уже получена.

Процедура продолжения решения используется для итерационного уточнения решения с контрольной точки.

В процедуру установки указателя на матрицу в качестве параметра передается указатель на переменную типа глобальной матрицы в сжатом строчном формате вместе с портретом CSIR_SymMatrix (см. раздел «Разреженные матрицы»).

В процедуры установки указателя на вектор в качестве параметра передается указатель на одномерный массив с вещественными элементами.

Процедура создания матрицы по виду предобуславливателя создает класс – разреженная глобальная матрица, хранящаяся в сжатом строчном формате вместе с портретом, производный от базового класса CSIR_SymMatrix для матриц и от базового класса TPortret – для их портрета.

Процедура доступа к матрице возвращает глобальную матрицу, если она создана или 0 в противном случае.

В данных экземпляра класса хранятся:

- копия записи опций решателя, которая заполняется при создании решателя из опций соответствующей подзадачи (TSolveLyneSystOptions из Options);

- указатель на окно подзадачи – владельца данного решателя (TProcessForm* Owner).

Опции базового решателя содержат следующие данные

Options.SolveMetod

Метод решения подзадачи;

Options.SolveKMax

Ограничение числа итераций;

Options.Сompress

Вид портрета;

Options.TypePred

Вид предобуславливателя;

Options.PortExtend

Число диагоналей, добавляемых к расширенному портрету;

Options.BandExtend

Число диагоналей ленточного предобуславливателя;

Options.SolvtEps

Допустимая невязка;

Options.MaxBand

Ограничение на ширину ленты;

Options.MaxVolume

Ограничение на полный объем.

Функции доступа к опциям подзадачи:

int K_Max()

Ограничение числа итераций

double Epsilon2()

Допустимая невязка системы

Эти функции возвращают значения полей опций, заполненных при создании экземпляра решателя.

Функции доступа к интерактивным опциям, определяемым окном подзадачи:

int UserBreak()

Прерывание процесса

Эти функции возвращают текущие значения опций, которые могут быть изменены окном подзадачи. Их реализация предполагает вызов виртуальных функций окна подзадачи. В случае, когда указатель на окно подзадачи установлен в нуль, функции доступа к интерактивным опциям возвращают нуль.

Функции индикации:

IndikIterNumber(int)

Индикация номера текущей итерации

IndikLastIterNumber(int)

Индикация номера последней итерации после завершения

IndikRightNorma(double)

Индикация нормы правой части

IndikInitNorma(double)

Индикация нормы начальной невязки

IndikCurrentNorma(double)

Индикация нормы текущей невязки

IndikLastNorma(double)

Индикация нормы невязки после последней итерации

IndikEpsilon(double)

IndikOrder(int)

IndikDirectProgress(int)

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

Для базового класса решателя определена также процедура создания (CreateSolverLineSist(TSolverLineSistOptions*, TProctssForm* Frm=0)), которая по значению переменной «Метод решения» (SolveMetod), хранящемуся в опциях соответствующей подзадачи – переменной типа TSolverLineSistOptions, выбирает нужную процедуру решения системы линейных уравнений для реализуемой подзадачи. Значение GRAD_SOLVE_METHOD вызывает создание решателя типа SparceSolver(Opt,Frm), реализующего метод сопряженных градиентов, значение BAND_SOLVE_METHOD вызывает создание решателя типа LentSolver(Opt,Frm) реализующего метод Холецкого для системы уравнений с ленточной матрицей.

8.2 Производные классы.

Для решения систем линейных уравнений реализовано два производных класса от базового класса решателя.