Mercurial > repos > public > sbplib
view +sbp/+implementations/d1_noneq_6.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 | f7ac3cd6eeaa |
children | 4cb627c7fb90 |
line wrap: on
line source
function [D1,H,x,h] = d1_noneq_6(N,L) % L: Domain length % N: Number of grid points if(nargin < 2) L = 1; end if(N<12) error('Operator requires at least 12 grid points'); end % BP: Number of boundary points % m: Number of nonequidistant spacings % order: Accuracy of interior stencil BP = 6; m = 3; order = 6; %%%% Non-equidistant grid points %%%%% x0 = 0.0000000000000e+00; x1 = 4.4090263368623e-01; x2 = 1.2855984345073e+00; x3 = 2.2638953951239e+00; x4 = 3.2638953951239e+00; x5 = 4.2638953951239e+00; x6 = 5.2638953951239e+00; xb = sparse(m+1,1); for i = 0:m xb(i+1) = eval(['x' num2str(i)]); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Compute h %%%%%%%%%% h = L/(2*xb(end) + N-1-2*m); %%%%%%%%%%%%%%%%%%%%%%%%% %%%% Define grid %%%%%%%% x = h*[xb; linspace(xb(end)+1,L/h-xb(end)-1,N-2*(m+1))'; L/h-flip(xb) ]; %%%%%%%%%%%%%%%%%%%%%%%%% %%%% Norm matrix %%%%%%%% P = sparse(BP,1); %#ok<*NASGU> P0 = 1.3030223027124e-01; P1 = 6.8851501587715e-01; P2 = 9.5166202564389e-01; P3 = 9.9103890475697e-01; P4 = 1.0028757074552e+00; P5 = 9.9950151111941e-01; for i = 0:BP-1 P(i+1) = eval(['P' num2str(i)]); end H = ones(N,1); H(1:BP) = P; H(end-BP+1:end) = flip(P); H = spdiags(h*H,0,N,N); %%%%%%%%%%%%%%%%%%%%%%%%% %%%% Q matrix %%%%%%%%%%% % interior stencil switch order case 2 d = [-1/2,0,1/2]; case 4 d = [1/12,-2/3,0,2/3,-1/12]; case 6 d = [-1/60,3/20,-3/4,0,3/4,-3/20,1/60]; case 8 d = [1/280,-4/105,1/5,-4/5,0,4/5,-1/5,4/105,-1/280]; case 10 d = [-1/1260,5/504,-5/84,5/21,-5/6,0,5/6,-5/21,5/84,-5/504,1/1260]; case 12 d = [1/5544,-1/385,1/56,-5/63,15/56,-6/7,0,6/7,-15/56,5/63,-1/56,1/385,-1/5544]; end d = repmat(d,N,1); Q = spdiags(d,-order/2:order/2,N,N); % Boundaries Q0_0 = -5.0000000000000e-01; Q0_1 = 6.6042071945824e-01; Q0_2 = -2.2104152954203e-01; Q0_3 = 7.6243679810093e-02; Q0_4 = -1.7298206716724e-02; Q0_5 = 1.6753369904210e-03; Q0_6 = 0.0000000000000e+00; Q0_7 = 0.0000000000000e+00; Q0_8 = 0.0000000000000e+00; Q1_0 = -6.6042071945824e-01; Q1_1 = 0.0000000000000e+00; Q1_2 = 8.7352798702787e-01; Q1_3 = -2.6581719253084e-01; Q1_4 = 5.7458484948314e-02; Q1_5 = -4.7485599871040e-03; Q1_6 = 0.0000000000000e+00; Q1_7 = 0.0000000000000e+00; Q1_8 = 0.0000000000000e+00; Q2_0 = 2.2104152954203e-01; Q2_1 = -8.7352798702787e-01; Q2_2 = 0.0000000000000e+00; Q2_3 = 8.1707122038457e-01; Q2_4 = -1.8881125503769e-01; Q2_5 = 2.4226492138960e-02; Q2_6 = 0.0000000000000e+00; Q2_7 = 0.0000000000000e+00; Q2_8 = 0.0000000000000e+00; Q3_0 = -7.6243679810093e-02; Q3_1 = 2.6581719253084e-01; Q3_2 = -8.1707122038457e-01; Q3_3 = 0.0000000000000e+00; Q3_4 = 7.6798636652679e-01; Q3_5 = -1.5715532552963e-01; Q3_6 = 1.6666666666667e-02; Q3_7 = 0.0000000000000e+00; Q3_8 = 0.0000000000000e+00; Q4_0 = 1.7298206716724e-02; Q4_1 = -5.7458484948314e-02; Q4_2 = 1.8881125503769e-01; Q4_3 = -7.6798636652679e-01; Q4_4 = 0.0000000000000e+00; Q4_5 = 7.5266872305402e-01; Q4_6 = -1.5000000000000e-01; Q4_7 = 1.6666666666667e-02; Q4_8 = 0.0000000000000e+00; Q5_0 = -1.6753369904210e-03; Q5_1 = 4.7485599871040e-03; Q5_2 = -2.4226492138960e-02; Q5_3 = 1.5715532552963e-01; Q5_4 = -7.5266872305402e-01; Q5_5 = 0.0000000000000e+00; Q5_6 = 7.5000000000000e-01; Q5_7 = -1.5000000000000e-01; Q5_8 = 1.6666666666667e-02; for i = 1:BP for j = 1:BP Q(i,j) = eval(['Q' num2str(i-1) '_' num2str(j-1)]); Q(N+1-i,N+1-j) = -eval(['Q' num2str(i-1) '_' num2str(j-1)]); end end %%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Difference operator %% D1 = H\Q; %%%%%%%%%%%%%%%%%%%%%%%%%%%