Skip to content

FEMSystem

Classe FEMSystem

O FEMSystem atua como o "orquestrador" do solver. Ele realiza a montagem das matrizes globais a partir dos elementos, aplica as condições de contorno e resolve os problemas de autovalores (Modal) e resposta harmônica.

Processo de Montagem (Assembly) e GDLs

O sistema utiliza o formato LIL (List of Lists) para a construção inicial das matrizes devido à eficiência na inserção de novos elementos, convertendo-as para CSR (Compressed Sparse Row) antes da resolução numérica para otimizar o desempenho computacional.

  • Graus de Liberdade Livres: O sistema identifica automaticamente quais GDLs não possuem restrições (free_dofs_array), filtrando as matrizes globais para garantir que o sistema seja determinado e resolúvel.

Solvers Implementados

1. Análise Modal

Resolve o problema de autovalor generalizado:

\[([\mathbf{K}] - \omega^2[\mathbf{M}])\{\phi\} = \{0\}\]
  • Saída: Frequências naturais em Hz e autovetores (formas modais) normalizados.
  • Algoritmo: Utiliza scipy.sparse.linalg.eigsh com filtragem por deslocamento (shift-invert).
2. Análise Harmônica

Calcula a resposta em regime permanente sob carregamento senoidal, considerando amortecimento de Rayleigh (\(\mathbf{C} = \alpha\mathbf{M} + \beta\mathbf{K}\)):

\[\mathbf{H}(\omega)\mathbf{U} = \mathbf{F}\]

Onde a matriz de impedância dinâmica \(\mathbf{H}(\omega)\) é:

\[\mathbf{H}(\omega) = [\mathbf{K}] - \omega^2[\mathbf{M}] + i\omega[\mathbf{C}]\]

Definição de Carregamento

O carregamento é armazenado internamente em um dicionário nodal_loads, onde a chave representa o índice do Grau de Liberdade e o valor representa a magnitude da força aplicada. Isso permite a aplicação de múltiplas forças em diferentes nós e direções de forma cumulativa.

Métodos Principais

  • apply_boundary_condition(node_id, direction): Restringe o deslocamento de um nó específico nas direções 'X', 'Y' ou 'Z', atualizando a lista de condições de contorno do sistema.
  • apply_load(node_id, direction, magnitude): Aplica uma força (para análise harmônica) em um nó e direção específicos. Se múltiplas cargas forem aplicadas ao mesmo GDL, suas magnitudes são somadas.
  • assemble_stiffness() e assemble_mass(): Percorrem todos os elementos para construir as matrizes globais de rigidez (\(\mathbf{K}\)) e massa (\(\mathbf{M}\)), aplicando as partições referentes aos GDLs livres.
  • solve_modal_analysis(num_modes): Resolve o problema de autovalor generalizado \(([\mathbf{K}] - \omega^2[\mathbf{M}])\{\phi\} = \{0\}\) utilizando scipy.sparse.linalg.eigsh. Retorna as frequências naturais em Hz e os autovetores normalizados.
  • solve_harmonic_analysis(freq_range, alpha, beta): Realiza uma varredura de frequências para calcular a resposta em regime permanente, utilizando a matriz de impedância dinâmica complexa \(\mathbf{H}(\omega) = [\mathbf{K}] - \omega^2[\mathbf{M}] + i\omega[\mathbf{C}]\). O amortecimento \([\mathbf{C}]\) segue o modelo de Rayleigh.