|
FEATool Multiphysics
v1.17.5
Finite Element Analysis Toolbox
|
EX_SPANNER STL geometry import and stress calculation of a spanner.
[ FEA, OUT ] = EX_SPANNER( VARARGIN ) Example to import a STL CAD geometry and calculate displacements on a fixed spanner. The load force may be distributed in the tangential load direction with the force fraction parameter FRAC.
Accepts the following property/value pairs.
Input Value/{Default} Description
-----------------------------------------------------------------------------------
E scalar {190e3} Modulus of elasticity [N/mm^2]
nu scalar {0.29} Poissons ratio
force scalar {1000} Load force [N]
frac scalar {0} Fraction of stress against pulling direction
sfun string {sflag1} Shape function for displacements
iplot scalar 0/{1} Plot solution (=1)
.
Output Value/(Size) Description
-----------------------------------------------------------------------------------
fea struct Problem definition struct
out struct Output struct
cOptDef = { 'E', 190e3;
'nu', 0.29;
'force', 1000;
'frac', 0;
'sfun', 'sflag1';
'iplot', 1;
'fid', 1 };
[got,opt] = parseopt(cOptDef,varargin{:});
% Define scaling factor m to mm.
USE_METERS = true;
s = double( ~USE_METERS + USE_METERS*1e-3 );
% Import (and scale) grid.
fea.sdim = {'x','y','z'};
fea.geom = impexp_stl( 'spanner1.stl', 'import', [], 'solid', 2, 'extend', 0 );
fea.grid = gridgen( fea, 'hmax', 5, 'gridgen', 'robust', 'fid', opt.fid );
fea.grid.p = fea.grid.p*s;
% Add linear elasticity physics mode and define material parameters.
fea = addphys( fea, @linearelasticity );
fea.phys.el.sfun = { opt.sfun opt.sfun opt.sfun };
fea.phys.el.eqn.coef{1,end} = { opt.nu };
fea.phys.el.eqn.coef{2,end} = { opt.E/s^2 };
% Set all boundaries to no load per default.
n_bdr = max(fea.grid.b(3,:));
bc_sel = cell(3,n_bdr);
[bc_sel{:}] = deal(0);
% Fix all displacements on mandible boundaries.
i_fix = [13 14];
i_force = [3 1];
faxis = [1 3];
[bc_sel{:,i_fix}] = deal(1);
fea.phys.el.bdr.coef{5} = bc_sel;
% Apply force for x > 140 mm.
force = opt.force/(6*s*80*s);
fea.phys.el.bdr.coef{7}{faxis(1),i_force(1)} = ['-',num2str((1-opt.frac)*force),'*(y>140*',num2str(s),')'];
fea.phys.el.bdr.coef{7}{faxis(2),i_force(2)} = [num2str(opt.frac*force),'*(y>140*',num2str(s),')'];
% Parse and solve problem.
fea = parsephys(fea);
fea = parseprob(fea);
fea.sol.u = solvestat( fea, 'fid', opt.fid, 'icub', 1+str2num(strrep(opt.sfun,'sflag','')) );
% Postprocessing.
if( opt.iplot>0 )
subplot(1,2,1)
postplot( fea, 'surfexpr', ['sqrt(u^2+v^2+w^2)/',num2str(s)] )
view([30 20])
title('Total displacement (mm)')
subplot(1,2,2)
DSCALE = 5;
dp = zeros(size(fea.grid.p));
for i=1:3
dp(i,:) = DSCALE*evalexpr( fea.dvar{i}, fea.grid.p, fea );
end
fea_disp.grid = fea.grid;
fea_disp.grid.p = fea_disp.grid.p + dp;
plotgrid( fea_disp )
title(['Displacement plot'])
view([30 20])
end
% Error checking.
u = fea.sol.u(unique(fea.eqn.dofm{1}(:)))/s;
v = fea.sol.u(unique(fea.eqn.ndof(1)+fea.eqn.dofm{2}(:)))/s;
w = fea.sol.u(unique(sum(fea.eqn.ndof(1:2))+fea.eqn.dofm{3}(:)))/s;
out.disp = sqrt( u.^2 + v.^2 + w.^2 );
out.pass = nan;
if( ~(got.frac || got.E || got.nu || got.force) )
out.pass = abs( max(out.disp) - 2.5 )/2.5 < 0.1;
end
if( nargout==0 )
clear fea out
else
fea.grid.p = fea.grid.p/s;
end