8.2.1 Метод сопряженных градиентов
class SparceSolver – метод сопряженных градиентов с LDU-предобуславливанием.
Выбирается в случае значения опции SolveMetod = GRAD_SOLVE_METHOD.
В нем перекрыты все пустые виртуальные процедуры базового класса кроме int Continue(), а также введена вспомогательная процедура double Norma2(double*) – вычисление евклидовой нормы n-мерного вектора.
Перекрытая виртуальная процедура создания матрицы (int CreateMatrix()) по значению опции Options.TypePred (вид предобуславливателя) создает глобальную матрицу системы типа базового класса CSIR_SymMatrix – в случае значения опции PORTRET_VORBEDING (предобуславливание на портрете), производного класса CSIR_5DSymMatrix – в случае значения опции BAND5D_VORBEDING (предобуславливание на 5 диагоналях).
Перекрытая виртуальная процедура факторизации (int Factorization()) вызывает процедуру факторизации для глобальной матрицы системы – ILDU_Factr() (см. раздел «Разреженные матрицы») из того класса, к которому принадлежит глобальная матрица.
class LentSolver – метод Холецкого для решения системы с ленточной матрицей.
Выбирается в случае значения опции SolveMetod = BAND_SOLVE_METHOD.
В нем перекрыты все пустые виртуальные процедуры базового класса кроме int Continue().
Перекрытая виртуальная процедура создания матрицы (int CreateMatrix()) создает глобальную матрицу системы типа CSIR_LentSymMatrix.
Перекрытая виртуальная процедура факторизации (int Factorization()) вызывает процедуру факторизации для глобальной матрицы системы – ILDU_Factr() (см. раздел «Разреженные матрицы»).
Также существуют производные классы для решения обобщенной задачи собственных чисел и векторов пары глобальных матриц.
class IterSolver – метод итераций подпространства для решения обобщенной задачи собственных чисел и векторов пары глобальных ленточных матриц.
Является производным от производного класса class LentSolver.
В нем перекрыта пустая виртуальная процедура базового класса int Solution().
Введены вспомогательные процедуры: int SetMatrixM(CSIR_SymMatrix*) – установка указателя на матрицу, int GetMatrixM() – доступ к матрице, int SetEigenNumVector(double*) – установка указателя на собственный вектор и SetL(int) – установка указателя на номер собственного вектора.
В классе используется глобальная матрица типа CSIR_LentSymMatrix.
В int Solution() вызываются дополнительные процедуры, не принадлежащие классу: int ToStandardEigen(int, double*, double*, double*, double*) – приведение обобщенной задачи для пары малых матриц к стандартной, описана в модуле USolveIter в пределах cpp-файла; и int JacobStand(int, double*, double*, double*) – решение стандартной задачи собственных чисел методом Якоби, описана в модуле USolveIter.cpp.
Int ToStandardEigen(int, double*, double*, double*, double*) последовательно вызывает процедуры: int Cholessky(int, double*), int InvTrig(int, double*, double*), int LTML(int, double*, double*, double*). В качестве переменных в процедуру int ToStandardEigen передаются указатели на четыре массива действительных чисел (матрицы) и их размерность (целое число).
Процедура int Cholessky(int, double*) раскладывает методом Холецкого одну из переданных матриц на произведение двух треугольных; затем процедура int InvTrig(int, double*, double*) обращает эту треугольную матрицу; и наконец int LTML(int, double*, double*, double*) умножает второю из переданных матриц на треугольную справа и слева с транспонированием.
Int JacobStand(int, double*, double*, double*) качестве переменных использует три указателя на массивы действительных чисел – матрица массивы собственных векторов и чисел, и целое число – их размерность.
class StabilMMPSolver – метод итераций подпространства для решения обобщенной задачи собственных чисел и векторов пары глобальных матриц жесткости и геометрической жесткости для решения задачи на устойчивость.
Является производным от базового класса TSolverLineSist.
В нем перекрыты все пустые виртуальные процедуры базового класса кроме int Continue() и int SetRightVector(double*), а также введены вспомогательные процедуры: int SetSecondMatrix(CSIR_SymMatrix*) – установка указателя на вторую матрицу, int SetEigenNumVector(double*) – установка указателя на собственный вектор и void* GetSecondMatrix() – доступ ко второй матрице.
Процедура int CreateMatrix() создает матрицу типа CSIR_SymMatrix*. Процедура int Factorization() вызывает процедуру факторизации для глобальной матрицы системы – ILDU_Factr() (см. раздел «Разреженные матрицы»).
В int Solution() вызываются дополнительные процедуры, не принадлежащие классу: int ToStandardEigen(int, double*, double*, double*, double*) и int JacobStand(int, double*, double*, double*) (см. class IterSolver).
Иерархия классов «конечные элементы» занимает центральное место МКЭ-процессоре. Взаимодействие классов может быть охарактеризовано как «родитель-потомок». Базовый класс содержит минимально необходимый набор методов и атрибутов для выполнения следующих задач:
1) вычисление локальных матриц коэффициентов разрешающих уравнений в зависимости от подзадачи (для подзадачи статики – матриц жесткости, для – устойчивости – матриц геометрической жесткости);
2) вычисление дополнительных данных после решения разрешающих систем уравнений (для подзадачи статики – напряжений и деформаций, для – устойчивости – дополнительных вычислений не требуется).
Решение перечисленных задач выполняется в соответствии с традиционной методикой МКЭ.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.