|
FEATool Multiphysics
v1.17.5
Finite Element Analysis Toolbox
|
EX_NAVIERSTOKES2 2D Example for incompressible flow in a square cavity.
[ FEA, OUT ] = EX_NAVIERSTOKES2( VARARGIN ) Sets up and solves stationary
[1] Botella O, Peyret R. Benchmark spectral results on the lid- driven cavity flow. Computers and Fluids 27(4):421–433, 1998.
[2] Erturk E, Corke TC, Gökcöl C. Numerical solutions of 2-D steady incompressible driven cavity flow at high Reynolds numbers. Int- ernational Journal for Numerical Methods in Fluids 37(6):633–655, 2005.
[3] Nishida H, Satofuka N. Higher-order solutions of square driven cavity flow using a variable-order multi-grid method. International Journal for Numerical Methods in Engineering 34(2):637–653, 1992.
[4] Schreiber R, Keller HB. Driven cavity flows by efficient numerical techniques. Journal of Computational Physics 49(2):310–333, 1983.
Accepts the following property/value pairs.
Input Value/{Default} Description
-----------------------------------------------------------------------------------
re scalar {1000} Reynolds number
igrid scalar 0/{1}/2 Cell type (0=quadrilaterals, 1=triangles,
2=triangles converted from quadrilaterals)
hmax scalar {0.02} Max grid cell size
sf_u string {sflag1} Shape function for velocity
sf_p string {sflag1} Shape function for pressure
iphys scalar {1}/0 Use physics mode to define problem (=1)
solver string openfoam/su2/{} Use OpenFOAM, SU2 or default solver
iplot scalar {1}/0 Plot solution and error (=1)
.
Output Value/(Size) Description
-----------------------------------------------------------------------------------
fea struct Problem definition struct
out struct Output struct
cOptDef = { ...
're', 1000;
'igrid', 1;
'hmax', 0.02;
'sf_u', 'sflag1';
'sf_p', 'sflag1';
'iphys', 1;
'solver', '';
'ischeme', 0;
'iplot', 1;
'tol', 0.35;
'fid', 1 };
[got,opt] = parseopt(cOptDef,varargin{:});
fid = opt.fid;
% Model parameters.
rho = 1; % Density.
umax = 1; % Maximum magnitude of inlet velocity.
l = 1;
miu = umax*l/opt.re; % Molecular/dynamic viscosity.
% Grid parameters.
hmax = opt.hmax; % Max allowable global element size.
hmaxr = 2*hmax; % Max allowable element size on rectangle.
% Discretization parameters.
sf_u = opt.sf_u; % FEM shape function type for velocity.
sf_p = opt.sf_p; % FEM shape function type for pressure.
% Geometry definition.
gobj = gobj_rectangle( 0, l, 0, l );
gobj.boundaries = gobj.boundaries([4,1,2,3]);
fea.geom.objects = { gobj };
fea.sdim = { 'x' 'y' }; % Coordinate names.
% Grid generation.
switch opt.igrid
case 1
fea.grid = gridgen(fea,'hmax',opt.hmax,'fid',fid);
otherwise
fea.grid = rectgrid(round(l/opt.hmax),round(l/opt.hmax),[0 l;0 l]);
ib = zeros(1,size(fea.grid.b,2));
ib(fea.grid.b(3,:)==4) = 1;
ib(fea.grid.b(3,:)==1) = 2;
ib(fea.grid.b(3,:)==2) = 3;
ib(fea.grid.b(3,:)==3) = 4;
fea.grid.b(3,:) = ib;
if( opt.igrid~=0 )
fea.grid = quad2tri(fea.grid,1);
end
end
% Boundary conditions.
n_bdr = max(fea.grid.b(3,:)); % Number of boundaries.
dtol = opt.hmax;
i_inflow = findbdr( fea, ['y>',num2str(l-dtol)] ); % Inflow (top) boundary.
% Problem definition.
if ( opt.iphys==1 )
fea = addphys(fea,@navierstokes); % Add Navier-Stokes equations physics mode.
fea.phys.ns.eqn.coef{1,end} = { rho };
fea.phys.ns.eqn.coef{2,end} = { miu };
fea.phys.ns.sfun = { sf_u sf_u sf_p }; % Set shape functions.
fea.phys.ns.bdr.sel(i_inflow) = 2;
fea.phys.ns.bdr.coef{2,end}{1,i_inflow} = umax; % Set inflow profile.
fea = parsephys(fea); % Check and parse physics modes.
else
fea.dvar = { 'u' 'v' 'p' }; % Dependent variable name.
fea.sfun = { sf_u sf_u sf_p }; % Shape function.
% Define equation system.
cvelx = [num2str(rho),'*',fea.dvar{1}]; % Convection velocity in x-direction.
cvely = [num2str(rho),'*',fea.dvar{2}]; % Convection velocity in y-direction.
fea.eqn.a.form = { [2 3 2 3;2 3 1 1] [2;3] [1;2];
[3;2] [2 3 2 3;2 3 1 1] [1;3];
[2;1] [3;1] [] };
fea.eqn.a.coef = { {2*miu miu cvelx cvely} miu -1;
miu {miu 2*miu cvelx cvely} -1;
1 1 [] };
fea.eqn.f.form = { 1 1 1 };
fea.eqn.f.coef = { 0 0 0 };
% Define boundary conditions.
fea.bdr.d = cell(3,n_bdr);
[fea.bdr.d{1:2,:}] = deal( 0);
fea.bdr.d{1,i_inflow} = umax;
fea.bdr.n = cell(3,n_bdr);
% Add integral pressure constraint.
fea.constr.type = 'intsubd';
fea.constr.dvar = 'p';
fea.constr.index = [];
fea.constr.expr = 0';
end
% Parse and solve problem.
fea = parseprob(fea); % Check and parse problem struct.
if( opt.iphys==1 && strcmp(opt.solver,'openfoam') )
logfid = fid; if( ~got.fid ), fid = []; end
warning('off', 'FEATOOL:IncompatibleContstraintsWarnId')
fea.sol.u = openfoam( fea, 'nproc', 1, 'fid', fid, 'logfid', logfid );
warning('on', 'FEATOOL:IncompatibleContstraintsWarnId')
fid = logfid;
elseif( opt.iphys==1 && strcmp(opt.solver,'su2') )
logfid = fid; if( ~got.fid ), fid = []; end
warning('off', 'FEATOOL:IncompatibleContstraintsWarnId')
fea.sol.u = su2( fea, 'tol', 3e-7, 'fid', fid, 'logfid', logfid );
warning('on', 'FEATOOL:IncompatibleContstraintsWarnId')
fid = logfid;
elseif( opt.iphys==1 && strcmp(opt.solver,'fenics') )
fea = fenics( fea, 'fid', fid, 'nlrlx', 0.5, 'maxnit', 50, 'nproc', 1 );
else
if( opt.ischeme==0 )
fea.sol.u = solvestat( fea, 'fid', fid, 'maxnit', 50 ); % Call to stationary solver.
else
[fea.sol.u,fea.sol.t] = solvetime( fea, 'fid', fid, 'ischeme', opt.ischeme, 'tmax', 8 ); % Call to stationary solver.
end
end
% Postprocessing.
s_velm = 'sqrt(u^2+v^2)';
if ( opt.iplot>0 )
figure
subplot(3,1,1)
postplot(fea,'surfexpr',s_velm,'evaltype','exact')
title('Velocity field')
subplot(3,1,2)
postplot(fea,'surfexpr','p','evaltype','exact')
title('Pressure')
subplot(3,1,3)
postplot(fea,'surfexpr','vx-uy','evaltype','exact','isoexpr',s_velm,'isolev',30)
title('Vorticity')
end
% Error checking.
vort = evalexpr('vx-uy',[0.53;0.564],fea);
out.aerr = -2.068-vort;
out.err = abs(out.aerr)/2.068;
out.pass = out.err < opt.tol;
if ( nargout==0 )
clear fea out
end