Mercurial > repos > public > sbplib
changeset 814:3a5e635a93fd feature/burgers1d
Add scheme for 1D Burgers equation
- Add scheme for discretizing the 1D burgers equation, with spatially variable coefficients.
author | Vidar Stiernstrom <vidar.stiernstrom@it.uu.se> |
---|---|
date | Mon, 03 Sep 2018 14:50:27 +0200 |
parents | 2ce903f28193 |
children | fae41958af4f |
files | +scheme/Burgers1D.m |
diffstat | 1 files changed, 97 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/+scheme/Burgers1D.m Mon Sep 03 14:50:27 2018 +0200 @@ -0,0 +1,97 @@ +classdef Burgers1D < scheme.Scheme + properties + m % Number of points in each direction, possibly a vector + h % Grid spacing + x % Grid + order % Order accuracy for the approximation + + D % Non-stabalized scheme operator + M % Derivative norm + H % Discrete norm + Hi % Norm inverse + e_l + e_r + d_l + d_r + params % Parameters for the coefficient matrices + end + + methods + function obj = Burgers1D(m, order, xlim, params) + [x, h] = util.get_grid(xlim{:},m); + ops = sbp.D2Variable(m, xlim, order); + + obj.m = m; + obj.h = h; + obj.order = order; + obj.x = x; + + D1 = ops.D1; + obj.D = @(v)(-1/3*v.*D1*v - 1/3*D1*v.^2 + ops.D2(params.eps)*v); + obj.M = ops.M; + obj.H = ops.H; + obj.Hi = ops.HI; + obj.e_l = ops.e_l; + obj.e_r = ops.e_r; + obj.d_l = ops.d1_l; + obj.d_r = ops.d1_r; + obj.params = params; + end + + % Closure functions return the opertors applied to the own doamin to close the boundary + % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other domain. + % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. + % type is a string specifying the type of boundary condition if there are several. + % data is a function returning the data that should be applied at the boundary. + % neighbour_scheme is an instance of Scheme that should be interfaced to. + % neighbour_boundary is a string specifying which boundary to interface to. + function [closure, penalty] = boundary_condition(obj,boundary,type,data) + default_arg('type','robin'); + default_arg('data',0); + [e, s, d] = obj.get_boundary_ops(boundary); + switch type + % Stable robin-like boundary conditions ((u+-abs(u))*u/3 - eps*u_x)) with +- at left/right boundary + case {'R','robin'} + p = s*obj.Hi*e; + closure = @(v) p*(e'*((v-s*abs(v))/3)*(e'*v) - e'*obj.params.eps*d'*v); + switch class(data) + case 'double' + penalty = s*p*data; + case 'function_handle' + penalty = @(t) s*p*data(t); + otherwise + error('Wierd data argument!') + end + % Unknown, boundary condition + otherwise + error('No such boundary condition: type = %s',type); + end + end + + % Ruturns the boundary ops and sign for the boundary specified by the string boundary. + % The right boundary is considered the positive boundary + function [e, s, d] = get_boundary_ops(obj,boundary) + switch boundary + case 'l' + e = obj.e_l; + s = -1; + d = obj.d_l; + case 'r' + e = obj.e_r; + s = 1; + d = obj.d_r; + otherwise + error('No such boundary: boundary = %s',boundary); + end + end + + function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) + error('An interface function does not exist yet'); + end + + function N = size(obj) + N = obj.m; + end + + end +end \ No newline at end of file