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:
- Saída: Frequências naturais em Hz e autovetores (formas modais) normalizados.
- Algoritmo: Utiliza
scipy.sparse.linalg.eigshcom 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}\)):
Onde a matriz de impedância dinâmica \(\mathbf{H}(\omega)\) é:
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()eassemble_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\}\) utilizandoscipy.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.