FEATool Multiphysics
v1.17.2
Finite Element Analysis Toolbox
|
EX_PLANESTRESS5 Plane stress example for an elliptic membrane.
[ FEA, OUT ] = EX_PLANESTRESS5( VARARGIN ) Example to calculate displacements and stresses for an elliptic membrane with a hole in it. NAFEMS benchmark example LE1.
Accepts the following property/value pairs.
Input Value/{Default} Description ----------------------------------------------------------------------------------- E scalar {210e9} Modulus of elasticity nu scalar {0.3} Poissons ratio hmax scalar {0.1} Max grid cell size sfun string {sflag2} 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', 210e9; ... 'nu', 0.3; ... 'hmax', 0.1; ... 'sfun', 'sflag2'; ... 'iplot', 1; ... 'igeom', 1; ... 'tol', 0.05; ... 'fid', 1 }; [got,opt] = parseopt( cOptDef, varargin{:} ); fid = opt.fid; % Geometry definition. gobj1 = gobj_ellipse( [0 0], 3.25, 2.75, 'E1' ); gobj2 = gobj_ellipse( [0 0], 2, 1, 'E2' ); gobj3 = gobj_rectangle( -3.25, 3.25, -2.75, 0, 'R1' ); gobj4 = gobj_rectangle( -3.25, 0, 0, 2.75, 'R2' ); fea.geom.objects = { gobj1 gobj2 gobj3 gobj4 }; if( opt.igeom==1 ) fea = geom_apply_formula( fea, 'E1-E2-R1-R2' ); else fea = geom_apply_formula( fea, 'E1-E2' ); fea = geom_apply_formula( fea, 'CS1-R1' ); fea = geom_apply_formula( fea, 'CS2-R2' ); end fea.sdim = { 'x' 'y' }; % Grid generation. if( opt.igeom==1 ) fea.grid = gridgen( fea, 'hmax', opt.hmax, 'fid', fid, 'gridgen', 'gridgen2d' ); else fea.grid = gridgen( fea, 'hmax', opt.hmax, 'fid', fid ); end n_bdr = max(fea.grid.b(3,:)); % Number of boundaries. % Boundary conditions. dtol = sqrt(eps); lbdr = findbdr( fea, ['x<=',num2str(dtol)] ); % Left boundary number. lobdr = findbdr( fea, ['y<=',num2str(dtol)] ); % Lower boundary number. % Problem definition. E11 = opt.E/(1-opt.nu^2); E12 = opt.nu*E11; E22 = E11; E33 = opt.E/(1+opt.nu)/2; fea = addphys(fea,@planestress); % Add plane stress physics mode. fea.phys.pss.eqn.coef{1,end} = { opt.nu }; fea.phys.pss.eqn.coef{2,end} = { opt.E }; fea.phys.pss.sfun = { opt.sfun opt.sfun }; % Set shape functions. bctype = mat2cell( zeros(2,n_bdr), [1 1], ones(1,n_bdr) ); bctype{1,lbdr} = 1; bctype{2,lobdr} = 1; fea.phys.pss.bdr.coef{1,5} = bctype; % Add normal load to outer boundary. dtol = 1e-3; i_o = findbdr( fea, ['sqrt(x.^2+y.^2)>=',num2str(2.75-dtol)] ); bccoef = mat2cell( zeros(2,n_bdr), [1 1], ones(1,n_bdr) ); bccoef{1,i_o} = 'nx*10e6'; bccoef{2,i_o} = 'ny*10e6'; fea.phys.pss.bdr.coef{1,end} = bccoef; % Parse and solve problem. fea = parsephys(fea); fea = parseprob(fea); fea.sol.u = solvestat( fea, 'fid', fid ); % Postprocessing. s_sy = [num2str(E12),'*ux+',num2str(E11),'*vy']; if ( opt.iplot>0 ) figure postplot( fea, 'surfexpr', s_sy, 'isoexpr', s_sy ) title('Stress, x-component') end % Error checking. sy_D = evalexpr( s_sy, [2;0]+sqrt(eps)*1e1, fea ); out.sy_D = sy_D; out.err = abs(sy_D - 92.7e6)/92.7e6; out.pass = out.err <= opt.tol; if ( nargout==0 ) clear fea out end