|
FEATool Multiphysics
v1.17.5
Finite Element Analysis Toolbox
|
EX_NAVIERSTOKES12 3D Example flow over a backwards facing step.
[ FEA, OUT ] = EX_NAVIERSTOKES12( VARARGIN ) Sets up and solves stationary and laminar 3D flow over a backwards facing step. Accepts the following property/value pairs.
Input Value/{Default} Description
-----------------------------------------------------------------------------------
rho scalar {1} Density
miu scalar {2/3/389} Molecular/dynamic viscosity
uin scalar {1} Magnitude of inlet velocity
sf_u string {sflag1} Shape function for velocity
sf_p string {sflag1} Shape function for pressure
solver string 'openfoam'/{'} Use OpenFOAM or default solver
iplot scalar 0/{1} Plot solution and error (=1)
.
Output Value/(Size) Description
-----------------------------------------------------------------------------------
fea struct Problem definition struct
out struct Output struct
cOptDef = { ...
'rho', 1;
'miu', 2/3/389;
'uin', 1;
'igrid', 1;
'sf_u', 'sflag1';
'sf_p', 'sflag1';
'solver', '';
'iplot', 1;
'tol', 0.55;
'fid', 1 };
[got,opt] = parseopt(cOptDef,varargin{:});
fid = opt.fid;
% Geometry.
h_step = 0.0049/0.0101;
l_inlet = 0.02/0.0101;
l_channel = 0.08/0.0101;
fea.sdim = { 'x', 'y', 'z' };
gobj1 = gobj_block( -l_inlet, l_channel, -0.5, 0.5, -h_step, 1-h_step, 'B1' );
gobj2 = gobj_block( -l_inlet, 0, -0.5, 0.5, -h_step, 0, 'B2' );
fea.geom.objects = { gobj1, gobj2 };
fea = geom_apply_formula( fea, 'B1-B2' );
% Grid generation.
if( opt.igrid>=1 )
n = 4;
fea.grid = rectgrid(10*n,n,[-l_inlet, l_channel; -0.5, 0.5]);
fea.grid = delcells( fea.grid, selcells(fea.grid,'(y<=0).*(x<=0)') );
ix = find( fea.grid.p(2,:) <= -0.5 + sqrt(eps) );
fea.grid.p(2,ix) = -h_step;
ix = find( fea.grid.p(2,:) >= 0.5 - sqrt(eps) );
fea.grid.p(2,ix) = 1-h_step;
fea.grid = gridextrude( fea.grid, n, 1, -2 );
fea.grid.p(2,:) = fea.grid.p(2,:) + 0.5;
fea.grid = assign_bdr( fea.grid, fea.geom );
for i=1:opt.igrid
fea.grid = gridrefine( fea.grid, fid );
end
else
fea.grid = gridgen( fea, 'hmax', 0.1, 'fid', fid );
% fea.grid = gridsmooth( tet2hex( fea.grid ), 5 );
end
% Problem definition.
fea = addphys( fea, @navierstokes );
fea.phys.ns.eqn.coef{1,end} = { opt.rho };
fea.phys.ns.eqn.coef{2,end} = { opt.miu };
fea.phys.ns.sfun = { opt.sf_u opt.sf_u opt.sf_u opt.sf_p };
% fea.phys.ns.prop.artstab.iupw = 4;
if( any(strcmp(opt.solver,{'openfoam','su2'})) )
[fea.phys.ns.sfun{:}] = deal('sflag1');
end
% Boundary conditions.
i_inflow = findbdr( fea, ['x<',num2str(-l_inlet+1e-3)] ); % Inflow boundary number.
i_outflow = findbdr( fea, ['x>',num2str( l_channel-1e-3)] ); % Outflow boundary number.
% s_inflow = ['4*',num2str(umax),'*(y*(',num2str((1-y)*h),'-y))/',num2str((1-y)*h),'^2']; % Definition of inflow profile.
s_inflow = ['4*',num2str(opt.uin),'*(z*(',num2str(1-h_step),'-z))/(1-',num2str(1-h_step),')^2'];
u_init = [s_inflow,'*(z>0)'];
fea.phys.ns.bdr.sel(i_inflow) = 2;
fea.phys.ns.bdr.sel(i_outflow) = 4;
fea.phys.ns.bdr.coef{2,end}{1,i_inflow} = s_inflow;
if( ~strcmp(opt.solver,'openfoam') )
fea.phys.ns.eqn.coef{6,end} = { u_init };
end
% Parse and solve problem.
fea = parsephys( fea );
fea = parseprob( fea );
if( strcmp(opt.solver,'openfoam') )
logfid = fid; if( ~got.fid ), fid = []; end
fea.sol.u = openfoam( fea, 'fid', fid, 'logfid', logfid );
fid = logfid;
elseif( strcmp(opt.solver,'su2') )
logfid = fid; if( ~got.fid ), fid = []; end
fea.sol.u = su2( fea, 'fid', fid, 'logfid', logfid );
fid = logfid;
else
fea.sol.u = solvestat( fea, 'maxnit',50, 'nlrlx',1, 'tolchg',1e-3, 'fid', fid );
end
% Postprocessing.
if( opt.iplot>0 )
postplot( fea, 'sliceexpr', 'sqrt(u^2+v^2+w^2)' )
end
% Error checking.
[~,slen] = minmaxsubd( ['(u<-eps)*x/',num2str(h_step),'*(z<0)*(y<0.01)*(y>-0.01)'], fea );
if( ~isempty(fid) )
fprintf(fid,'\nRecirculation zone length: %3f (Ref: 7.93)\n\n',slen)
fprintf(fid,'\n\n')
end
out.slen = [slen, 7.93];
out.err = abs(diff(out.slen))/out.slen(end);
out.pass = out.err<opt.tol;
if ( nargout==0 )
clear fea out
end