2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 МКЭ - память под матрицу жесткости. ANSYS и собственный код.
Сообщение01.11.2006, 07:14 
Доброе утро.
Имеем задачу НДС, решаемую методом КЭ.
Размер задачи ~ 65 000 узлов. 3 степени свободы.
То есть размер матрицы будет 3*65000 на 3*65000.
Если пересчитать всё в байты, то необходимо примерно 200 ГИГАбайт оперативки.
Пусть экономное храненение матрицы (симметрия+выкинуть нулевые элементы) позволит в 10 раз сократитьнам требование памяти.
Но всё равно это будет 20 ГИГАбайт. Это в собственном коде.
НО! ANSYS решает эту задачку на персоналке с 1 Гигом оперативки, беря при этом примерно 800 мегабайт.
Вопрос: каким образом он это делает? Как он так экономно расходует память?
Может кто поможет? Хотя бы ссылку на возможные решения?
Большое спасибо.

 
 
 
 
Сообщение01.11.2006, 12:44 
Аватара пользователя
Что-то мне подсказывает, что ненулевых элементов будет чуть меньше, чем Вы думаете. :)

Во всяком случае, не больше, чем 3*65000*N, где N --- максимальное число конечных элементов, которые могут сходиться в одном узле.

 
 
 
 
Сообщение01.11.2006, 13:08 
Цитата:
Пусть экономное храненение матрицы (симметрия+выкинуть нулевые элементы) позволит в 10 раз сократить нам требование памяти.


Не совсем так. Матрица жесткости получается ОЧЕНЬ сильно разреженной.
Количество ненулевых элементов в строке матрицы можно определить априори по сетке конечных элементов. Если узел N1 "соединяется" с узлом N2 посредством некоторого конечныого элемента, то в матрице жесткости элемент (N1, N2) будет ненулевым.
В обычных треугольных сетках один узел может "соединяться" с 4-8 соседними узлами (если сетка качественная и практически нет элементов с очень малыми узлами).
В четырехугольных сетках - примерно тоже самое.

Так что в итоге получаем, что в матрице жесткости в не зависимости от количества конечных элементов в строке имеется всего 4-8 (для "кривых" сеток это чуть больше, но все равно малое значение) ненулевых элементов. Во всей матрице ненулевых элементов будет ЧИСЛО СТРОК*(4-8). В Вашем случае - 65000*3*(4-8). С учетом симметрии - получаем в два раза меньше. Здесь еще важный момент - в чем хранить числа. Если используется формат double - то это 8 байт на число, float - всего 4 байта. При решении гармонических задач - необходимы комплексные числа, а это два числа на одну степень свободы.

При использовании спарс-матриц экономия получается существенной. Так, например, в задачах расчета электрических полей (1 степень свободы) с 200,000 узлов (примерно 400,000 треугольных элементов) у меня требуется метров 400-500 для формата double precision.

Добавлено спустя 13 минут 48 секунд:

worm2 писал(а):
Во всяком случае, не больше, чем 3*65000*N, где N --- максимальное число конечных элементов, которые могут сходиться в одном узле.


Это если элементы первого порядка, а если высших - тут нужно также учитывать промежуточные узлы. В любом случае - число ненулевых элементов в матрице жесткости соответствует числу узлов, с которыми "соединяется" некоторый i-узел посредством конечных элементов:))

 
 
 
 
Сообщение01.11.2006, 21:57 
Всем большое спасибо.
Действительно количество ненулевых элементов матрицы очень мало. Например из 1.5 млн всего 36 тысяч ненулевых.
В итоге сделали хранение только ненулевых.

 
 
 
 
Сообщение02.11.2006, 11:32 
Аватара пользователя
VLarin писал(а):
Это если элементы первого порядка, а если высших - тут нужно также учитывать промежуточные узлы. В любом случае - число ненулевых элементов в матрице жесткости соответствует числу узлов, с которыми "соединяется" некоторый i-узел посредством конечных элементов:))

Да, Вы правы. Я должен был написать "... максимальное число рёбер конечных элементов, которые могут сходиться в одном узле".

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group