|
FEATool Multiphysics
v1.17.5
Finite Element Analysis Toolbox
|
EX_CONVDIFF4 1D Burgers equation (convection and diffusion) example.
[ FEA, OUT ] = EX_CONVDIFF4( VARARGIN ) 1D Burgers equation with steady solution, u_t + (b*u-c)*u_x - nu*u_xx = 0 with exact solution c/b*(1-tanh(c/(2*nu)*(x-x0))). Tests both time dependent and steady solvers. Accepts the following property/value pairs.
Input Value/{Default} Description
-----------------------------------------------------------------------------------
b scalar {1.0} Strength of nonlinearity
c scalar {0.13} Convection velocity
nu scalar {0.01} Diffusion coefficient
x0 scalar {0.5} Posision of smooth shock
hmax scalar {1/25} Max grid cell size
ischeme scalar {-1} Solver scheme (<0 = stationary)
nsolve scalar {2} Nonlinear solver (when ischeme<0)
dt scalar {0.1} Time step 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
cOptDef = { ...
'b', 1.0; ...
'c', 0.13; ...
'nu', 0.01; ...
'x0', 0.5; ...
'hmax', 1/20; ...
'ischeme' -1; ...
'nsolve' 2; ...
'dt' 0.1; ...
'sfun', 'sflag1'; ...
'iplot', 1; ...
'tol', 1e-2; ...
'fid', 1 };
[got,opt] = parseopt(cOptDef,varargin{:});
fid = opt.fid;
b = opt.b;
c = opt.c;
nu = opt.nu;
x0 = opt.x0;
refsol = [num2str(c/b),'*(1-tanh(',num2str(c/(2*nu)),'*(x-',num2str(x0),')))'];
bcd1 = c/b*(1-tanh((c/(2*nu)*(0-x0))));
bcd2 = c/b*(1-tanh((c/(2*nu)*(1-x0))));
% Grid generation.
fea.grid = linegrid( 1/opt.hmax, 0, 1 );
% Problem definition.
fea.sdim = { 'x' };
fea = addphys( fea, @convectiondiffusion );
fea.phys.cd.sfun = { opt.sfun };
fea.phys.cd.eqn.coef{2,4} = { opt.nu };
fea.phys.cd.eqn.coef{3,4} = { [num2str(b),'*c-',num2str(c)] };
fea = parsephys(fea);
% Parse and solve problem.
fea = parseprob( fea );
fea.bdr.d{1} = bcd1;
fea.bdr.d{2} = bcd2;
fea.bdr.n = cell(1,2);
x = fea.grid.p';
if( strcmp( opt.sfun,'sflag2' ) )
x = [ x; (x(2:end)+x(1:end-1))/2 ];
end
if( opt.ischeme<0 )
init = 0;
jac.form = {[1;1]};
jac.coef = {[num2str(b),'*cx']};
fea.sol.u = solvestat( fea, 'fid', fid, 'init', init, 'maxnit', 1000, 'nsolve', 2, 'jac', jac, 'nsolve', opt.nsolve );
else
init = [num2str(bcd1),'+x*',num2str(bcd2-bcd1)];
[fea.sol.u,tlist] = solvetime( fea, 'fid', fid, 'init', init, 'ischeme', opt.ischeme, 'tstep', opt.dt, 'tmax', 10 );
end
% Postprocessing.
if( opt.iplot>0 )
figure
i_sol = size(fea.sol.u,2);
[~,ix] = sort( x );
postplot( fea, 'surfexpr', 'c', 'solnum', i_sol );
hold on
u_r = real( eval( refsol ) );
plot( sort(x), u_r(ix), 'r--' );
title( 'Steady solution' )
xlabel( 'x' )
drawnow
end
% Error checking.
i_sol = size(fea.sol.u,2);
u_i = fea.sol.u(:,i_sol);
u_r = real( eval( refsol ) );
errnm = norm( u_i - u_r )/norm( u_r );
out.err = errnm;
out.pass = all( errnm<opt.tol );
if ( nargout==0 )
clear fea out
end