Почему сборка разреженной матрицы выполняется медленнее, чем сборка плотной (полной) матрицы?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему сборка разреженной матрицы выполняется медленнее, чем сборка плотной (полной) матрицы?

Сообщение Anonymous »

У меня есть две функции (i) getKglobal и (ii) getKglobal_Sp. Однако время для разреженной функции примерно в 5 раз медленнее, чем для полноматричной формулировки. Я понимаю, что добиться производительности от разреженности может быть непросто. Но замедление в 5 раз кажется слишком плохим. Какую «большую и очевидную» ошибку я упускаю?
Изменить: теперь код можно воспроизвести с помощью данных, сгенерированных сам по себе. Теперь я стал примерно в 10 раз медленнее для матрицы с глубиной резкости 120 000.
import numpy as np
from scipy.sparse import lil_matrix

class Geometry:
def __init__(self, g_dof_idx, coord):
self.g_dof_idx = g_dof_idx
self.coord = coord

# random stiffness matrix
def getkelement(coord, mat):
kloc = np.zeros((12, 12))
# Set diagonal elements
np.fill_diagonal(kloc, np.random.rand(12))
# Set diagonal-1 and diagonal+1 elements (off-diagonal)
for i in range(1, 12):
kloc[i, i-1] = np.random.rand() # Below diagonal
kloc[i-1, i] = np.random.rand() # Above diagonal

return kloc

# Function for dense global stiffness matrix assembly
def getKglobal(geom, mat, nel, tdof):
k_global = np.zeros((tdof, tdof))
for i in range(nel):
dof_idx = geom.g_dof_idx
if max(dof_idx) >= tdof:
print(f"Warning: dof_idx exceeds global size. dof_idx: {dof_idx}")
coord = geom.coord
kloc = getkelement(coord, mat)
k_global[np.ix_(dof_idx, dof_idx)] += kloc
return k_global

# Function for sparse global stiffness matrix assembly
def getKglobal_Sp(geom, mat, nel, tdof):
k_global = lil_matrix((tdof, tdof))
for i in range(nel):
dof_idx = geom.g_dof_idx
if max(dof_idx) >= tdof:
print(f"Warning: dof_idx exceeds global size. dof_idx: {dof_idx}")
coord = geom.coord
kloc = getkelement(coord, mat)
for a, global_a in enumerate(dof_idx):
for b, global_b in enumerate(dof_idx):
k_global[global_a, global_b] += kloc[a, b]
return k_global.tocsr()

# Example 1.a
nel = 10000 # Number of elements
tdof = nel*12 # Total degrees of freedom
g_dof_idx = [np.arange(i * 12, (i + 1) * 12) for i in range(nel)] # Example DOF indices
coord = [np.random.rand(4, 3) for _ in range(nel)] # Example coordinates for 4 nodes per element
geom = Geometry(g_dof_idx, coord)
mat = None # Placeholder for material properties

# Dense assembly
import time
t1=time.time()
k_global_dense = getKglobal(geom, mat, nel, tdof)
t2=time.time()
# Sparse assembly
k_global_sparse = getKglobal_Sp(geom, mat, nel, tdof)
t3=time.time()
treg = t2-t1
tsp = t3-t2
print(treg,tsp)


Подробнее здесь: https://stackoverflow.com/questions/793 ... x-assembly
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»