annotate +scheme/Burgers1D.m @ 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
children fae41958af4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 classdef Burgers1D < scheme.Scheme
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 properties
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 m % Number of points in each direction, possibly a vector
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 h % Grid spacing
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 x % Grid
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 order % Order accuracy for the approximation
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 D % Non-stabalized scheme operator
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 M % Derivative norm
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 H % Discrete norm
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 Hi % Norm inverse
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 e_l
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 e_r
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 d_l
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 d_r
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 params % Parameters for the coefficient matrices
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 methods
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 function obj = Burgers1D(m, order, xlim, params)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 [x, h] = util.get_grid(xlim{:},m);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 ops = sbp.D2Variable(m, xlim, order);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24 obj.m = m;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 obj.h = h;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26 obj.order = order;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 obj.x = x;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 D1 = ops.D1;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30 obj.D = @(v)(-1/3*v.*D1*v - 1/3*D1*v.^2 + ops.D2(params.eps)*v);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 obj.M = ops.M;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32 obj.H = ops.H;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 obj.Hi = ops.HI;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 obj.e_l = ops.e_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 obj.e_r = ops.e_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 obj.d_l = ops.d1_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 obj.d_r = ops.d1_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 obj.params = params;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 % Closure functions return the opertors applied to the own doamin to close the boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other domain.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 % type is a string specifying the type of boundary condition if there are several.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 % data is a function returning the data that should be applied at the boundary.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 % neighbour_scheme is an instance of Scheme that should be interfaced to.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 % neighbour_boundary is a string specifying which boundary to interface to.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 function [closure, penalty] = boundary_condition(obj,boundary,type,data)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49 default_arg('type','robin');
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 default_arg('data',0);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 [e, s, d] = obj.get_boundary_ops(boundary);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 switch type
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 % Stable robin-like boundary conditions ((u+-abs(u))*u/3 - eps*u_x)) with +- at left/right boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 case {'R','robin'}
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 p = s*obj.Hi*e;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 closure = @(v) p*(e'*((v-s*abs(v))/3)*(e'*v) - e'*obj.params.eps*d'*v);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 switch class(data)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 case 'double'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 penalty = s*p*data;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 case 'function_handle'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 penalty = @(t) s*p*data(t);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 error('Wierd data argument!')
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 % Unknown, boundary condition
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
67 error('No such boundary condition: type = %s',type);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 % Ruturns the boundary ops and sign for the boundary specified by the string boundary.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 % The right boundary is considered the positive boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73 function [e, s, d] = get_boundary_ops(obj,boundary)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
74 switch boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 case 'l'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76 e = obj.e_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
77 s = -1;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 d = obj.d_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 case 'r'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 e = obj.e_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
81 s = 1;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82 d = obj.d_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84 error('No such boundary: boundary = %s',boundary);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
85 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
86 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
87
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 error('An interface function does not exist yet');
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
92 function N = size(obj)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
93 N = obj.m;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
95
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
96 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
97 end