Baixe o app para aproveitar ainda mais
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.
Compartilhar