annotate +scheme/AdvectionRV1D.m @ 1023:defc9d0cc1f2 feature/advectionRV

Remove incorrect assertion of the number of BC:s
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 07 Jan 2019 12:06:49 +0100
parents 1e437c9e5132
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1010
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 classdef AdvectionRV1D < scheme.Scheme
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 properties
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 grid % Physical grid
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 order % Order accuracy for the approximation
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 D % Non-stabalized scheme operator
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 H % Discrete norm
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 Hi % Norm inverse
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 e_l
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 e_r
1012
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
11
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
12 D2_visc % Artificial viscosity operator
1010
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 methods
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 function obj = AdvectionRV1D(grid, operator_type, order, waveSpeed)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 m = grid.size();
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 lim = grid.lim{1}; % Ugly, and only applicable for cartesian grids.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 switch operator_type
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 case 'upwind+'
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 ops = sbp.D1Upwind(m, lim, order);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 D1 = (ops.Dp + ops.Dm)/2;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 B = ops.e_r*ops.e_r' - ops.e_l*ops.e_l';
1012
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
24 obj.D2_visc = @(viscosity) ops.Dm*spdiag(viscosity)*ops.Dp-ops.HI*(B*spdiag(viscosity)*ops.Dp);
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
25 % max(abs()) or just abs()?
1010
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26 DissipationOp = spdiag(abs(waveSpeed))*(ops.Dp-ops.Dm)/2;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 otherwise
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 error('Other operator types not yet supported', operator_type);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 end
1012
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
30
1e437c9e5132 Create residual viscosity package +rv and generalize the ResidualViscosity class
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1010
diff changeset
31 obj.D = -D1 + DissipationOp;
1010
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 obj.grid = grid;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 obj.order = order;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 obj.H = ops.H;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 obj.Hi = ops.HI;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 obj.e_l = ops.e_l;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 obj.e_r = ops.e_r;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 % Closure functions return the operators applied to the own doamin to close the boundary
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 % Penalty functions return the operators to force the solution. In the case of an interface it returns the operator applied to the other domain.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 % type is a string specifying the type of boundary condition if there are several.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 % data is a function returning the data that should be applied at the boundary.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 function [closure, penalty] = boundary_condition(obj,boundary,type,data)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 default_arg('type','robin');
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49 default_arg('data',0);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 [e, s] = obj.get_boundary_ops(boundary);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 switch type
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 case {'D', 'dirichlet'}
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 p = s*obj.Hi*e;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 closure = p*e';
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 otherwise
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 error('No such boundary condition: type = %s',type);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 switch class(data)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 case 'double'
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 penalty = s*p*data;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 case 'function_handle'
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 penalty = @(t) s*p*data(t);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 otherwise
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 error('Wierd data argument!')
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
67
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 % Ruturns the boundary ops, boundary index and sign for the boundary specified by the string boundary.
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 % The right boundary is considered the positive boundary
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70 function [e, s] = get_boundary_ops(obj,boundary)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 switch boundary
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 case 'l'
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73 e = obj.e_l;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
74 s = -1;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 case 'r'
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76 e = obj.e_r;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
77 s = 1;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 otherwise
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 error('No such boundary: boundary = %s',boundary);
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
81 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84 error('An interface function does not exist yet');
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
85 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
86
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
87 function N = size(obj)
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 N = obj.grid.m;
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90 end
f753bada1a46 Add 1D scheme for advection with RV
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91 end