Code covered by the BSD License  

Highlights from
FEM toolbox for solid mechanics

image thumbnail
from FEM toolbox for solid mechanics by Anton Zaicenco
The finite element toolbox for solid mechanics with GUI.

plot_modal_shape ( in_data, D, dof, NF)
function plot_modal_shape ( in_data, D, dof, NF) 

maxX=0; minX=0; maxY=0; minY=0; maxZ=0; minZ=0; labz=0;
if in_data.EL(1,2)==9
    dof_per_node = 3;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    labx = (maxX / 6); laby =  (maxY / 6);
    labx = min(labx,laby); laby = labx;
    SCz = labx*1.2;
    labz = SCz/2;

    max_D_z = max(abs(D(1:3:dof(1)))); 
    ND_d = in_data.ND;
    ND_d(:,4) = (D(1:3:dof(1))'./max_D_z)*0.5*SCz;
end;

if in_data.EL(1,2)==0 | in_data.EL(1,2)==1 | in_data.EL(1,2)==2
    n_dof_node = 3;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    labx = (maxX / 6); laby = (maxY / 6);
    labx = min([labx laby]); laby = labx;
    max_D_x = max(abs(D(1:n_dof_node:dof(1))));
    max_D_y = max(abs(D(2:n_dof_node:dof(1))));
    ND_d = in_data.ND;
    deN = max([max_D_x  max_D_y]);
    ND_d(:,2) = in_data.ND(:,2)+(D(1:n_dof_node:dof(1))'./deN)*.5*labx;
    ND_d(:,3) = in_data.ND(:,3)+(D(2:n_dof_node:dof(1))'./deN)*.5*laby;
end;
if in_data.EL(1,2)==4 | in_data.EL(1,2)==5 | in_data.EL(1,2)==51
    n_dof_node = 2;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    labx = (maxX / 12); laby = (maxY / 12);
     labx = min([labx laby]); laby = labx;
    max_D_x = max(abs(D(1:n_dof_node:dof(1))));
    max_D_y = max(abs(D(n_dof_node:n_dof_node:dof(1))));
    ND_d = in_data.ND;
    deN = max([max_D_x  max_D_y]);
    ND_d(:,2) = in_data.ND(:,2)+(D(1:n_dof_node:dof(1))'./deN)*1.5*labx;
    ND_d(:,3) = in_data.ND(:,3)+(D(n_dof_node:n_dof_node:dof(1))'./deN)*1.5*laby;
end;
if in_data.EL(1,2)==3
    n_dof_node = 6;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    maxZ = max(in_data.ND(:,4)); minZ = min(in_data.ND(:,4));
    labx = (maxX / 6); laby = (maxY / 6); labz = (maxZ / 6);
    labx = min([labx laby labz]); laby = labx;  labz=labx;
    max_D_x = max(abs(D(1:n_dof_node:dof(1))));
    max_D_y = max(abs(D(2:n_dof_node:dof(1))));
    max_D_z = max(abs(D(3:n_dof_node:dof(1))));
    ND_d = in_data.ND;
    deN = max([max_D_x  max_D_y  max_D_z]);
    ND_d(:,2) = in_data.ND(:,2)+(D(1:n_dof_node:dof(1))'./deN)*.5*labx;
    ND_d(:,3) = in_data.ND(:,3)+(D(2:n_dof_node:dof(1))'./deN)*.5*laby;
    ND_d(:,4) = in_data.ND(:,4)+(D(3:n_dof_node:dof(1))'./deN)*.5*labz;
end;
if in_data.EL(1,2)==31
    n_dof_node = 3;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    maxZ = max(in_data.ND(:,4)); minZ = min(in_data.ND(:,4));
    labx = (maxX / 6); laby = (maxY / 6); labz = (maxZ / 6);
    labx = min([labx laby labz]); laby = labx;  labz=labx;
    max_D_x = max(abs(D(1:n_dof_node:dof(1))));
    max_D_y = max(abs(D(2:n_dof_node:dof(1))));
    max_D_z = max(abs(D(3:n_dof_node:dof(1))));
    ND_d = in_data.ND;
    deN = max([max_D_x  max_D_y  max_D_z]);
    ND_d(:,2) = in_data.ND(:,2)+(D(1:n_dof_node:dof(1))'./deN)*.5*labx;
    ND_d(:,3) = in_data.ND(:,3)+(D(2:n_dof_node:dof(1))'./deN)*.5*laby;
    ND_d(:,4) = in_data.ND(:,4)+(D(3:n_dof_node:dof(1))'./deN)*.5*labz;
end;
if in_data.EL(1,2)==6 | in_data.EL(1,2)==10
    n_dof_node = 3;
    maxX = max(in_data.ND(:,2)); minX = min(in_data.ND(:,2));
    maxY = max(in_data.ND(:,3)); minY = min(in_data.ND(:,3));
    maxZ = max(in_data.ND(:,4)); minZ = min(in_data.ND(:,4));
    labx = (maxX / 2); laby = (maxY / 2); labz = (maxZ / 2);
    labx = max([labx laby labz]); laby = labx;  labz=labx;
    max_D_x = max(abs(D(1:n_dof_node:dof(1))));
    max_D_y = max(abs(D(2:n_dof_node:dof(1))));
    max_D_z = max(abs(D(3:n_dof_node:dof(1))));
    ND_d = in_data.ND;
    deN = max([max_D_x  max_D_y  max_D_z]);
    ND_d(:,2) = in_data.ND(:,2)+(D(1:n_dof_node:dof(1))'./deN)*0.25*labx;
    ND_d(:,3) = in_data.ND(:,3)+(D(2:n_dof_node:dof(1))'./deN)*0.25*labx;
    ND_d(:,4) = in_data.ND(:,4)+(D(3:n_dof_node:dof(1))'./deN)*0.25*labx;
end;

figure(NF);
if in_data.EL(1,2)==0 | in_data.EL(1,2)==1 | in_data.EL(1,2)==2
    plot(ND_d(:,2),ND_d(:,3),'r.'); hold on;
end;

if in_data.EL(1,2)==4 | in_data.EL(1,2)==5 | in_data.EL(1,2)==51
    plot(ND_d(:,2),ND_d(:,3),'r.'); hold on;
end;

if in_data.EL(1,2)==3 | in_data.EL(1,2)==6 | in_data.EL(1,2)==31
    plot3(ND_d(:,2),ND_d(:,3),ND_d(:,4),'r.'); hold on;
end;

if in_data.EL(1,2)==10
    %plot3(ND_d(:,2),ND_d(:,3),ND_d(:,4),'r.'); hold on;
end;

for i=1:size(in_data.EL)
    if in_data.EL(i,2)==9
        node1 = find(ND_d(:,1)==in_data.EL(i,3));
        node2 = find(ND_d(:,1)==in_data.EL(i,4));
        node3 = find(ND_d(:,1)==in_data.EL(i,5));
        plot3([ND_d(node1,2) ND_d(node2,2) ND_d(node3,2) ND_d(node1,2)], ...
            [ND_d(node1,3) ND_d(node2,3) ND_d(node3,3) ND_d(node1,3)], ...
            [ND_d(node1,4) ND_d(node2,4) ND_d(node3,4) ND_d(node1,4)],'r-');
        axis equal; axis off; view(3); hold on;
        axis([(-1.1*minX) (1.1*maxX) (-1.1*minY) (1.1*maxY) (-SCz)    (SCz)]);
    end;


    if in_data.EL(i,2)==0 | in_data.EL(i,2)==1 | in_data.EL(i,2)==2
        node1 = find(in_data.ND(:,1)==in_data.EL(i,3));
        node2 = find(in_data.ND(:,1)==in_data.EL(i,4));
        plot([ND_d(node1,2) ND_d(node2,2)], ...
            [ND_d(node1,3) ND_d(node2,3)],'r-');
        axis equal; axis off;
        axis([(minX-labx) (maxX+labx) (minY-laby) (maxY+laby)]);
    end;    
    if in_data.EL(i,2)==4
    %%%    tri2 = delaunay(in_data.ND(:,2),in_data.ND(:,3));
    %%%    triplot(tri2,ND_d(:,2),ND_d(:,3),'k');
    %    node1 = find(ND_d(:,1)==in_data.EL(i,3));
    %    node2 = find(ND_d(:,1)==in_data.EL(i,4));
    %    node3 = find(ND_d(:,1)==in_data.EL(i,5));
    %    plot([ND_d(node1,2) ND_d(node2,2) ND_d(node3,2) ND_d(node1,2)], ...
    %        [ND_d(node1,3) ND_d(node2,3) ND_d(node3,3) ND_d(node1,3)],'r-');
    %    axis equal; axis off;
    %    axis([(minX-labx) (maxX+labx) (minY-laby) (maxY+laby) ]); % plot scale
    end;
    if in_data.EL(i,2)==5 | in_data.EL(1,2)==51
        node1 = find(in_data.ND(:,1)==in_data.EL(i,3));
        node2 = find(in_data.ND(:,1)==in_data.EL(i,4));
        node3 = find(in_data.ND(:,1)==in_data.EL(i,5));
        node4 = find(in_data.ND(:,1)==in_data.EL(i,6));
        plot([ND_d(node1,2) ND_d(node2,2) ND_d(node3,2) ND_d(node4,2) ND_d(node1,2)],...
            [ND_d(node1,3) ND_d(node2,3) ND_d(node3,3) ND_d(node4,3) ND_d(node1,3)],'r-');
        axis equal; axis off;
        axis([(minX-2*labx) (maxX+2*labx) (minY-2*laby) (maxY+2*laby)]);
    end;
    if in_data.EL(i,2)==3 | in_data.EL(i,2)==31
        node1 = find(in_data.ND(:,1)==in_data.EL(i,3));
        node2 = find(in_data.ND(:,1)==in_data.EL(i,4));
        plot3([ND_d(node1,2) ND_d(node2,2)], ...
            [ND_d(node1,3) ND_d(node2,3)],[ND_d(node1,4) ND_d(node2,4)],'r-');
        axis equal; axis off;
        axis([(minX-labx) (maxX+labx) (minY-laby) (maxY+laby) (minZ-labz)    (maxZ+labz)]);
    end;
end;


if in_data.EL(1,2)==6
    [qu] = surfbrick(in_data.ND(:,2:end),in_data.EL(:,3:10));
    ndPlot = unique(qu);
    tot_d = sqrt( (D(1:n_dof_node:dof(1))).^2 + ...
        (D(2:n_dof_node:dof(1))).^2 + (D(3:n_dof_node:dof(1))).^2 );
    plot3(in_data.ND(ndPlot,2),in_data.ND(ndPlot,3),in_data.ND(ndPlot,4),'b.','MarkerSize',2);
    hold on;
    for i=1:size(qu,1)
        patch([ND_d(qu(i,1),2) ND_d(qu(i,2),2) ND_d(qu(i,3),2) ND_d(qu(i,4),2)], ...
              [ND_d(qu(i,1),3) ND_d(qu(i,2),3) ND_d(qu(i,3),3) ND_d(qu(i,4),3)], ...
              [ND_d(qu(i,1),4) ND_d(qu(i,2),4) ND_d(qu(i,3),4) ND_d(qu(i,4),4)],[tot_d(qu(i,1)) tot_d(qu(i,2)) tot_d(qu(i,3)) tot_d(qu(i,4))]);
    end
    view(3);
    axis equal; axis off;
end

if in_data.EL(1,2)==10
    tri2=surftri(in_data.ND(:,2:4),in_data.EL(:,3:6));
    tot_d = sqrt( (D(1:n_dof_node:dof(1))).^2 + (D(2:n_dof_node:dof(1))).^2 + (D(3:n_dof_node:dof(1))).^2 );
    tot_d = tot_d./max(tot_d);
    trimesh(tri2,ND_d(:,2),ND_d(:,3),ND_d(:,4),'CData',[tot_d'],'facecolor','interp','edgecolor','y');
    hold on;
    trimesh(tri2,in_data.ND(:,2),in_data.ND(:,3),in_data.ND(:,4),'facecolor','none','edgecolor','k');
    axis equal;
    axis off;
    hold on;
end


if in_data.EL(1,2)==4 | in_data.EL(1,2)==5 | in_data.EL(1,2)==51
    for i=1:size(in_data.CON)
        node_i = find(in_data.ND(:,1)==in_data.CON(i,1));
        if in_data.CON(i,2)==0
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],'b-','LineWidth',3); hold on;
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],'b-','LineWidth',3); hold on;
        end;
        if in_data.CON(i,3)==0
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],'b-','LineWidth',3); hold on;
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],'b-','LineWidth',3); hold on;
        end;
    end;
    axis equal; axis off;
    %axis([(minX-labx) (maxX+labx) (minY-laby) (maxY+laby) ]);
    hold off;
end;

if in_data.EL(1,2)==3
    maxZ = max(in_data.ND(:,4));
    labz = (maxZ / 8);
    for i=1:size(in_data.CON)
        node_i = find(in_data.ND(:,1)==in_data.CON(i,1));
        if in_data.CON(i,2)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
        end;
        if in_data.CON(i,3)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
        end;
        if in_data.CON(i,4)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)-labz],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)-labz],'b-','LineWidth',3); hold on;
        end;
    end;
    hold off;
end;

if in_data.EL(1,2)==0 | in_data.EL(1,2)==1 | in_data.EL(1,2)==2
    for i=1:size(in_data.CON)
        node_i = find(in_data.ND(:,1)==in_data.CON(i,1));
        if in_data.CON(i,2)==0
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],[in_data.ND(node_i,3) in_data.ND(node_i,3)],'b-',...
                'LineWidth',3); hold on;
        end;
        if in_data.CON(i,3)==0
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)],[in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],'b-',...
                'LineWidth',3); hold on;
        end;
        if in_data.CON(i,4)==0
            plot([in_data.ND(node_i,2) in_data.ND(node_i,2)],[in_data.ND(node_i,3) in_data.ND(node_i,3)],'bs',...
                'LineWidth',3); hold on;
        end;
    end;
end;

if in_data.EL(1,2)==10
    maxX = max(in_data.ND(:,2));
    labx = (maxX / 12);
    maxY = max(in_data.ND(:,3));
    laby = (maxY / 12);
    maxZ = max(in_data.ND(:,4));
    labz = (maxZ / 12);
    labx = min([labx laby labz]); laby = labx;  labz=labx;
    for i=1:size(in_data.CON)
        node_i = find(in_data.ND(:,1)==in_data.CON(i,1));
        if in_data.CON(i,2)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)-labx],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
        end;
        if in_data.CON(i,3)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)-laby],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)],'b-','LineWidth',3); hold on;
        end;
        if in_data.CON(i,4)==0
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)-labz],'b-','LineWidth',3); hold on;
            plot3([in_data.ND(node_i,2) in_data.ND(node_i,2)],...
                [in_data.ND(node_i,3) in_data.ND(node_i,3)],...
                [in_data.ND(node_i,4) in_data.ND(node_i,4)-labz],'b-','LineWidth',3); hold on;
        end;
    end;
    hold off;
end;

Contact us at files@mathworks.com