Defining nodal coordinates for a 3D cubic lattice.

14 views (last 30 days)
Hi,
I wish to create a 3D lattice formed by joining together many 8-node cubic elements (see figure). I wish to define the number of cubic elements I want in the x, y and z direction whilst also being able to obtain the coordinates for each node in an array C. Where C(:,1) refers to the x coordinates, C(:,2) refers to the y and C(:,3) to the z and where C(1,:) refers to the first node, C(2,:) the second etc.
My script thus far is attached. I am struggling with two key issues:
  1. Creating a loop that adds additional elements with the correct node assignments.
  2. Assuring that the code is robust such that the entire structure maintains its cubic/cuboidal shape despite varying user inputs.
Any help would very much be appreciated.
Sam
Note: The figure represents the desired output when the user defines 2 elements in the x, y and z axis.
Note: This figure denotes the preferred node arrangement for a 3x2x1 cubic lattice.

Accepted Answer

Samuel Thompson
Samuel Thompson on 2 Oct 2017
Edited: Samuel Thompson on 3 Oct 2017
For those who this may be useful, I modified a code provided from another MATLAB user, Marten for ease of use. https://uk.mathworks.com/matlabcentral/fileexchange/48373-stl-lattice-generator?s_tid=srchtitle
Find the code attached.
  2 Comments
MD SHARIER
MD SHARIER on 20 Dec 2023
It doesn't seem to be working.Is there any updated version of it?
DGM
DGM on 21 Dec 2023
Edited: DGM on 21 Dec 2023
Looks like it works just fine to me.
%% CUBE COORDINATE MAPPING TRIALS
clc
clearvars
O = [0 0 0];% origin
Nx = 3; % defines number of elements in x direction
Ny = 3; % defines number of elements in y direction
Nz = 3;
Lx = 1; % defines length of single element in x direction
Ly = 1; % defines length of single element in y direction
Lz = 1; % defines length of single element in z direction
%% COORDINATES FOR BODY-CENTERED CUBIC (BCC) ELEMENT
nodes = [O; O(1)+Lx, O(2), O(3); O(1)+Lx, O(2)+Ly, O(3); O(1), O(2)+Ly, O(3);...
O(1), O(2), O(3)+Lz; O(1)+Lx, O(2), O(3)+Lz; O(1)+Lx, O(2)+Ly, O(3)+Lz;...
O(1), O(2)+Ly, O(3)+Lz; O(1)+Lx/2, O(2)+Ly/2, O(3)+Lz/2];
no_nodes = length(nodes);
%% LATTICE NODES
% cell replication - produce every node in lattice (including duplicates)
for nix=1:Nx-1 %Modified to include variable number of nodes for each cell type
for i=1:no_nodes
nodes(no_nodes+no_nodes*(nix-1)+i,:)=[nodes(i,1)+nix*Lx,nodes(i,2),nodes(i,3)];
end
end
for niy=1:Ny-1
for i=1:no_nodes*Nx
nodes(no_nodes*Nx+no_nodes*Nx*(niy-1)+i,:)=[nodes(i,1),nodes(i,2)+niy*Ly,nodes(i,3)];
end
end
for niz=1:Nz-1
for i=1:no_nodes*Nx*Ny
nodes(no_nodes*Nx*Ny+no_nodes*Nx*Ny*(niz-1)+i,:)=[nodes(i,1),nodes(i,2),nodes(i,3)+niz*Lz];
end
end
%% Remove duplicate nodes
[C,~,~]=unique(nodes,'rows');
%% SCATTER NODES
figure
scatter3(C(:,1),C(:,2),C(:,3),'rx');
hold on
C1 = C(:,1); C2 = C(:,2); C3 = C(:,3);
for k=1:length(C)
text(C1(k),C2(k),C3(k),num2str(k))
end
daspect([1 1 1])
xlabel('xaxis'); ylabel('yaxis'); zlabel('zaxis');
% xlim([-0.5*L,Nx])
% ylim([-0.5*L,Ny])
% zlim([-0.5*L,2])

Sign in to comment.

More Answers (0)

Categories

Find more on Simulink in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!