Эффективный поиск массивов в FORTRAN

Я пытаюсь сохранить матрицу жесткости в FORTRAN в разреженном формате для экономии памяти, т.е. я использую три вектора ненулевых элементов (irows, icols, A). После выяснения размера этих массивов следующим шагом будет вставка в них значений. Поэтому я использую точки Гаусса, то есть для каждой точки Гаусса я собираюсь найти локальную матрицу жесткости, а затем вставить эту локальную матрицу жесткости в глобальную (irows, icols, A).

Основная проблема с этой вставкой заключается в том, что каждый раз мы должны проверять, существует ли новое значение в глобальном массиве или нет, поэтому, если значение существует, добавьте новое к старому, а если нет, добавьте в конец. то есть мы должны просмотреть весь массив, чтобы найти, существует ли значение или нет. Если размер этих массивов (irows, icols, A) велик, этот поиск требует больших вычислительных ресурсов.

Может ли кто-нибудь предложить лучший способ вставки локальной матрицы жесткости для каждой точки Гаусса в глобальную матрицу жесткости.


person zahoor ullah    schedule 29.05.2012    source источник
comment
Итак, что это? ФОРТРАН 90 или ФОРТРАН 77?   -  person Ry-♦    schedule 29.05.2012
comment
Я использую FORTRAN 90, но я думаю, что даже если вы можете предложить что-то на FORTRAN 77, это сработает.   -  person zahoor ullah    schedule 29.05.2012
comment
Вы можете ознакомиться с книгой Тима Дэвиса о CSparse, в которой объясняется, как реализованы разреженные массивы.   -  person    schedule 29.05.2012


Ответы (2)


Я совершенно уверен, что это хорошо известная проблема в анализе FEM - я нашел ссылку на нее в этой документация по scipy, но, конечно, принципы не зависят от языка. По сути, вам следует создать матрицу в том формате, который у вас есть, но вместо поиска в матрице, чтобы увидеть, существует ли уже запись, просто предположите, что ее нет. Это означает, что вы получите повторяющиеся записи, которые необходимо сложить вместе, чтобы получить правильное значение.

После того, как вы создали свою матрицу, вы обычно преобразуете ее в более эффективную форму для ее решения (например, CSR и т. д.) — точный формат может определяться используемым вами разреженным решателем. Во время этого процесса преобразования повторяющиеся записи должны складываться вместе, и некоторые библиотеки разреженных матриц сделают это за вас. Я знаю, что scipy делает это, и многие из его внутренних процедур написаны на фортране, поэтому вы можете использовать одну из них (все они с открытым исходным кодом). Или вы можете проверить, есть ли что-нибудь подходящее на netlib.

person DaveP    schedule 29.05.2012

Если вы используете предварительно отсортированную структуру данных, поиск по ней будет очень эффективным. Либо в качестве вашей основной структуры данных, либо в качестве вспомогательной структуры данных. Вы хотите, чтобы вы могли вставить другую запись в середину. Например, бинарное дерево поиска (http://en.wikipedia.org/wiki/Binary_search_tree).

person M. S. B.    schedule 29.05.2012