|
FEATool Multiphysics
v1.17.5
Finite Element Analysis Toolbox
|
EX_PLANESTRESS4 Example of thermally induced stress.
[ FEA, OUT ] = EX_PLANESTRESS4( VARARGIN ) NAFEMS T1 Benchmark example for thermally induced stress. A 20x20 mm plate is subjected to thermal load at a circular spot with radius 1 mm. Plane stress and symmetry can be assumed. The stress in the y-direction is sought just outside the thermal spot.
Accepts the following property/value pairs.
Input Value/{Default} Description
-----------------------------------------------------------------------------------
E scalar {100e9} Modulus of elasticity
nu scalar {0.3} Poissons ratio
hmax scalar {4e-4} Max grid cell size
sfun string {sflag1} Shape function for displacements
iphys scalar 0/{1} Use physics mode to define problem (=1)
iplot scalar 0/{1} Plot solution (=1)
.
Output Value/(Size) Description
-----------------------------------------------------------------------------------
fea struct Problem definition struct
out struct Output struct
cOptDef = { ...
'E', 100e9; ...
'nu', 0.3; ...
'sy_ref', 50e6; ...
'hmax', 3e-4; ...
'sfun', 'sflag2'; ...
'igeom', 1; ...
'iphys', 1; ...
'iplot', 1; ...
'tol', 0.1; ...
'fid', 1 };
[got,opt] = parseopt( cOptDef, varargin{:} );
fid = opt.fid;
% Model, geometry, and grid parameters.
l = 1e-2; % Length of quarter domain.
r = 1e-3; % Radius of thermal spot.
xc = 0; % x-coordinate of spot center.
yc = 0; % y-coordinate of spot center.
% Geometry definition.
switch( opt.igeom )
case 1
gobj1 = gobj_rectangle( 0, l, 0, l, 'R1' );
gobj2 = gobj_circle( [0 0], r, 'C1' );
gobj3 = gobj_rectangle( 0, l, 0, l, 'R2' );
gobj4 = gobj_circle( [0 0], r, 'C2' );
fea.geom.objects = { gobj1 gobj2 gobj3 gobj4 };
fea.geom = geom_apply_formula( fea.geom, 'R1-C1' );
fea.geom = geom_apply_formula( fea.geom, 'R2&C2' );
case 2
gobj1 = gobj_rectangle( 0, l, 0, l, 'R1' );
gobj2 = gobj_circle( [0 0], r, 'C1' );
gobj3 = gobj_rectangle( 0, l, 0, l, 'R2' );
fea.geom.objects = { gobj1 gobj2 gobj3 };
fea.geom = geom_apply_formula( fea.geom, 'R1&C1' );
case 3
gobj1 = gobj_rectangle( 0, l, 0, l );
gobj2 = gobj_circle( [0 0], r );
gobj3 = gobj_polygon( [0 0; r 0;r -r; -r -r; -r r; 0 r] );
fea.geom.objects = { gobj1 gobj2 gobj3 };
fea.geom = geom_apply_formula( fea.geom, 'C1-P1' );
end
fea.sdim = { 'x' 'y' }; % Coordinate names.
% Grid generation.
fea.grid = gridgen( fea, 'hmax', opt.hmax, 'fid', fid );
n_bdr = max(fea.grid.b(3,:)); % Number of boundaries.
% Boundary conditions.
dtol = r/5;
lbdr = findbdr( fea, ['x<=',num2str(dtol)] ); % Left boundary number.
lobdr = findbdr( fea, ['y<=',num2str(dtol)] ); % Lower boundary number.
% Problem definition.
if( opt.iphys==1 )
fea = addphys( fea, @planestress );
fea.phys.pss.eqn.coef{1,end} = { opt.nu };
fea.phys.pss.eqn.coef{2,end} = { opt.E };
if( sum(fea.grid.s==1) < sum(fea.grid.s==2) )
fea.phys.pss.eqn.coef{6,end} = { 1e-3, 0 };
else
fea.phys.pss.eqn.coef{6,end} = { 0, 1e-3 };
end
fea.phys.pss.eqn.coef{7,end} = { 1 };
fea.phys.pss.sfun = { opt.sfun opt.sfun };
bctype = mat2cell( zeros(2,n_bdr), [1 1], ones(1,n_bdr) );
bctype{1,lbdr(1)} = 1;
bctype{1,lbdr(2)} = 1;
bctype{2,lobdr(1)} = 1;
bctype{2,lobdr(2)} = 1;
fea.phys.pss.bdr.coef{1,5} = bctype;
fea = parsephys(fea);
s_sy = fea.phys.pss.eqn.vars{6,end};
else
E11 = opt.E/(1-opt.nu^2);
E12 = opt.nu*E11;
E22 = E11;
E33 = opt.E/(1+opt.nu)/2;
if( sum(fea.grid.s==1) < sum(fea.grid.s==2) )
fea.expr = { 'alfaT', { opt.E/(1-opt.nu)*1e-3 0 } };
else
fea.expr = { 'alfaT', { 0 opt.E/(1-opt.nu)*1e-3 } };
end
fea.dvar = { 'u' 'v' };
fea.sfun = { opt.sfun opt.sfun };
% Define equation system.
fea.eqn.a.form = { [2 3;2 3] [3 2;2 3]; ...
[3 2;2 3] [2 3;2 3] }; ...
fea.eqn.a.coef = { {E11 E33} {E12 E33}; ...
{E33 E12} {E33 E11} };
fea.eqn.f.form = { 2 3 };
fea.eqn.f.coef = { 'alfaT' 'alfaT' };
% Define boundary conditions.
fea.bdr.d = cell(2,n_bdr);
fea.bdr.n = cell(2,n_bdr);
[fea.bdr.n{:}] = deal(0);
fea.bdr.d{1,lbdr(1)} = 0;
fea.bdr.d{1,lbdr(2)} = 0;
fea.bdr.d{2,lobdr(1)} = 0;
fea.bdr.d{2,lobdr(2)} = 0;
s_sy = [num2str(E12),'*ux + ',num2str(E11),'*vy - alfaT'];
end
% Parse and solve problem.
fea = parseprob( fea ); % Check and parse problem struct.
fea.sol.u = solvestat( fea, 'fid', fid ); % Call to stationary solver.
% Postprocessing.
if( opt.iplot>0 )
figure
postplot( fea, 'surfexpr', s_sy, 'isoexpr', s_sy, 'isolev', 50 )
title( 'Stress, y-component' )
end
% Error checking.
sy_D = evalexpr( s_sy, [1e-3;1e-6], fea );
out.sy_D = sy_D;
out.err = abs(sy_D - opt.sy_ref)/opt.sy_ref;
out.pass = out.err <= opt.tol;
if( nargout==0 )
clear fea out
end