Last active
October 5, 2019 04:39
-
-
Save soypat/a923d1f0fc7fe7c49028883f8df617ac to your computer and use it in GitHub Desktop.
Finite-element-analysis node-variable bandplot for non-shell elements.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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