Спарс-матрица - от англ. Sparse-matrix:)
Цитата:
Но всё таки всё равно надо делать оптимизацию матрицы (приведение к ленточному виду без уменьшения ширины ленты). Не хранить же в памяти матрицу размером 3,4 Гб(для случая с 10-ю тысячами узлов)
Нет, ни какой оптимизации делать не нужно. Спрас-матрицы хранят только ненулевые элементы.
В каждой строке матрицы будет всего N-ненулевых элемента, где N, как я уже писал, число узлов, с которыми связан i-узел посредством конечных элементов + 1, умноженное на число степеней свободы в узле.
Если у Вас конечные элементы 1 порядка четырехугольные - то это (8+1)*3, треугольные (6+1)*3. На основании этого можно прикинуть сколько у Вас будет ненулевых элементов в матрице и сколько для этого нужно памяти, чтобы хранить их в виде спарс-матрицы. А еще и симметрия матрицы жесткости.
Цитата:
Дайте ссылочку на этот метод сопряженных градиетов с предобуславливанием неполным разложением Холеского.
Библиотека на шаблонах для хранения и работы с матрицами
Matrix Template Library (ITL)Итерационные решатели с различными предобуславливателями
Iterative Template Library (ITL)Это библиотеки, есть и другие схожие, кроме того встречал в чистом виде коды сопряженного градиента - метод простой, ничего хитрого в нем нет, просто нужен класс матрицы с реализованными базовыми операциями.
Если интересует сам метод, то можно посмотреть
Методы решения СЛАУ большой размерностиЦитата:
У меня в программе узлы и элеметы храняться в виде двух динамических списков. По ним я формирую граф. Потом применяю хитрый обход графа, после которого у меня происходит перенумерация узлов и уменьшение ширины ленты. А потом из этого графа формирую матрицу жесткости. Я правильно думаю?
В принципе да. Если все-таки интересует уменьшение ширины ленты - то все как я уже говорил - сначала делаем сетку, потом перенумеровываем узлы и сохраняем. Специальный граф сущестует только на этапе перенумерации, потом он просто не нужен.
В итоге до стадии сборки матрицы будем иметь сетку конечных элементов такую, что она априори дает хорошую ширины ленты. Но опять таки - это нужно только для хранения в ленточном виде и применения соответствующих решателей.
Для связки спарс-матрица+CG (Conjaguate Gradient) этого не требуется:)
Главное хорошо продумать иерархию классов. По этому вопросу в инете есть куча работ типа "Объектно-ориентированный МКЭ" - диссеры, статьи, сайты с иерархией классов. Мой Вам совет - не нужно изобретать велосипед, нужно хорошенько ознакомиться с тем что уже есть и на основании этого додумав и доделав что-то сотворить своё. Неплохо было бы реализовать супер-элементы и domain decomposition, это дает ускорение решения.
На первое время можно взять готовый решатель и матрицы - потом будет время, сделаете свои классы для работы с матрицами:)
Добавлено спустя 4 минуты 47 секунд:Цитата:
Почитал книжку А.Джордж , Дж.Лю - Численное решение больших разряженных систем
- это очень старая книжка, нужно посмотреть что-нить новенькое. На данный мемент она морально устарела.