FEATool Multiphysics  v1.16.4 Finite Element Analysis Toolbox
ex_classicpde1.m File Reference

## Description

EX_CLASSICPDE1 Eigenmodes for a circular drum.

[ FEA, OUT ] = EX_CLASSICPDE1( VARARGIN ) Eigenmodes for a circular drum. Accepts the following property/value pairs.

Input       Value/{Default}        Description
-----------------------------------------------------------------------------------
igrid       scalar 0/{1}           Cell type (0=quadrilaterals, 1=triangles)
hmax        scalar {0.1}           Grid cell size
sfun        string {sflag1}        Shape function
iplot       scalar 0/{1}           Plot solution (=1)
.
Output      Value/(Size)           Description
-----------------------------------------------------------------------------------
fea         struct                 Problem definition struct
out         struct                 Output struct


# Code listing

 cOptDef = { ...
'igrid',    1; ...
'hmax',     0.1; ...
'sfun',     'sflag1'; ...
'iplot',    1; ...
'tol',      0.02; ...
'fid',      1 };
[got,opt] = parseopt(cOptDef,varargin{:});
fid       = opt.fid;

% Geometry definition.
gobj = gobj_circle();
fea.geom.objects = { gobj };

% Grid generation.
if( opt.igrid==1 )
fea.grid = gridgen(fea,'hmax',opt.hmax,'fid',fid);
else
fea.grid = circgrid( 16, 12, 1 );
if( opt.igrid<0 )
end
end
n_bdr = max(fea.grid.b(3,:));   % Number of boundaries.

% Problem definition.
fea.sdim  = { 'x' 'y' };   % Coordinate names.

fea = addphys( fea, @poisson, {'u'} );
fea.phys.poi.sfun  = { opt.sfun };

fea.phys.poi.bdr.coef{1,end}  = repmat({0},1,n_bdr);

fea = parsephys(fea);

% Parse and solve problem.
fea = parseprob(fea);
[fea.sol.u,fea.sol.l] = solveeig( fea, 'fid', fid );

% Postprocessing.
if( opt.iplot>0 )
postplot( fea, 'surfexpr', 'u', 'surfhexpr', 'u' )
title(['Solution lambda 6 = ',num2str(fea.sol.l(end))])
end

l_ref = [5.783186;14.681971;14.681971;26.374616;26.374617;30.471262];
f = sqrt(fea.sol.l)/(2*pi);
out.err  = [ norm( l_ref - fea.sol.l )/norm(l_ref) ;
norm(abs(f([2,4,6])/f(1)-[1.59;2.14;2.30])./[1.59;2.14;2.30]) ];
out.pass = all(out.err < opt.tol);

if( ~nargout )
clear fea out
end