Mercurial > repos > public > sbplib
annotate +sbp/dissipationOperator.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | cda996e64925 |
children |
rev | line source |
---|---|
834
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
1 %% Function that constructs artificial dissipation operators using undivided differences |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
2 function D = dissipationOperator(m, order, Hinv, scaling) |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
3 % TBD: Add or remove D_2 and Dp/Dm? |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
4 % d2=[1 2 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
5 % D_2=(diag(ones(m-1,1),-1)-2*diag(ones(m,1),0)+ ... |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
6 % diag(ones(m-1,1),1)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
7 % D_2(1,1:3)=[d2];D_2(m,m-2:m)=[d2]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
8 % %Dm |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
9 % DD_m=(diag(ones(m-1,1),+1)-diag(ones(m,1),0)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
10 % DD_m(m,m-1:m)=[-1 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
11 % %Dp |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
12 % DD_p=(-diag(ones(m-1,1),-1)+diag(ones(m,1),0)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
13 % DD_p(1,1:2)=[-1 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
14 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
15 switch order |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
16 case 1 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
17 DD_1=(diag(ones(m-1,1),+1)-diag(ones(m,1),0)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
18 DD_1(m,m-1:m)=[-1 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
19 D = DD_2'*DD_2; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
20 case 2 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
21 dd2=0*[1 -2 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
22 DD_2=(diag(ones(m-1,1),-1)-2*diag(ones(m,1),0)+ ... |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
23 diag(ones(m-1,1),1)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
24 DD_2(1,1:3)=[dd2];DD_2(m,m-2:m)=[dd2]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
25 D = DD_2'*DD_2; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
26 case 3 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
27 d3=0*[-1 3 -3 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
28 DD_3=(-diag(ones(m-2,1),-2)+3*diag(ones(m-1,1),-1)-3*diag(ones(m,1),0)+ ... |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
29 diag(ones(m-1,1),1)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
30 DD_3(1:2,1:4)=[d3;d3]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
31 DD_3(m,m-3:m)=[d3]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
32 D = DD_3'*DD_3; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
33 case 4 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
34 default_arg('scaling', 1/12); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
35 d4=0*[1 -4 6 -4 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
36 DD_4=(diag(ones(m-2,1),2)-4*diag(ones(m-1,1),1)+6*diag(ones(m,1),0)-4*diag(ones(m-1,1),-1)+diag(ones(m-2,1),-2)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
37 DD_4(1:2,1:5)=[d4;d4];DD_4(m-1:m,m-4:m)=[d4;d4]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
38 D = DD_4'*DD_4; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
39 case 5 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
40 d5=0*[-1 5 -10 10 -5 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
41 DD_5=(-diag(ones(m-3,1),-3)+5*diag(ones(m-2,1),-2)-10*diag(ones(m-1,1),-1)+10*diag(ones(m,1),0)-5*diag(ones(m-1,1),1)+diag(ones(m-2,1),2)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
42 DD_5(1:3,1:6)=[d5;d5;d5]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
43 DD_5(m-1:m,m-5:m)=[d5;d5]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
44 D = DD_5'*DD_5; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
45 case 6 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
46 default_arg('scaling', 1/60); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
47 d6=0*[1 -6 15 -20 15 -6 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
48 DD_6=(diag(ones(m-3,1),3)-6*diag(ones(m-2,1),2)+15*diag(ones(m-1,1),1)-20*diag(ones(m,1),0)+15*diag(ones(m-1,1),-1)-6*diag(ones(m-2,1),-2)+diag(ones(m-3,1),-3)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
49 DD_6(1:3,1:7)=[d6;d6;d6];DD_6(m-2:m,m-6:m)=[d6;d6;d6]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
50 D = DD_6'*DD_6; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
51 case 7 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
52 d7=0*[-1 7 -21 35 -35 21 -7 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
53 DD_7=(-diag(ones(m-4,1),-4)+7*diag(ones(m-3,1),-3)-21*diag(ones(m-2,1),-2)+35*diag(ones(m-1,1),-1)-35*diag(ones(m,1),0)+21*diag(ones(m-1,1),1)-7*diag(ones(m-2,1),2)+diag(ones(m-3,1),3)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
54 DD_7(1:4,1:8)=[d7;d7;d7;d7]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
55 DD_7(m-2:m,m-7:m)=[d7;d7;d7]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
56 D = DD_7'*DD_7; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
57 case 9 |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
58 d9=0*[-1 9 -36 84 -126 126 -84 36 -9 1]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
59 DD_9=(-diag(ones(m-5,1),-5)+9*diag(ones(m-4,1),-4)-36*diag(ones(m-3,1),-3)+84*diag(ones(m-2,1),-2)-126*diag(ones(m-1,1),-1)+126*diag(ones(m,1),0)-84*diag(ones(m-1,1),1)+36*diag(ones(m-2,1),2)-9*diag(ones(m-3,1),3)+diag(ones(m-4,1),4)); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
60 DD_9(1:5,1:10)=[d9;d9;d9;d9;d9]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
61 DD_9(m-3:m,m-9:m)=[d9;d9;d9;d9]; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
62 D = DD_9'*DD_9; |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
63 otherwise |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
64 error('Order not yet supported', order); |
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
65 end |
853
cda996e64925
Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
834
diff
changeset
|
66 D = scaling*sparse(Hinv*D); |
834
f1f0bf087e1c
Add support for artificial viscosity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
67 end |