Buscar

UM CÓDIGO DE ANÁLISE DE ELEMENTOS FINITOS BASEADO NOS CONCEITOS DE ORIENTAÇÃO A OBJETOS

Prévia do material em texto

UM CÓDIGO DE ANÁLISE DE ELEMENTOS FINITOS BASEADO NOS 
CONCEITOS DE ORIENTAÇÃO A OBJETOS 
 
Fábio Gonçalves Teixeira 
fabiogt@ufrgs.br 
Programa de Pós-Graduação em Design da Universidade Federal do Rio Grande do Sul 
Osvaldo Aranha, 99/408, Porto Alegre, RS - Brasil 
 
 
Abstract. This paper presents a solution code for structural analysis, through the Finite 
Element Method (FEM), which was designed using the object-oriented programming (OOP) 
concepts. This programming paradigm allows to build codes with a great organization and it 
makes possible the development of robust algorithms and its maintenance become easy. The 
application of the OOP to the FEM becomes possible the development of flexible, modular 
and scalar codes. The inheritance concept allows creating Element families that have 
common characteristics in a natural way. The polymorphism is an important characteristic 
that improves the development process, therefore simplifies the interaction with the class 
methods. Thus, it is possible to call a function that calculates the stiffness matrix as if was an 
unique method, but each element class has its own methods, however it is transparent for the 
class user. The encapsulation presumes that the objects are self contained and its public 
interface is the set of their properties and methods. Thus the user of a class does not need to 
send extensive lists of parameters to get the results. All these characteristics of OOP had been 
applied to the FEM in their three stages of analysis: pre-analysis, solution of the equations 
system and stress computation. The result is a robust code with great potential of 
development for scientific applications and for didactic goals. Several examples were 
analyzed with the proposed code to show its efficiency. 
 
Keywords: Finite Element Method, Object-Oriented Programming 
 
 
1. INTRODUÇÃO 
 
 O desenvolvimento de novos produtos industriais não pode prescindir da pesquisa 
científica na área de análise de estrutural pelo método dos Elementos Finitos [1]. Esta é uma 
área de pesquisa importante, pois a evolução constante dos materiais e processos de 
fabricação exige uma evolução, no mínimo, equivalente dos processos de simulação 
numérica, categoria em que está o método dos elementos finitos. 
 A evolução dos sistemas de análise por elementos finitos envolve desde os sistemas de 
pré-processamento, para a modelagem e geração de dados, e pós-processamento, para a 
análise dos resultados, até o código de análise que pode ser tão ou mais complexa dependendo 
da complexidade da simulação numérica. Os códigos de análise, normalmente são 
desenvolvidos por centro de pesquisa e devem estar em constante evolução para permitir a 
rápida incorporação dos avanços tecnológicos, como novos tipos de análise e novos tipos de 
elementos. 
 Uma arquitetura robusta e flexível é fundamental para que um código de análise seja 
utilizado como plataforma para a pesquisa e o desenvolvimento. A programação orientada a 
objetos reúne conceitos que promovem a flexibilidade e a modularidade de um software. Tais 
características, como herança, polimorfismo e encapsula-mento permitem uma organização 
muito clara e objetiva das estruturas do código, ajustando-se perfeitamente às técnicas 
necessárias para a construção de um sistema de análise baseado em método dos elementos 
finitos. É neste contexto que se insere este trabalho. Trata-se do desenvolvimento de um 
código de análise que utiliza uma arquitetura orientada a objetos em todas as etapas de 
análise: pré-análise, solução e cálculo de tensões. Nesta etapa inicial, foram implementados os 
módulos básicos para a análise elástica linear com uma biblioteca mínima de elementos. Este 
artigo apresenta os principais conceitos da programação orientada a objetos e as aplicações e 
soluções adotadas no desenvolvimento de um código de análise de elementos finitos. 
 
2. PROGRAMAÇÃO ORIENTADA A OBJETOS 
 
 Nas técnicas de programação convencionais trabalha-se com uma organização 
procedural, onde as diversas ações do programa estão organizadas em blocos de programa 
chamados de procedimentos (funções, sub-programas). Este tipo de programação possui 
grandes limitações de flexibilidade e de escalabilidade tanto em tempo de projeto como em 
tempo de execução, dificultando a modificação e a adaptação dos códigos ao longo do tempo. 
Programas construídos desta forma sofrem pouca ou nenhuma evolução durante o seu ciclo de 
vida. Um bom exemplo disto foi o chamado bug do milênio, onde programas desenvolvidos 
nas décadas de 70 e 80 precisavam ter seus códigos refeitos no final da década de 90 em 
função do campo reservado ao ano ter apenas dois dígitos, gerando um problema de 
conseqüências potencialmente catastróficas em instituições financeiras e públicas em todo o 
mundo. 
 A programação orientada a objetos (POO) (Coad e Nicola, 1993) está fundamentada em 
um paradigma onde programas são componentes de software, os objetos, com suas relações e 
interações, em uma analogia ao mundo concreto. A análise e projeto na POO devem definir 
um conjunto de objetos, suas propriedades e relações, que modelam um determinado 
processo. O sistema atua através do relacionamento e da troca de mensagens entre os objetos. 
A seguir, são descritos os principais conceitos envolvidos na POO. 
 Classes – Os objetos são definidos por classes, as quais definem uma categoria de 
objetos, incluindo as suas propriedades ou atributos, métodos e as suas características ou 
estados em função dos seus atributos. Humanos é um exemplo de classe em uma analogia 
com o mundo concreto. Em um sistema de elementos finitos, muitos conceitos podem ser 
definidos como classes, por exemplo: Malhas, Elementos, Nós, Matriz de rigidez. 
 Objetos – São instâncias de uma classe com todas as características definidas na sua 
declaração. Objetos de uma mesma classe se diferenciam por suas propriedades e reagem a 
mensagens enviadas a ele e podem enviar mensagens a outros objetos. Em uma analogia 
concreta, cada pessoa é uma instância da classe Humanos, constituindo indivíduos com suas 
características distintas (atributos ou propriedades). Em um sistema de elementos finitos, cada 
elemento de uma malha pode ser considerado uma instância (objeto) de uma classe Elemento. 
 Atributos – Também chamados de propriedades, são as características definem o estado 
de um objeto. Em última análise, constituem a estrutura de dados que contém todas as 
informações de um objeto. Os atributos são definidos na Classe do objeto. Continuando com a 
analogia da espécie humana, os atributos de cada indivíduo podem ser: altura, peso, cor, 
nome, endereço,etc. Em uma malha de elementos finitos, cada elemento pode ter como 
atributos: o número de nós, as suas conectividades, o tipo do elemento, etc. 
 Métodos – Definem as ações que podem ser realizadas por um objeto e são função dos 
atributos destes, o que torna tais ações individuais. Falar, andar e correr são métodos de um 
indivíduo da classe Humanos, mas cada um fala, anda ou corre de uma forma única devido 
aos seus atributos como timbre de voz, sotaque, características físicas como peso, 
comprimento e massa das pernas, posição do centro de massa. O cálculo de área de um 
elemento ou mesmo de sua matriz de rigidez ou de massa podem constituir métodos em um 
sistema de elementos finitos. 
 Mensagens – Chamadas aos métodos de um objeto, possibilitando o relacionamento com 
e entre os objetos. 
 Herança – É uma das principais características da POO e permite definir sub-classes a 
partir de classes já definidas. As classes filhas herdam todas as características da classe mãe e 
novas funcionalidades (atributos e métodos) podem ser atribuídas à classe filha. Assim, é 
possível criar objetos derivados de outros sem a necessidade de reprogramar as características 
que são comuns. A classe Humanos é uma sub-classe da classe Mamíferos. Um elemento 
Triângulo é uma sub-classe da classe Elementos de Placa. Podem haver n níveis de derivação,o que resultaria em nxsub-classes herdeiras de uma determinada classe. 
 Polimorfismo – Também chamado de ligação tardia, permite que classes filhas de 
tenham métodos com mesmo nome e parâmetros, porém comportamentos distintos. Um 
exemplo prático seria uma classe Figuras_Planas e duas classes derivadas Círculo e 
Retângulo, todas com o método Área. Em um arranjo com vários objetos Figuras_Planas dos 
dois tipos poderiam ser feitas chamadas ao método Área (Ex: Figuras[i].Área) e o 
polimorfismo iria garantir que o método da classe específica fosse acionado. A ligação com o 
método específico é feita em tempo de execução em função do tipo de objeto, daí a expressão 
ligação tardia. O polimorfismo é um dos pilares da orientação a objetos e permite uma grande 
flexibilidade ao programador. 
 Encapsulamento – É a característica pela qual um objeto é auto-contido. Todas as 
variáveis de uma classe devem ter um escopo local e a atribuição se dá através de métodos e 
propriedades ditos públicos, os quais são denominados de interface pública da classe. Desta 
forma, é possível a um programador utilizar classes de objetos desenvolvidos por terceiros 
sem a necessidade do conhecimento das suas variáveis e procedimentos internos, apenas 
conhecendo a sua interface pública. Esta característica possibilita a distribuição de partes de 
códigos e o fácil reaproveitamento dos mesmos, seja pelo autor ou por outros usuários 
autorizados. 
 A orientação a objetos não pressupõe, necessáriamente, a existência de recursos 
específicos de uma linguagem de programação. No entanto, as modernas linguagens de 
programação (C++, Delphi, Java) possuem recursos que permitem explorar todo o potencial 
da POO no desenvolvimento de softwares robustos e flexíveis, proporcionando a sua 
evolução a partir do seu desenvolvimento contínuo. Além disso, a modularidade inerente dos 
programas concebidos a partir da POO facilita a manutenção e a documentação. 
 Uma abordagem de orientação a objetos exige uma análise criteriosa de todo o processo a 
ser modelado com o software. É necessário definir o domínio da aplicação para identificar 
todas as classes de objetos de forma hierárquica (super classes, classes derivadas) e as ações e 
relações correspondentes. 
 
3. O MÉTODO DOS ELEMENTOS FINITOS EM POO 
 
 O método dos elementos finitos (MEF) é uma técnica para a solução de um sistema de 
equações diferenciais parciais através da discretização dos domínios destas equações, o que é 
feito localmente sobre pequenas regiões de formas simples e arbitrárias [3]. Na análise 
estrutural, esta abordagem resulta em um sistema de equações do tipo 
 
KU=F (01) 
 
onde K é a matriz de rigidez global da estrutura (malha), U é o vetor de deslocamentos nodais 
e F é o vetor forças nodais. O código de análise consiste em três etapas distintas. A primeira 
etapa é a pré-análise, onde é calculada a matriz de rigidez global, a partir das contribuições de 
cada elemento da malha computada através da integração das funções de interpolação no 
domínio local, e a construção do vetor de forças nodais equivalentes a partir das cargas nodais 
e de elemento. A segunda etapa é a solução do sistema de equações, determinando-se, assim, 
os deslocamentos nodais (U). A terceira e última etapa consiste na computação das tensões 
em cada elemento a partir dos deslocamentos nodais. 
 O MEF apresenta uma série de características que remetem ao paradigma de orientação a 
objetos. A sua estrutura de dados, que é função da malha, já possui intrinsecamente uma 
organização de objetos. Os procedimentos e transformações envolvidos também se ajustam 
aos princípios de métodos e atributos de objetos. 
 Para construir um código de análise de elementos finitos em POO, é necessário 
identificar os principais objetos do domínio e as suas relações. O domínio, inicialmente, é a 
análise estática linear de estruturas. Em uma primeira etapa de projeto conceitual do sistema, 
é necessário identificar aqueles objetos que constituem a espinha dorsal do MEF e, em 
seguida, as principais relações e métodos destes objetos. O projeto conceitual do sistema 
consiste na estrutura hierárquica de classes que define as relações entre os principais objetos. 
Na etapa posterior de detalhamento do projeto, devem ser detalhados todos os objetos e 
métodos da estrutura principal, além de identificados e detalhados aqueles objetos, métodos e 
funções que atuam de forma complementar da estrutura principal do MEF. 
 
 Projeto Conceitual – Uma malha de elementos finitos em sua estrutura de dados contém 
todos os dados geométricos, topológicos, físicos, além de vínculos e cargas. Assim, optou-se 
por definir uma classe Malha que deve abrigar, além da estrutura de dados, todo o código de 
análise do MEF. Todos os outros objetos envolvidos serão atributos do objeto Malha. Outras 
classes que, naturalmente, devem ser definidas são: Nó, Elemento, Material, Restrições e 
Cargas, todas como atributos da classe Malha. A figura 1 apresenta uma ilustração da 
estrutura de classes definida durante a fase de projeto conceitual. 
 Além da estrutura de classes, também são definidos as propriedades e os métodos 
principais de cada classe com o objetivo de montar toda a cadeia de funcionamento do 
programa de acordo com o método dos elementos finitos. A seguir são descritas as principais 
classes, seus atributos e métodos em função de estrutura estabelecida. 
 Classe restrições – Esta classe define restrições de movimento em um nó, incluindo 
vínculos e deslocamentos prescritos. Suas propriedades são os deslocamentos (reais) nos n 
graus de liberdade do nó. 
 
Figura 1. Estrutura de classes do MEF. 
 
 Classe Nó – A classe Nó define um nó da malha de elementos finitos. As propriedades 
desta classe são: o número de identificação do nó, ID (inteiro), as coordenadas x, y e z (reais) 
e as restrições que é um objeto da classe Restrições. Esta é uma classe que não possui 
derivações. 
 Classe Cargaelemento – é a classe que define cargas de elemento superficiais. Os 
atributos desta classe são: o número ID (inteiro), direção (inteiro), valor (real). A direção pode 
ser uma das três direções ou normal à superfície. 
 Classe Material – Esta classe define o material de um elemento e contém como 
propriedades as constantes físicas do material, incluindo peso específico, módulos de 
elasticidade longitudinal e transversal, constante de dilatação térmica (todos reais), além do 
ID (inteiro). 
 Classe Geometria – Contém as propriedades geométricas de um elemento. Esta classe 
tem utilidade para elementos de barra, de estruturas reticuladas, e para elementos finitos que 
possuem espessura (placas, cascas, estados plano de tensões ou deformações). 
 Classe Elemento – Esta é a super-classe da qual derivam todos os tipos de elementos 
finitos. Seus principais atributos são: o número de identificação (ID), um arranjo de nós 
(classe Nó), material (classe Material), propriedades geométricas (classe Geometria), cargas 
de elemento (classe CargaElemento). Os métodos são todos abstratos: CalcRigidez (calcula a 
matriz de rigidez), CalcFNE (calcula as forças nodais equivalentes), CalcTensões (calcula as 
tensões/solicitações do elemento). Os métodos abstratos são implementados na classe 
derivada. Esta estrutura permite a rápida implementação de novos elementos, apenas 
definindo novas classes derivadas sem a necessidade de alterar as demais estruturas. 
 Classe Malha – A classe malha abriga toda a estrutura do programa e é fruto do 
relacionamento das demais classes. Suas principais propriedades são: lista de nós, lista de 
elementos, lista de geometrias, lista de materiais, lista de restrições e lista de cargas. Além 
destas, a matriz de rigidez global, as forças nodais equivalentes, os deslocamentos nodais e as 
tensões também constituem propriedades da malha. Estas, porém, são obtidas a partir de 
métodos específicos: CalcRigidezGlobal, CalcFNEGlobal, CalcDeslocamentos e 
CalcTensõesGlobal. 
 Solução – A solução doproblema de elementos finitos é realizada através dos métodos 
implementados na classe Malha. A classe CalcRigidezGlobal monta a matriz de rigidez global 
da malha varrendo a lista de Elementos os acionando, para cada elemento, o seu método 
específico CalcRigidez que fornece à malha a contribuição do elemento correspondente. Este 
é um caso típico de polimorfismo. A malha possui uma lista de elementos que podem ser de 
diferentes tipos e o método CalcRigidez está presente em todas as classes de elemento, mas 
com conteúdos distintos e a chamada é feita pelo método CalcRigidezGlobal que não sabe a 
priori o tipo de elemento, estabelecendo-se, assim, uma ligação tardia ao método específico 
do tipo de elemento em tempo de execução. Conforme o tipo de análise, o método 
CalcRigidez do elemento faz uma transformação de coordenadas do sistema local do 
elemento para o sistema global. 
 Após a montagem da matriz de rigidez global, é feita a montagem do vetor de forças 
nodais equivalentes através do método CalcFNEGlobal. Este método varre a lista de cargas 
nodais e acrescenta as contribuições correspondentes aos graus de liberdade afetados. Em 
seguida, é feita uma varredura na lista de elementos, chamando o método CalcFNE 
específico, o qual fornece a contribuição do elemento em função das cargas de elemento e 
peso próprio ao vetor de forças nodais equivalentes global. 
 As restrições nodais (vínculos) são aplicadas alterando-se, apropriadamente as linhas e 
colunas correspondentes aos graus de liberdade afetados. Finalmente, o método 
CalcDeslocamentos realiza a triangularização da matriz de rigidez aplicando a decomposição 
de Gauss em um esquema de semi-banda simultaneamente à matriz de rigidez e ao vetor de 
forças nodais equivalentes e, após, a retro-substituição resultando nos deslocamentos nodais. 
Com os deslocamentos nodais calculados, o método CalcTensõesGlobal aciona o método 
CalcTensões de cada elemento que utiliza os deslocamentos nodais e as matriz B e D [1] do 
elemento para calcular as tensões em nível de elemento. Posteriormente, são calculadas as 
tensões médias em cada nó da malha a partir das contribuições de todos os elementos 
incidentes no nó. 
 Com isto, o código de análise básico está concluído. Com o conjunto de classes e 
métodos criados, implementaram-se as três etapas de um código de análise (pré-análise, 
solução do sistema de equações e cálculo das tensões) em um único programa de forma 
organizada e escalável. 
 
 
4. IMPLEMENTAÇÃO E RESULTADOS 
 
 O código foi implementado em Delphi que fornece todo o suporte para uma programação 
orientada a objetos para trabalhar com um o T-CADE (Teixeira, 2003), um modelador e 
gerador de malha baseado em superfícies paramétricas e que também utiliza POO. Foram 
implementados, inicialmente, os elementos de barra, estado plano de tensões e placas DKT 
(Batoz at al.,1980), DKMT, DKQ, DKMQ (Katili, 1993a e 1993b). 
 Foram realizados testes para comparar a precisão dos resultados com códigos de análise 
existentes e os resultados foram satisfatórios. No entanto, ainda não foram realizados testes de 
performance, pois é necessário implementar algoritmos de reordenação nodal [8] para reduzir 
a memória de armazenamento e o tempo de processamento, uma vez que uma reordenação 
nodal apropriada reduz a largura da banda da matriz de rigidez. 
 
Figura 2 - Exemplo de peça analisada. 
 
 A figura 2 apresenta um exemplo de uma placa a ser analisada com o código proposto e 
com um código de referência, no caso o ANSYS1. Trata-se de uma placa retangular medindo 
15x10 unidades, com três furos, dois dos quais com 2 unidades de diâmetro e o maior com 6 
unidades de diâmetro. A espessura da placa é de uma unidade. A placa é engastada em dois 
lados adjacentes e, nos dois lados restantes, há uma carga distribuída com taxa de uma 
unidade. O exemplo foi analisado com o código proposto e com o ANSYS. A figura 3 
apresenta o resultado da análise com o ANSYS integrado ao Autodesk Inventor2 utilizando 
elementos sólidos hexaédricos. 
 
 
 
 
Figura 3. Exemplo analisado com o ANSYS. 
 
 
1 http://www.ansys.com. 
2 http://www.autodesk.com. 
 A figura 4 apresenta o mesmo exemplo analisado com o código proposto. Neste caso, 
foram utilizados elementos de placa triangulares, o DKMT [6]. 
 
 
Figura 4. Exemplo analisado com o código proposto. 
 
 É possível observar que os deslocamentos nodais são bastante semelhantes nas duas 
análises, apesar de terem sido usados tipos de elementos diferentes. O aspecto da imagem que 
revela a distribuição dos deslocamentos sobre a peça é praticamente idêntico. 
 
5. CONSIDERAÇÕES FINAIS 
 
 Foi introduzido um código de análise de elementos finitos totalmente projetado através 
do paradigma de orientação a objetos. O resultado é um código de análise robusto e, ao 
mesmo tempo, flexível e escalável, pois permite uma rápida modificação de partes do código, 
seja para manutenção ou ampliação do código. Além disto, é possível acrescentar novos 
elementos, apenas criando as classes específicas e observando a compatibilidade das 
interfaces públicas das classes que controlam o processo. 
 O código desenvolvido constitui uma plataforma para pesquisa e desenvolvimento de 
códigos de análise de elementos finitos. Em uma próxima etapa, será ampliada a biblioteca de 
elementos para incluir cascas e sólidos, além de recursos para análises não-lineares, grandes 
deformações e para a simulação de materiais compósitos. 
 
Agradecimentos 
 
 À FAPERGS (Fundação de Amparo à Pesquisa do Estado do Rio Grande do Sul) pelo 
apoio financeiro (Editais ARD e PROAPP 2004). 
Web site: www.vid.ufrgs.br 
 
REFERÊNCIAS 
 
Batoz, J. l., Bathe, K. J., Ho, L. W. A Study of Three-node Triangular Plate Bending Element. 
In: Int. J. Numerical Methods Engg, v. 15:12 (1980) pp. 1771 –1812 . 
Coad, P. e Nicola, J. Object-Oriented Programming. Pearson Education; 1 edition, 1993. 
Katili, I. A new discrete Kirchhoff–Mindlin element based on Mindlin–Reissner plate theory 
and assumed shear strain fields — part I: an extended DKT element for thick-plate 
bending analysis. In: Int. J. Numerical Methods Engg. V. 36:11 (1993a) pp. 1859–1883. 
Katili, I. A new discrete Kirchho–Mindlin element based on Mindlin–Reissner plate theory 
and assumed shear strain ÿelds—Part II: an extended DKQ element for thick-plate 
bending analysis. In: Int. J. Numerical Methods Engg, V.36 (1993b) pp. 1885–1908. 
Smith, I. M. e Griffiths, D. V. Programming the Finite Element Method. John Wiley & Sons, 
1998. 
Teixeira, F. G. Reordenação Nodal para Soluções do Tipo. Dissertação de Mestrado, 
PPGEC/UFRGS, Porto Alegre, 1991. 
Teixeira, F. G. Modelamento Paramétrico e Geração de Malha em Superfícies para 
Aplicações em Engenharia. Tese de Doutorado, PROMEC/ UFRGS, Porto Alegre, 2003. 
Zienkiewicz, O. C. e Taylor, R.L Finite Element Method:Volume 1, The Basis. 5th edition, 
Vol 1, Butterworth-Heinemann., 2000.

Continue navegando