Vous êtes sur la page 1sur 4

% FEM2D mtodo de elementos finitos bidimensionales para laplacianos.

%
% FEM2D resuelve la ecuacin de Laplace
% - div(grad(u)) = f in Omega
% U = u_D en el lmite de Dirichlet
% d/dn u = g en el lmite de Neumann
% Sobre una geometria descrita por triangulos y paralelogramos
% respectivamente
% y presenta la solucin grficamente.
%
% Por lo tanto, FEM2D ensambla los elementos finitos planos de Courant
y calcula
% un lado derecho discreto como el vector de coeficientes de la
aproximacin
% del elemento afn. La fuerza de volumen y los datos de lmites se
dan como
% archivos <f.m>, <g.m>, and <u_d>. FEM2D utiliza el sistema ineal
reducido
% de ecuaciones para calcular una solucin discreta del problema de
Laplace.
% La aproximacin affine resultante resultante ser representada
grficamente.
%
% FEM2D carga los datos de malla de los archivos de datos. El programa
lee los
% elementos triangulares del archivo <elements3.dat>. Dependiendo de
la malla,
% se puede omitir uno de los dos archivos, pero no ambos. La primera
columna
% en <elementos3.dat> da el nmero de cada elemento. Esto se utiliza
para la
% claridad y no es necesario para el algoritmo numrico. Las columnas
siguientes
% dan el nmero de cada nodo. Los nodos de los elementos se cuentan en
el sentido
% contrario a las agujas del reloj.
%
% Para adaptar el programa a una determinada ecuacin de Laplace, el
usuario debe
% especificar los archivos de datos <coordenadas.dat>,
<elementos3.dat> y / o
% <elementos4.dat>, <dirichlet.dat> y <neumann.dat > (Opcional) y los
archivos M <fm>,
% <u_d.m> y <gm> (opcional). Tienen que estar en el mismo directorio
que <fem2d.m>.
%
% Remark: This program is a supplement to the paper "Remarks around
% 50 lines of Matlab: Short finite element implementation" by
% J. Alberty, C. Carstensen and S. A. Funken. The reader should
% consult that paper for more information.
%
%
% M-files you need to run FEM2D
% <stima3.m>, <stima4.m>, <f.m>, <u_d.m>, <show.m> and <g.m>
(optional)
%
% Data-files you need to run FEM2D
% <coordinates.dat>, <elements3.dat> and/or <elements4.dat>,
% <dirichlet.dat>, and <neumann.dat> (optional)

% J. Alberty, C. Carstensen and S. A. Funken 02-11-99


% File <fem2d.m> in $(HOME)/acf/fem2d/
% This program and corresponding data-files give Fig. 3 in
% "Remarks around 50 lines of Matlab: Short finite element
% implementation"

% Carga de la geometra de la malla e inicializacin.


load coordinates.dat; coordinates(:,1)=[];
%contiene las coordenadas de cada nodo en la malla dada
eval('load elements3.dat; elements3(:,1)=[];','elements3=[];');
%contiene para cada tringulo los nmeros de nodos de los vrtices.
eval('load neumann.dat; neumann(:,1) = [];','neumann=[];');
%contienen en cada fila los dos nmeros de nodo que unen el borde
load dirichlet.dat; dirichlet(:,1) = [];
%correspondiente en el lmite.
FreeNodes=setdiff(1:size(coordinates,1),unique(dirichlet));
%setdiff: devuelve los valores en 1:size(coordinates,1) que no estn en
unique(dirichlet)
%sin
repeticiones. Unique: mismos valores que en dirichlet sin repeticiones
A = sparse(size(coordinates,1),size(coordinates,1)); %Matriz
para ahorrar espacio del tamao de coordinatesxcoordinates
b = sparse(size(coordinates,1),1); %Matriz
para ahorrar espacio del tamao de coordinatesx1

% Montaje de la matriz de rigidez en un bucle sobre los


% elementos triangulares.
for j = 1:size(elements3,1)
A(elements3(j,:),elements3(j,:)) = A(elements3(j,:),elements3(j,:)) ...
+ stima3(coordinates(elements3(j,:),:));
end

% Incorporar la fuerza de volumen en un bucles sobre los elementos


% triangulares.
for j = 1:size(elements3,1)
b(elements3(j,:)) = b(elements3(j,:)) + ...
det([1,1,1; coordinates(elements3(j,:),:)']) * ...
f(sum(coordinates(elements3(j,:),:))/3)/6;
end

% Incorporacin de la condicin de Neumann.


for j = 1 : size(neumann,1)
b(neumann(j,:))=b(neumann(j,:)) + norm(coordinates(neumann(j,1),:)- ...
coordinates(neumann(j,2),:)) *
g(sum(coordinates(neumann(j,:),:))/2)/2;
end

% Incorporacin de la condicin de Dirichlet


u = sparse(size(coordinates,1),1);
u(unique(dirichlet)) = u_d(coordinates(unique(dirichlet),:));
b = b - A * u;

% Resolucin del sistema lineal reducido.


u(FreeNodes) = A(FreeNodes,FreeNodes) \ b(FreeNodes);

% Representacin grfica de la solucin numrica


show(elements3,elements4,coordinates,full(u)) %Superficie
triangular
trisurf(elements3,coordinates(:,1),coordinates(:,2),u',...
'facecolor','interp')
hold on
trisurf(elements4,coordinates(:,1),coordinates(:,2),u',...
'facecolor','interp')
hold off
view(10,40);
title('Solucin del Problema')

function M = stima3(vertices)
%Calcula la matriz de rigidez del elemento para simplex.
%M = STIMA3 (X) calcula la matriz de rigidez del elemento para simplex,
%es decir, para tringulos en dos dimensiones (d = 2) y tetraedro en tres
%dimensiones (d = 3). Las coordenadas de los vrtices se almacenan en X.
%X tiene dimensin (d + 1) x d. En dos dimensiones, los vrtices estn
%numerados en el sentido contrario a las agujas del reloj. M tiene
dimensin
%(d + 1) x (d + 1). En tres dimensiones, los vrtices estn numerados en
t. Max (eig (M))> 0.
%
% This routine should not be modified.

% J. Alberty, C. Carstensen and S. A. Funken 02-11-99


% File <stima3.m> in $(HOME)/acf/fem2d/ and
% in $(HOME)/acf/fem3d/ and
% in $(HOME)/acf/fem2d_heat/

d = size(vertices,2); %dimensiones del elemento


%Momento de reflexion
G = [ones(1,d+1);vertices'] \ [zeros(1,d);eye(d)];
M = det([ones(1,d+1);vertices']) * G * G' / prod(1:d);

function VolumeForce = f(x);


% F Fuerza de volumen en el dominio considerado.
% Y = F (X) devuelve valores de fuerzas en N puntos discretos en el
% Dominio. Estos datos de entrada deben ser elegidos por el usuario. X
tiene una dimensin N
% X 2 e Y tiene una dimensin N x 1.
%
%
% See also FEM2D, U_D, and G.

% J. Alberty, C. Carstensen and S. A. Funken 02-11-99


% File <f.m> in $(HOME)/acf/fem2d/
% This volume force is used to compute Fig. 3 in
% "Remarks around 50 lines of Matlab: Short finite element
% implementation".

VolumeForce = ones(size(x,1),1);

Vous aimerez peut-être aussi