17.06.2015 Views

Utilizando o gmsh para gerar malhas a partir do GNUOctave - Unesp

Utilizando o gmsh para gerar malhas a partir do GNUOctave - Unesp

Utilizando o gmsh para gerar malhas a partir do GNUOctave - Unesp

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> <strong>para</strong> <strong>gerar</strong> <strong>malhas</strong> a <strong>partir</strong><br />

<strong>do</strong> GNU­Octave<br />

Prof. Vicente Luiz Scalon<br />

Disciplina: Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>-Térmica<br />

Curso: Engenharia Mecânica<br />

Faculdade de Engenharia/UNESP – Campus de Bauru<br />

Conteú<strong>do</strong><br />

Desenhan<strong>do</strong> a geometria.......................................................................................................................3<br />

<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> a <strong>partir</strong> <strong>do</strong> Gnu-Octave...........................................................................................4<br />

APÊNDICE – Código <strong>do</strong> Octave.........................................................................................................6<br />

Programa Principal...............................................................................................................................6<br />

Funções utilizadas no código principal................................................................................................9<br />

Arquivo de geometria <strong>para</strong> o <strong>gmsh</strong> (exemplo.geo)............................................................................11<br />

Bauru/2012


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 2<br />

Desenhan<strong>do</strong> a geometria<br />

A geometria pode ser desenhada diretamente no <strong>gmsh</strong> ou montada através de um arquivo<br />

texto. Serão apresenta<strong>do</strong>s nesta referência apenas os coman<strong>do</strong>s básicos. Outros coman<strong>do</strong>s existem<br />

e, caso seja necessário, podem ser consulta<strong>do</strong>s em bibliografia complementar. Lembre-se que a<br />

geometria deve ser montada na seguinte ordem:<br />

• pontos:<br />

• linhas:<br />

• usan<strong>do</strong> coman<strong>do</strong>:<br />

Point (num_ponto) = {coordenada_x, coordenada_y, coordenada_z, 0.1};<br />

• usan<strong>do</strong> o coman<strong>do</strong> <strong>para</strong> criar linhas entre <strong>do</strong>is pontos:<br />

Line(num_linha) = {ponto_1, ponto_2};<br />

• usan<strong>do</strong> o coman<strong>do</strong> <strong>para</strong> criar spline em multipos pontos:<br />

Catmullrom(num_linha) = {ponto_1, ponto_2,...,ponto_n};<br />

• criar um arco de círculo com centro defini<strong>do</strong> no ponto 2 e final alinha<strong>do</strong> ao ponto 3:<br />

Circle(num_linha) = {ponto_1, ponto_2, ponto_3};<br />

• superfícies (se geometria 2D/3D)<br />

• a <strong>partir</strong> <strong>do</strong>s pontos, linhas e arcos defini<strong>do</strong>s anteriormente é possível determinar as<br />

superfícies que formaram os volumes ou que serão simuladas. Para isto pode se<br />

utilizar o coman<strong>do</strong>:<br />

Plane Surface(num_sup) = {linha_1, linha_2, …., linha_n}<br />

• o agrupamento de linhas também podem ser feitos anteriormente. Passan<strong>do</strong> à<br />

superfície já a sequência de linhas:<br />

Line Loop(num_ll) = {linha_1, linha_2, …., linha_n}<br />

e depois:<br />

Plane Surface(num_sup) = {num_ll}<br />

• em ambos os casos, o valor negativo, indica que na composição da superfície a linha<br />

deve ser considerada no senti<strong>do</strong> inverso ao defini<strong>do</strong> na linha;<br />

• volumes (se geometria3D)<br />

• o coman<strong>do</strong> permite a criação de de um volume diretamente de superfície ou a <strong>partir</strong><br />

de um Surface Loop(utiliza<strong>do</strong> de forma análoga ao Line Loop) ou diretamente pela<br />

sequencia de superfície<br />

Volume(num_vol) = {sup_1, sup_2, …., sup_n} ou {sup_ll}<br />

• o volume também pode ser obti<strong>do</strong> através da extrusão de uma determinada superfície<br />

na direção de um vetor vx, vy e vz através <strong>do</strong> coman<strong>do</strong>:<br />

Extrude(num_vol) = {vx, vy, vz} {sup_ll}<br />

Além disto, as condições de contorno podem ser comuns a um determina<strong>do</strong> número de<br />

linhas e superfícies. Este conjunto pode ser agrupa<strong>do</strong> pelos coman<strong>do</strong>s Physical e denomina<strong>do</strong>s por<br />

um novo número o um nome. A utilização <strong>do</strong> nome permite, até mesmo, a exportação <strong>do</strong>s da<strong>do</strong>s<br />

<strong>para</strong> outros programas típicos de solução como Open Foam, Calculix, etc. Dependen<strong>do</strong> <strong>do</strong><br />

agrupamento a ser feito o coman<strong>do</strong> utiliza<strong>do</strong> é diferente:<br />

• Physical Line (num_linha_física ou “nome”)={linha_1, linha_2, …., linha_n}<br />

• Physical Surface (num_sup_física ou “nome”)={sup_1, sup_2, …., sup_n}


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 3<br />

Com esta sequência de coman<strong>do</strong>s é possível implementar uma grande quantidade de<br />

geometrias. Desenhada a geometria, a construção de <strong>malhas</strong>, ajustes devi<strong>do</strong>s e a integração entre<br />

diferentes <strong>malhas</strong> podem ser realizadas e exportadas pela interface gráfica. Para maiores detalhes, a<br />

página de desenvolvimento <strong>do</strong> software http://geuz.org/<strong>gmsh</strong>/ deve ser consultada.<br />

<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> a <strong>partir</strong> <strong>do</strong> Gnu-Octave<br />

Existem pacotes que realizam a integração da geometria, <strong>gmsh</strong> e importam automaticamente<br />

<strong>para</strong> o GNU-Octave a malha gerada. Normalmente, eles executam o <strong>gmsh</strong> e automaticamente e<br />

importam o arquivo resultante com os pontos nodais, conectividade entre os elementos e<br />

composição das superfícies <strong>para</strong> imposição das condições de contorno.<br />

O pacote é capaz de importar apenas as <strong>malhas</strong> não estruturadas geradas pelo <strong>gmsh</strong>. O<br />

próprio pacote tem um gera<strong>do</strong>s de <strong>malhas</strong> estruturadas de elementos triangulares. Será apresenta<strong>do</strong><br />

a seguir uma breve descrição <strong>do</strong>s principais coman<strong>do</strong> <strong>do</strong> pacote msh.<br />

O coman<strong>do</strong> utiliza<strong>do</strong> <strong>para</strong> executar o gmesh com um determina<strong>do</strong> arquivo.geo , já definin<strong>do</strong><br />

a escala de importação(scale) e o tamanho <strong>do</strong>s elementos(clscale) é da<strong>do</strong> por e armazenar os<br />

resulta<strong>do</strong>s numa variável estruturada imesh :<br />

[imesh] = msh2m_<strong>gmsh</strong> ("arquivo","scale",1,"clscale",0.25);<br />

A variável estruturada imesh possui três componentes:<br />

• .p => pontos nodais com as coordenadas x na 1ª linha e y na 2ª linha;<br />

• .t => tabela de conectividade em linha com o número <strong>do</strong>s três nós que compõem o elemento<br />

nas três primeiras linhas e com o número da superfície associada a esta malha na 4ª;<br />

• .e => representa as superfícies <strong>do</strong>s contornos estabeleci<strong>do</strong>s e representa<strong>do</strong> por um vetor de 7<br />

linhas. As 2 primeiras representam nó inicial e nó final, a 5ª linha representa o número da<br />

linha na qual os pontos estão posiciona<strong>do</strong>s e a 6ª linha representa o tipo de elemento no qual<br />

o contorno está estabeleci<strong>do</strong>.<br />

Desta maneira a variável estabelecida possui todas as informações necessárias <strong>para</strong> a<br />

solução <strong>do</strong> problema em elementos finitos. Existe um outro pacote que permite a visualização da<br />

malha gerada, mas o pacote fpl, permite a visualização da malha com o coman<strong>do</strong> pdemesh. Para<br />

usar o coman<strong>do</strong> com a malha gerada anteriormente pelo <strong>gmsh</strong>, pode-se utilizar o seguinte coman<strong>do</strong>:<br />

pdemesh(imesh.p, imesh.e, imesh.t)<br />

A malha é apresentada numa figura. Ela é apresentada na forma tridimensional. Caso desejese<br />

uma vista de topo, pode-se utilizar o coman<strong>do</strong>: view(2). A malha resultante seria mostrada na<br />

forma apresentada na figura 1.<br />

A <strong>partir</strong> da malha foram inseridas as condições de contorno nas superfícies. Para isto, foram<br />

extraídas da variável .e, os pontos, o número da superfície e o tipo de elemento. Com estes da<strong>do</strong>s e<br />

saben<strong>do</strong> que as superfícies 1, 2, 3 e 4 são as representadas no gmesh, foram incluídas as condições<br />

generalizadas da superfície. Para tanto foi utilizada a condição generalizada que pressupõe:<br />

∂T<br />

∂⃗n =α c⋅T +β c


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 4<br />

Figura 1: Malha gerada e transferida ao GNU-Octave.<br />

Lembran<strong>do</strong> que as condições de contorno <strong>do</strong> problema são:<br />

• Face esquerda e superior (1 e 2) – Condição de temperatura de superfície:<br />

usa-se o esquema de convecção reduzin<strong>do</strong> ao máximo a resistência térmica:<br />

α c =−10 6 β c =10 6 ×T ∞ =500×10 6<br />

• Face direita (3) – Condição de simetria (condição natural)<br />

É a condição natural, automaticamente implementada.<br />

α c<br />

=0 β c<br />

=0<br />

• Face inferior (4) - Condição de convecção<br />

α t =− h k =−100<br />

β t= h⋅T ∞<br />

=100×300<br />

k<br />

Com os valores <strong>do</strong>s parâmetros nas fronteiras conhecidas, os mesmos são são<br />

implementa<strong>do</strong>s e montadas as matrizes de condição e de carga. Posteriormente, associadas à matriz<br />

global elementar utilizada <strong>para</strong> cálculo das temperaturas<br />

Aplicadas as condições de contorno são calculadas as matrizes elementar e global e matriz<br />

de condições de contorno relacionadas aos da<strong>do</strong>s da malha. A <strong>partir</strong> delas, obtém-se a solução <strong>do</strong><br />

sistema de equações e o mesmo e o perfil de temperaturasé armazena<strong>do</strong> em um vetor Temp. O<br />

resulta<strong>do</strong> <strong>do</strong> perfil de temperaturas plota<strong>do</strong> pelo coman<strong>do</strong>:<br />

hh=pdesurf(mesh.p, mesh.t, Temp);<br />

e o gráfico resultante está mostra<strong>do</strong> na figura 2.


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 5<br />

Figura 2: Distribuição de temperaturas no problema considera<strong>do</strong><br />

APÊNDICE – Código <strong>do</strong> Octave<br />

Programa Principal<br />

% Exemplo resolvi<strong>do</strong> utilizan<strong>do</strong> geração de malha via <strong>gmsh</strong><br />

% Met. Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>­Térmica<br />

% Atualiza<strong>do</strong> em 07/11/2012<br />

pkg load fpl msh % pkg load all ­> carrega to<strong>do</strong>s os pacotes disponiveis<br />

% importanto a malha gerada pelo <strong>gmsh</strong> <strong>do</strong> arquivo problema.geo<br />

[mesh] = msh2m_<strong>gmsh</strong> ("problema","scale",1,"clscale",0.25);<br />

% Mostran<strong>do</strong> a malha<br />

pdemesh (mesh.p, mesh.e, mesh.t);<br />

view (2);<br />

% Estrain<strong>do</strong> os valores <strong>do</strong> structure <strong>para</strong> matriz<br />

% apenas por comodidade<br />

% Valores nodais<br />

nodal = mesh.p([1 2],:).';<br />

%Conectividade<br />

conec = mesh.t';<br />

% Determinan<strong>do</strong> superficies<br />

lsuper=unique(mesh.e(5,:)); % lista de supefícies presentes


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 6<br />

ns=length(lsuper); %numero de superficies<br />

% cc ­> n_superf cord_i coord_f<br />

cc=zeros(length(mesh.e(5,:)),5);<br />

cc(:,1:4) = mesh.e([5 1 2 6],:)';<br />

for i=1:length(cc)<br />

cc(i,5)=distpoint(nodal(cc(i,2:3),:));<br />

end<br />

% Montagem da matriz elementar<br />

MM = matglobal(nodal, conec);<br />

% Condições de contorno<br />

ncon=length(lsuper);<br />

alfac=zeros(1,lsuper);<br />

betac=alfac;<br />

% Condição de contorno de temperatura definda<br />

% Superfícies 1 e 2<br />

alfac(lsuper(1:2))=­1e6;<br />

betac(lsuper(1:2))=500e6;<br />

% Superficie 3<br />

% Condição natural<br />

% Não precisa implementar nada<br />

% Superficie 4<br />

alfac(lsuper(4))=­100;cc<br />

betac(lsuper(4))=100*300;<br />

% Matriz de condições de contorno<br />

[MC Bt] = matcond(cc, alfac, betac, nodal);<br />

% Calculo das temperaturas no nos<br />

Temp=(MM­MC) \ Bt;<br />

% Calculo <strong>do</strong>s fluxos de calor nos pontos de superfície<br />

qs=MC*Temp+Bt;


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 7<br />

% Caracterizan<strong>do</strong> a superficie e se<strong>para</strong>n<strong>do</strong> os nós que a compoe<br />

for i=1:ns<br />

% Determinan<strong>do</strong> posições no CC associadas a superf. i<br />

noscc_i=find(cc(:,1)==lsuper(i));<br />

% capturan<strong>do</strong> o numero <strong>do</strong>s nós de cada superfície<br />

surf(i).ps=unique(cc(noscc_i,2:3));<br />

qt(i)=sum(qs(surf(i).ps));<br />

printf("Fluxo de calor na superfície %i: qt = %5.1f\n",lsuper(i),<br />

qt(i));<br />

surf(i).lo(1,:)=[cc(surf(i).ps(1),2) 0];<br />

xp=0;<br />

for j=1:length(surf(i).ps)<br />

end<br />

xp+=cc(surf(i).ps(j),5);<br />

surf(i).lo(j+1,:)=[cc(surf(i).ps(j),3) xp];<br />

end<br />

% Lista de nos na superfície<br />

surf(i).nos=unique(cc(surf(i).ps,2:3));<br />

% Coordenadas <strong>do</strong>s nós na ordem anterior<br />

surf(i).solu=nodal(surf(i).nos,:);<br />

% Plotan<strong>do</strong> troca de calor pelas superfícies:<br />

qs1=sort([nodal(surf(1).ps,2), qs(surf(1).ps)]); %varian<strong>do</strong> em y<br />

qs2=sort([nodal(surf(2).ps,1), qs(surf(2).ps)]) %varian<strong>do</strong> em x<br />

qs4=sort([nodal(surf(4).ps,1), qs(surf(4).ps)]); %varian<strong>do</strong> em x<br />

plot(qs1(:,1), qs1(:,2), qs2(:,1), qs2(:,2), qs4(:,1), qs4(:,2));<br />

legend("Face esquerda", "Face superior", "Face inferior");<br />

xlabel("Coordenada")<br />

ylabel("Energia Transferida[W]")<br />

%Plotan<strong>do</strong> temperaturas na superfície<br />

figure(2);<br />

temps=plot(surf(3).lo(:,2), Temp(surf(3).lo(:,1)), "­k", surf(4).lo(:,2),<br />

Temp(surf(4).lo(:,1)), "­r");<br />

legend("Superficie Isolada","Superficie com Conveccao");<br />

xlabel("Coordenada")<br />

ylabel("Temperatura[°C]")<br />

%Superfície representan<strong>do</strong> comportamento das temperaturas<br />

figure(3)


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 8<br />

hh=pdesurf(mesh.p, mesh.t, Temp);<br />

view (3);<br />

view(45,30);<br />

axis([0 0.5 0 1 200 500]);<br />

% Exportanto resulta<strong>do</strong>s no <strong>para</strong>view<br />

% Maiores detalhes sobre uso <strong>do</strong> <strong>para</strong>view consulte<br />

fpl_vtk_write_field("saida", mesh, {Temp, "temperature"}, {},1)<br />

Funções utilizadas no código principal<br />

Montagem da matriz global<br />

% Exemplo resolvi<strong>do</strong> utilizan<strong>do</strong> geração de malha via <strong>gmsh</strong><br />

% Met. Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>­Térmica<br />

% Atualiza<strong>do</strong> em 07/11/2012<br />

%Funcao <strong>para</strong> montagem da matriz global de condução<br />

% de elementos triangulares<br />

function A=matglobal(nos, elem)<br />

Bxi=[1 0 ­1; 0 1 ­1];<br />

nelem=length(elem);<br />

A=zeros(length(nos));<br />

for i=1:nelem<br />

vetl=elem(i,1:3); % nos que compoe elemento<br />

Jac=Bxi*nos(vetl,:); % Jacobiano<br />

Bxy=inv(Jac)*Bxi; % Matriz B<br />

mel=Bxy'*Bxy*det(Jac)/2; % Matriz elementar integrada (x3/6)<br />

A(vetl,vetl) += mel; % Posicionan<strong>do</strong> matriz elementar na global<br />

end<br />

end<br />

Implementação das condições de contorno (matcond.m)<br />

% Exemplo resolvi<strong>do</strong> utilizan<strong>do</strong> geração de malha via <strong>gmsh</strong><br />

% Met. Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>­Térmica<br />

% Atualiza<strong>do</strong> em 07/11/2012<br />

%Funcao <strong>para</strong> montagem da matriz de condições de contorno<br />

% sobre as linhas de superfície<br />

% ­­­­­­­­­­­­ Parametros de Entrada e saida ­­­­­­­­­­­­­­­­­­­­­­­­­<br />

% A : matriz principal (que multiplica Tempsraturas)<br />

% B : matriz Independente (Termo independente)


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 9<br />

% conds: matriz de condição de contorna da forma<br />

% num_da_superficie no_inicial no_final tipo_elem dist_nos<br />

% a : vetor <strong>do</strong>s valores de alfa_c <strong>para</strong> todas as superficies (por numero)<br />

% b : vetor <strong>do</strong>s valores de beta_c <strong>para</strong> todas as superficies (por numero)<br />

% nos : coordenadas nodais<br />

function [A B]=matcond(conds, a, b, nos)<br />

A=zeros(length(nos));<br />

B=zeros(length(nos),1);<br />

ncc=length(conds);<br />

for i=1:ncc<br />

j=conds(i,1);<br />

vetc=conds(i,2:3);<br />

%numero <strong>do</strong>s nos que compoe a linha<br />

[ma mb]=calcint(nos(vetc,:)); % int num: ma=∫ T dx, mb=∫ dx<br />

A(vetc,vetc) += ma*a(j); % montagem das matrizes globais de<br />

B(vetc) += mb*b(j); % contorno: A e B<br />

end<br />

end<br />

Função que resolve a integral sobre uma linha (calcint.m)<br />

% Exemplo resolvi<strong>do</strong> utilizan<strong>do</strong> geração de malha via <strong>gmsh</strong><br />

% Met. Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>­Térmica<br />

% Atualiza<strong>do</strong> em 07/11/2012<br />

%Funcao integraçao numerica das condições de contorno<br />

% usan<strong>do</strong> uma aproximação 1D (linha)<br />

function [ml mb]=calcint(xy);<br />

% Calculan<strong>do</strong> 3 pontos <strong>para</strong> a quadratura<br />

% Consideran<strong>do</strong> a função da linha [xi (1­xi)]<br />

Bxi=[1 ­1];<br />

% Converten<strong>do</strong> <strong>para</strong> linear ­ Calculan<strong>do</strong> reta<br />

ll=distpoint(xy);<br />

jac=Bxi*[0 ll]';<br />

Bx=inv(jac)*Bxi;<br />

% Integral da função<br />

ff=inline("[x (1­x)]");<br />

% Usan<strong>do</strong> o méto<strong>do</strong> de simpson <strong>para</strong> integração<br />

ml=1/6*(ff(0)'*ff(0)+4*ff(0.5)'*ff(0.5)+ff(1)'*ff(1))*det(jac);<br />

mb=1/6*(ff(0)+4*ff(0.5)+ff(1))'*det(jac);<br />

end


<strong>Utilizan<strong>do</strong></strong> o <strong>gmsh</strong> no GNU-Octave pg. 10<br />

Função que calcula a distância entre <strong>do</strong>is pontos cartesianos (distpoint.m)<br />

% Exemplo resolvi<strong>do</strong> utilizan<strong>do</strong> geração de malha via <strong>gmsh</strong><br />

% Met. Elem. Finitos Aplica<strong>do</strong>s a Flui<strong>do</strong>­Térmica<br />

% Atualiza<strong>do</strong> em 07/11/2012<br />

%Funcao <strong>para</strong> calculo <strong>do</strong> comprimento da linha<br />

% (distancia entre <strong>do</strong>is pontos cartesianos)<br />

function dd=distpoint(mt)<br />

x=1; %posicao da coordenada x no vetor<br />

y=2; % posicao da coordenada y no vetor<br />

dd=sqrt((mt(1,x)­mt(2,x))^2+(mt(1,y)­mt(2,y))^2);<br />

end<br />

Arquivo de geometria <strong>para</strong> o <strong>gmsh</strong> (exemplo.geo)<br />

Point (1) = {0, 0, 0, 0.1};<br />

Point (2) = {0, 1, 0, 0.1};<br />

Point (3) = {0.5, 1, 0, 0.1};<br />

Point (4) = {0.5, 0, 0, 0.1};<br />

Line (1) = {1, 2};<br />

Line (2) = {2, 3};<br />

Line (3) = {3,4};<br />

Line (4) = {1,4};<br />

Line Loop(5) = {1, 2, 3, ­4};<br />

Plane Surface(1) = {5};<br />

Referências<br />

• Manual <strong>do</strong> Gmsh 2.6, disponível em http://geuz.org/<strong>gmsh</strong>/<strong>do</strong>c/texinfo/<strong>gmsh</strong>.html,<br />

consulta<strong>do</strong> em 17/10/2012.<br />

• Octave-Forge - Extra packages for GNU Octave, principalmente a <strong>do</strong>cumentação <strong>do</strong>s<br />

pacotes fpl e msh, disponível em http://octave.sourceforge.net/, consulta<strong>do</strong> em 17/10/2012.<br />

• Scalon, V.L., Apostila de Méto<strong>do</strong> <strong>do</strong>s Elementos Finitos Aplica<strong>do</strong>s à Flui<strong>do</strong>-Térmica,<br />

disponível em http://wwwp.feb.unesp.br/scalon/numerica.html, consulta<strong>do</strong> em 01/10/2012.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!