Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Montagem do Sistema Global

LNCC - Laboratório Nacional de Computação Científica

A montagem (assembly) consiste em combinar as contribuições de todos os elementos para formar as matrizes e vetores globais.

Numeração dos Graus de Liberdade

Considere uma malha com:

Cada elemento KeK_e tem vértices/nós locais indexados por i=0,1,,nloc1i = 0, 1, \ldots, n_{\text{loc}}-1, onde nlocn_{\text{loc}} é o número de nós por elemento (2 para P1-1D, 3 para P1-triângulo, 4 para Q1-quadrilátero, etc.).

O elemento KeK_e tem uma conectividade conne[i]\text{conn}_e[i] que mapeia o índice local ii para o índice global jj.

Matriz Global de Rigidez

A matriz global ARNv×Nv\mathbf{A} \in \mathbb{R}^{N_v \times N_v} é montada por:

A[I,J]=e=1Nei,j:conne[i]=Iconne[j]=JAKe[i,j]A[I, J] = \sum_{e=1}^{N_e} \sum_{\substack{i, j : \\ \text{conn}_e[i] = I \\ \text{conn}_e[j] = J}} A_{K_e}[i, j]

Em outras palavras, cada entrada AKe[i,j]A_{K_e}[i, j] da matriz local contribui para a entrada global A[I,J]A[I, J], onde I=conne[i]I = \text{conn}_e[i] e J=conne[j]J = \text{conn}_e[j].

Algoritmo de Montagem

Inicializar A = matriz esparsa N_v × N_v

Para cada elemento K_e:
    Calcular matriz local A_Ke
    Para cada i local:
        I = conn_e[i]
        Para cada j local:
            J = conn_e[j]
            A[I, J] += A_Ke[i, j]

Vetor Global de Carga

Similarmente, o vetor global bRNv\mathbf{b} \in \mathbb{R}^{N_v} é montado por:

b[I]=e=1Nei:conne[i]=IbKe[i]b[I] = \sum_{e=1}^{N_e} \sum_{i : \text{conn}_e[i] = I} b_{K_e}[i]

Algoritmo de Montagem

Inicializar b = vetor zero de tamanho N_v

Para cada elemento K_e:
    Calcular vetor local b_Ke
    Para cada i local:
        I = conn_e[i]
        b[I] += b_Ke[i]

Matriz de Massa Global

A matriz de massa global M\mathbf{M} é montada da mesma forma que a matriz de rigidez:

M[I,J]=e=1Nei,j:conne[i]=Iconne[j]=JMKe[i,j]M[I, J] = \sum_{e=1}^{N_e} \sum_{\substack{i, j : \\ \text{conn}_e[i] = I \\ \text{conn}_e[j] = J}} M_{K_e}[i, j]

Estrutura de Dados Esparsa

Como a maioria das entradas de A\mathbf{A} são zero (os nós só acoplam através de elementos compartilhados), usamos formato esparso:

No fempack, usamos scipy.sparse.lil_matrix durante a montagem (eficiente para inserções) e convertemos para csr_matrix antes de resolver (eficiente para álgebra linear).

Exemplo 1D

Considere 3 elementos P1 cobrindo [0,1][0, 1]:

Cada elemento contribui com uma matriz 2×22 \times 2:

AK0=1h[1111]posic¸o˜es (0,0),(0,1),(1,0),(1,1)A_{K_0} = \frac{1}{h} \begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix} \rightarrow \text{posições } (0,0), (0,1), (1,0), (1,1)
AK1=1h[1111]posic¸o˜es (1,1),(1,2),(2,1),(2,2)A_{K_1} = \frac{1}{h} \begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix} \rightarrow \text{posições } (1,1), (1,2), (2,1), (2,2)
AK2=1h[1111]posic¸o˜es (2,2),(2,3),(3,2),(3,3)A_{K_2} = \frac{1}{h} \begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix} \rightarrow \text{posições } (2,2), (2,3), (3,2), (3,3)

A matriz global resultante é:

A=1h[1100121001210011]\mathbf{A} = \frac{1}{h} \begin{bmatrix} 1 & -1 & 0 & 0 \\ -1 & 2 & -1 & 0 \\ 0 & -1 & 2 & -1 \\ 0 & 0 & -1 & 1 \end{bmatrix}

Note que o nó 1 recebe contribuições dos elementos 0 e 1 (por isso A[1,1]=1+1=2A[1,1] = 1 + 1 = 2).

Implementação no fempack

O módulo fempack.assemble fornece:

Exemplo:

from fempack.assemble import assemble_stiffness, assemble_load

A = assemble_stiffness(mesh, space)
b = assemble_load(mesh, space, f_rhs)

Essas funções percorrem todos os elementos, calculam as matrizes/vetores locais usando fempack.local, e acumulam nas estruturas globais usando a conectividade fornecida por mesh e space.