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
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> GNUOctave<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=(MMMC) \ 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 (1xi)]<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 (1x)]");<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.