Skip to content

Instantly share code, notes, and snippets.

@soypat
Last active October 5, 2019 04:39
Show Gist options
  • Save soypat/a923d1f0fc7fe7c49028883f8df617ac to your computer and use it in GitHub Desktop.
Save soypat/a923d1f0fc7fe7c49028883f8df617ac to your computer and use it in GitHub Desktop.
Finite-element-analysis node-variable bandplot for non-shell elements.
function bandplot2D3D(elementos,nodos,variable,graphArg)
% BANDPLOT2D3D Graficador de variables. CC-BY-NC-SA Patricio Whittingslow
% 2019.
% BANDPLOT2D3D(elementos,nodos,variable,graphArg)
%
% Típica numeración de los nodos de los elementos:
% 4---7---3
% | |
% 8 9 6
% | |
% 1---5---2
% Ejemplo dado Q9
%
% Acepta los elementos H20, H8, T10, T4, CST, LST, Q8/Q9, Q4
% con numeración de ADINA o del Cook
% elementos: Matriz de conectividades.
% nodos: Matriz de coordenadas nodales, 2D o 3D según tipo elemento
% variable: Matriz m x n con la variable a graficar, donde [m n] = size(elementos).
% graphArg: Vector opcional con información de como graficar.
% graphArg = [opacidadCaras, graficarNodos, graficarElementos, colorLinea]
%
% opacidadCaras: Valor entre 0 y 1. Por defecto es 0.5
% graficarNodos: 0 o 1. Numera los nodos.
% graficarElementos: 0 o 1. Numera los elementos. Usar con opacidad baja.
% colorLinea: 0 o 1. Color delimitador de elementos. 1 es negro. 0 es
% transparente.
[Nnod , Ndim]= size(nodos);
%% MODIFICAR SEGUN USO
lineColor='k'; % color de bordes de elemento, por defecto 'k' para negro. 'none' para ningun color
if Ndim==3
opacidadCaras=.5; % transparencia de caras de elementos. 1 es opaco
else
opacidadCaras=1; %Si es 2D no tiene sentido la transparencia a no ser que quieras numerar los elementos
end
nColores=10; % numero de colores graficados
graficarNodos = true; % grafica número de nodos
graficarElementos = true; %grafica número de elementos
%% Argumentos de grafico
if nargin>3
sizeGraphArg = size(graphArg);
if numel(sizeGraphArg)>=1 && sizeGraphArg(1)~=0
opacidadCaras = graphArg(1);
switch numel(graphArg)
case 2
graficarNodos = graphArg(2);
case {3,4}
graficarNodos = graphArg(2);
graficarElementos = graphArg(3);
if numel(graphArg)==4
if graphArg(4) == 1
lineColor='k';
else
lineColor='none';
end
end
end
end
end
%% Error check
isValidVariable = all(size(variable) == size(elementos));
if ~isValidVariable
error('size(elementos) debe ser igual a size(variable)')
end
%% Límites de variable graficado
tol = 1E-5;
lims = [min(min(variable)) max(max(variable))];
if diff(lims) < lims(2)*tol
lims = lims + [-1 1]*lims(2)*tol;
end
%% Elección de tipo de elemento a graficar
[Nelem, Nnodporelem] = size(elementos);
if Ndim==3
switch Nnodporelem
case {10} %CTETRA
vNod = [1 5 2 10 4 7;
1 5 2 8 3 6
1 6 3 9 4 7
2 10 4 9 3 8];
case {4} %T4 (LTETRA)
vNod = [1 2 4
1 2 3
1 3 4
2 4 3];
case {8} %H8
vNod = [1 2 3 4
1 2 6 5
2 6 7 3
1 5 8 4
5 6 7 8
4 3 7 8];
case {20} %CHEXA (H20)
vNod = [1 9 2 10 3 11 4 12
2 18 6 14 7 19 3 10
4 12 1 17 5 16 8 20
5 13 6 14 7 15 8 16
1 9 2 18 6 13 5 17
4 11 3 19 7 15 8 20];
otherwise
error('Elemento 3D desconocido.')
end
end
if Ndim == 2
switch Nnodporelem
case {3,4} % Caso lineales, CST y Q4
vNod = 1:Nnodporelem;
case {6} % LST
vNod = [1 4 2 5 3 6];
case {8,9} %Q8 y Q9
vNod = [1 5 2 6 3 7 4 8];
otherwise
warning('Elemento 2D desconocido.')
vNod = 1:Nnodporelem;
end
end
[Nfaces, Nvertex] = size(vNod);
%% Graficador de superficies optimizada
% Cada superficie la grafica solo una vez
faces = zeros(1,size(vNod,2));
skippedfaces=0;
for e = 1:Nelem
elenod = elementos(e,:);
for s = 1:Nfaces
supindex = elementos(e,vNod(s,:));
if ~sum(sum( sort(supindex)==faces,2 ) == Nvertex)==1
faces = [faces;sort(supindex)];
h = patch('Faces',vNod(s,:),'Vertices',nodos(elenod,:),'FaceVertexCData',variable(e,:)');
set(h,'FaceColor','interp','EdgeColor',lineColor,'CDataMapping','scaled');
alpha(h,opacidadCaras);
else
skippedfaces=skippedfaces+1;
end
end
if graficarElementos
xx = nodos(elenod,1);
yy = nodos(elenod,2);
if Ndim==2
text(mean(xx),mean(yy),num2str(e),'VerticalAlignment','bottom','Color','b','FontSize',8);
else
zz = nodos(elenod,3);
text(mean(xx),mean(yy),mean(zz),num2str(e),'VerticalAlignment','bottom','Color','b','FontSize',8);
end
end
end
%% Grafico nombre de nodos
if graficarNodos
for i = 1:Nnod
xx(i) = nodos(i,1);
yy(i) = nodos(i,2);
if Ndim ==2
text(xx(i),yy(i),num2str(i),'VerticalAlignment','bottom','Color','r','FontSize',8);
else
zz(i) = nodos(i,3);
text(xx(i),yy(i),zz(i),num2str(i),'VerticalAlignment','bottom','Color','r','FontSize',8);
end
end
end
% Acomodo escalas y demás
colormap(jet(nColores))
caxis(lims)
if nColores <= 20
nTicks = nColores;
else
nTicks = 20;
end
ticks = lims(1):((diff(lims))/nTicks):lims(2);
tickLabels = cell(size(ticks));
for iTick = 1:length(ticks)
tickLabels{iTick} = sprintf('%6.5E',ticks(iTick));
end
colorbar('YTick',ticks,'YTickLabel',tickLabels);
if Ndim==3
view(3)
end
if graficarNodos
xlabel('x');ylabel('y');zlabel('z');
else
set(gca,'XTick',[],'YTick',[],'ZTick',[],'XColor',[1 1 1],'YColor',[1 1 1],'ZColor',[1 1 1],'visible','on')
end
daspect([1 1 1])
box on
axis auto
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment