ops.wipe();
ops.model('basic', '-ndm', 3, '-ndf', 3);
%% Parameters
L = 3.0;
b = 0.2;
h = 0.3;
E = 30e9;
nu = 0.25;
P = 1.0e4; % 10 kN
nx = 50;
ny = 6;
nz = 6;
dx = L / nx;
dy = b / ny;
dz = h / nz;
%% Material
matTag = 1;
ops.nDMaterial('ElasticIsotropic', matTag, E, nu);
%% Node generation
nodeTag = 0;
nodeId = zeros(nx+1, ny+1, nz+1);
for i = 0:nx
x = i * dx;
for j = 0:ny
y = -b/2 + j * dy;
for k = 0:nz
z = -h/2 + k * dz;
nodeTag = nodeTag + 1;
nodeId(i+1,j+1,k+1) = nodeTag;
ops.node(nodeTag, x, y, z);
end
end
end
%% Element generation
eleTag = 0;
for i = 1:nx
for j = 1:ny
for k = 1:nz
n1 = nodeId(i ,j ,k );
n2 = nodeId(i+1,j ,k );
n3 = nodeId(i+1,j+1,k );
n4 = nodeId(i ,j+1,k );
n5 = nodeId(i ,j ,k+1);
n6 = nodeId(i+1,j ,k+1);
n7 = nodeId(i+1,j+1,k+1);
n8 = nodeId(i ,j+1,k+1);
eleTag = eleTag + 1;
ops.element('stdBrick', eleTag, ...
n1,n2,n3,n4,n5,n6,n7,n8, ...
matTag, 0.0, 0.0, 0.0);
end
end
end
%% Boundary conditions at x = 0
for j = 1:(ny+1)
for k = 1:(nz+1)
nd = nodeId(1,j,k);
ops.fix(nd, 1, 1, 1);
end
end
%% Load at free end x = L
tipFaceNodes = [];
for j = 1:(ny+1)
for k = 1:(nz+1)
tipFaceNodes(end+1) = nodeId(nx+1,j,k);
end
end
fz = -P / numel(tipFaceNodes);
ops.timeSeries('Linear', 1);
ops.pattern('Plain', 1, 1);
for ii = 1:numel(tipFaceNodes)
ops.load(tipFaceNodes(ii), 0.0, 0.0, fz);
end