changeset 263:21a180acbd49 operator_remake

Renamed standard class to D2Standard etc, Rewrote class properties.
author Martin Almquist <martin.almquist@it.uu.se>
date Thu, 08 Sep 2016 17:50:30 +0200
parents 23051a86faa4
children 8a625c5a3633
files +sbp/D1Upwind.m +sbp/D2.m +sbp/D2BlockNorm.m +sbp/D2Standard.m +sbp/D2Variable.m +sbp/D4.m +sbp/D4Compatible.m +sbp/D4CompatibleVariable.m +sbp/D4Standard.m +sbp/OpSet.m
diffstat 10 files changed, 285 insertions(+), 270 deletions(-) [+]
line wrap: on
line diff
--- a/+sbp/D1Upwind.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/D1Upwind.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,56 +1,55 @@
 classdef D1Upwind < sbp.OpSet
     properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
         m % Number of grid points.
         h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
     end
 
     methods
-        function obj = D1Upwind(m,h,order)
+        function obj = D1Upwind(m,L,order)
+            
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
 
             switch order
                 case 2
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_2(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_2(m,obj.h);
                 case 3
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_3(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_3(m,obj.h);
                 case 4
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_4(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_4(m,obj.h);
                 case 5
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_5(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_5(m,obj.h);
                 case 6
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_6(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_6(m,obj.h);
                 case 7
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_7(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_7(m,obj.h);
                 case 8
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_8(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_8(m,obj.h);
                 case 9
-                    [H, HI, Dp, Dm, e_1, e_m] = ...
-                        sbp.implementations.d1_upwind_9(m,h);
+                    [obj.H, obj.HI, obj.Dp, obj.Dm, obj.e_1, obj.e_m] = ...
+                        sbp.implementations.d1_upwind_9(m,obj.h);
                 otherwise
                     error('Invalid operator order %d.',order);
             end
 
-            obj.h = h;
             obj.m = m;
-
-            obj.norms.H = H;
-            obj.norms.HI = HI;
+        	obj.borrowing = [];
 
-            obj.boundary.e_1 = e_1;
-            obj.boundary.e_m = e_m;
-
-            obj.derivatives.Dp = Dp;
-            obj.derivatives.Dm = Dm;
         end
     end
 
--- a/+sbp/D2.m	Thu Sep 08 15:37:48 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-classdef D2 < sbp.OpSet
-    properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
-        m % Number of grid points.
-        h % Step size
-    end
-
-    methods
-        function obj = D2(m,h,order)
-
-            if order == 2
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary2(m,h);
-                obj.borrowing.M.S = 0.4000;
-            elseif order == 4
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary4(m,h);
-                obj.borrowing.M.S = 0.2508;
-            elseif order == 6
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary6(m,h);
-                obj.borrowing.M.S = 0.1878;
-            elseif order == 8
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary8(m,h);
-                obj.borrowing.M.S = 0.0015;
-            elseif order == 10
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary10(m,h);
-                obj.borrowing.M.S = 0.0351;
-            elseif order == 12
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = sbp.implementations.ordinary12(m,h);
-                obj.borrowing.M.S = []; % Need to compute!
-            else
-                error('Invalid operator order %d.',order);
-            end
-
-            obj.h = h;
-            obj.m = m;
-
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            obj.norms.Q = Q;
-            obj.norms.M = M;
-
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-
-            obj.derivatives.D1 = D1;
-            obj.derivatives.D2 = D2;
-
-        end
-    end
-    methods (Static)
-        function lambda = smallestGrid(obj)
-            error('Not implmented')
-        end
-    end
-
-end
-
-
-
-
-
--- a/+sbp/D2BlockNorm.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/D2BlockNorm.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,50 +1,51 @@
 classdef D2BlockNorm < sbp.OpSet
     properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
         m % Number of grid points.
         h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
     end
 
 
 
     methods
-        function obj = D2BlockNorm(m,h,order)
+        function obj = D2BlockNorm(m,L,order)
+
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
 
             if order == 4
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = ...
-                    sbp.implementations.d2_blocknorm_4(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                 obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] = ...
+                    sbp.implementations.d2_blocknorm_4(m,obj.h);
             elseif order == 6
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = ...
-                    sbp.implementations.d2_blocknorm_6(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                 obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] = ...
+                    sbp.implementations.d2_blocknorm_6(m,obj.h);
             elseif order == 8
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = ...
-                    sbp.implementations.d2_blocknorm_8(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                 obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] = ...
+                    sbp.implementations.d2_blocknorm_8(m,obj.h);
             elseif order == 10
-                [H, HI, D1, D2, e_1, e_m, M, Q, S_1, S_m] = ...
-                    sbp.implementations.d2_blocknorm_10(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                 obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] = ...
+                    sbp.implementations.d2_blocknorm_10(m,obj.h);
             else
                 error('Invalid operator order %d.',order);
             end
 
-            obj.h = h;
             obj.m = m;
 
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            obj.norms.Q = Q;
-            obj.norms.M = M;
-
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-
-            obj.derivatives.D1 = D1;
-            obj.derivatives.D2 = D2;
         end
     end
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+sbp/D2Standard.m	Thu Sep 08 17:50:30 2016 +0200
@@ -0,0 +1,71 @@
+classdef D2Standard < sbp.OpSet
+    properties
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
+        m % Number of grid points.
+        h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
+        
+    end
+
+    methods
+        function obj = D2Standard(m,L,order)
+
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
+
+            if order == 2
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary2(m,obj.h);
+                obj.borrowing.M.S = 0.4000;
+            elseif order == 4
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary4(m,obj.h);
+                obj.borrowing.M.S = 0.2508;
+            elseif order == 6
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary6(m,obj.h);
+                obj.borrowing.M.S = 0.1878;
+            elseif order == 8
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary8(m,obj.h);
+                obj.borrowing.M.S = 0.0015;
+            elseif order == 10
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary10(m,obj.h);
+                obj.borrowing.M.S = 0.0351;
+            elseif order == 12
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                obj.e_m, obj.M, obj.Q, obj.S_1, obj.S_m] =...
+                sbp.implementations.ordinary12(m,obj.h);
+                obj.borrowing.M.S = []; % Need to compute!
+            else
+                error('Invalid operator order %d.',order);
+            end
+
+            obj.m = m;
+
+        end
+    end
+
+
+end
+
+
+
+
+
--- a/+sbp/D2Variable.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/D2Variable.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,41 +1,39 @@
 classdef D2Variable < sbp.OpSet
     properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
         m % Number of grid points.
         h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
     end
 
     methods
-        function obj = D2Variable(m,h,order)
+        function obj = D2Variable(m,L,order)
+            
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
 
             switch order
                 case 4
-                    [H, HI, D1, D2, e_1, e_m, S_1, S_m] = ...
-                        sbp.implementations.d2_variable_4(m,h);
+                    [obj.H, obj.HI, obj.D1, obj.D2, obj.e_1,...
+                        obj.e_m, obj.S_1, obj.S_m] = ...
+                        sbp.implementations.d2_variable_4(m,obj.h);
                     obj.borrowing.M.S = 0.2505765857;
                 otherwise
                     error('Invalid operator order %d.',order);
             end
 
-            obj.h = h;
             obj.m = m;
-
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            % obj.norms.Q = Q;
-            % obj.norms.M = M;
-
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-
-            obj.derivatives.D1 = D1;
-            obj.derivatives.D2 = D2;
+            obj.M = [];
 
         end
     end
--- a/+sbp/D4.m	Thu Sep 08 15:37:48 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-classdef D4 < sbp.OpSet
-    properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
-        m % Number of grid points.
-        h % Step size
-    end
-
-
-
-    methods
-        function obj = D4(m,h,order)
-
-            if order == 4
-                [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1,...
-                    S2_m, S3_1, S3_m, S_1, S_m] = sbp.implementations.d4_4(m,h);
-                obj.borrowing.N.S2 = 0.5485;
-                obj.borrowing.N.S3 = 1.0882;
-            elseif order == 6
-                [H, HI, D1, D2, D3, D4, e_1, e_m, M, M4,Q, Q3, S2_1,...
-                    S2_m, S3_1, S3_m, S_1, S_m] = sbp.implementations.d4_6(m,h);
-                obj.borrowing.N.S2 = 0.3227;
-                obj.borrowing.N.S3 = 0.1568;
-            else
-                error('Invalid operator order %d.',order);
-            end
-
-            obj.h = h;
-            obj.m = m;
-
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            obj.norms.Q = Q;
-            obj.norms.M = M;
-            obj.norms.Q3 = Q3;
-            obj.norms.N = M4;
-
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-            obj.boundary.S2_1 = S2_1;
-            obj.boundary.S3_1 = S3_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-            obj.boundary.S2_m = S2_m;
-            obj.boundary.S3_m = S3_m;
-
-            obj.derivatives.D1 = D1;
-            obj.derivatives.D2 = D2;
-            obj.derivatives.D3 = D3;
-            obj.derivatives.D4 = D4;
-
-        end
-    end
-
-
-end
\ No newline at end of file
--- a/+sbp/D4Compatible.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/D4Compatible.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,57 +1,67 @@
 classdef D4Compatible < sbp.OpSet
     properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
+        D3 % SBP operator for third derivative
+        Q3 % Skew-symmetric matrix in third derivative
+        S2_1 % Left boundary second derivative
+        S2_m % Right boundary second derivative
+        D4 % SBP operator for fourth derivative
+        M4 % Norm matrix, fourth derivative
+        S3_1 % Left boundary third derivative
+        S3_m % Right boundary third derivative
         m % Number of grid points.
         h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
     end
 
 
 
     methods
-        function obj = D4Compatible(m,h,order)
+        function obj = D4Compatible(m,L,order)
+            
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
 
             if order == 2
-                [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m,...
-                    S_1, S_m] = sbp.implementations.d4_compatible_2(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D4, obj.e_1, obj.e_m, obj.M4,...
+                 obj.Q, obj.S2_1, obj.S2_m, obj.S3_1, obj.S3_m,...
+                    obj.S_1, obj.S_m] =...
+                    sbp.implementations.d4_compatible_2(m,obj.h);
                 obj.borrowing.N.S2 = 0.7500;
                 obj.borrowing.N.S3 = 0.3000;
             elseif order == 4
-                [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m,...
-                    S_1, S_m] = sbp.implementations.d4_compatible_4(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D4, obj.e_1, obj.e_m, obj.M4,...
+                 obj.Q, obj.S2_1, obj.S2_m, obj.S3_1, obj.S3_m,...
+                    obj.S_1, obj.S_m] =...
+                    sbp.implementations.d4_compatible_4(m,obj.h);
                 obj.borrowing.N.S2 = 0.4210;
                 obj.borrowing.N.S3 = 0.7080;
             elseif order == 6
-                [H, HI, D1, D4, e_1, e_m, M4, Q, S2_1, S2_m, S3_1, S3_m,...
-                    S_1, S_m] = sbp.implementations.d4_compatible_6(m,h);
+                [obj.H, obj.HI, obj.D1, obj.D4, obj.e_1, obj.e_m, obj.M4,...
+                 obj.Q, obj.S2_1, obj.S2_m, obj.S3_1, obj.S3_m,...
+                    obj.S_1, obj.S_m] =...
+                    sbp.implementations.d4_compatible_6(m,obj.h);
                 obj.borrowing.N.S2 = 0.06925;
                 obj.borrowing.N.S3 = 0.05128;
             else
                 error('Invalid operator order.');
             end
 
-            obj.h = h;
             obj.m = m;
 
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            obj.norms.Q = Q;
-            obj.norms.N = M4;
+            obj.D2 = [];
+            obj.D3 = [];
 
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-            obj.boundary.S2_1 = S2_1;
-            obj.boundary.S3_1 = S3_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-            obj.boundary.S2_m = S2_m;
-            obj.boundary.S3_m = S3_m;
-
-            obj.derivatives.D1 = D1;
-            obj.derivatives.D4 = D4;
 
         end
     end
--- a/+sbp/D4CompatibleVariable.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/D4CompatibleVariable.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,59 +1,67 @@
 classdef D4CompatibleVariable < sbp.OpSet
     properties
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
-        borrowing % Struct with borrowing limits for different norm matrices
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
+        D3 % SBP operator for third derivative
+        Q3 % Skew-symmetric matrix in third derivative
+        S2_1 % Left boundary second derivative
+        S2_m % Right boundary second derivative
+        D4 % SBP operator for fourth derivative
+        M4 % Norm matrix, fourth derivative
+        S3_1 % Left boundary third derivative
+        S3_m % Right boundary third derivative
         m % Number of grid points.
         h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
     end
 
 
 
     methods
-        function obj = D4CompatibleVariable(m,h,order)
+        function obj = D4CompatibleVariable(m,L,order)
+            
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
 
             if order == 2
-                [H, HI, ~, D2, ~, D4, e_1, e_m, M4, ~, S2_1, S2_m, S3_1,...
-                    S3_m, S_1, S_m] =...
-                    sbp.implementations.d4_compatible_halfvariable_2(m,h);
+                [obj.H, obj.HI, ~, obj.D2, ~, obj.D4, obj.e_1, obj.e_m,...
+                 obj.M4, ~, obj.S2_1, obj.S2_m, obj.S3_1,...
+                    obj.S3_m, obj.S_1, obj.S_m] =...
+                    sbp.implementations.d4_compatible_halfvariable_2(m,obj.h);
                 obj.borrowing.N.S2 = 1.2500;
                 obj.borrowing.N.S3 = 0.4000;
             elseif order == 4
-                [H, HI, D2, D4, e_1, e_m, M4, S2_1, S2_m, S3_1, S3_m, S_1,...
-                    S_m] =...
-                    sbp.implementations.d4_compatible_halfvariable_4(m,h);
+                [obj.H, obj.HI, obj.D2, obj.D4, obj.e_1, obj.e_m, obj.M4,...
+                 obj.S2_1, obj.S2_m, obj.S3_1, obj.S3_m, obj.S_1,...
+                    obj.S_m] =...
+                    sbp.implementations.d4_compatible_halfvariable_4(m,obj.h);
                 obj.borrowing.N.S2 = 0.5055;
                 obj.borrowing.N.S3 = 0.9290;
             elseif order == 6
-                [H, HI, D2, D4, e_1, e_m, M4, S2_1, S2_m, S3_1, S3_m, S_1,...
-                    S_m] =...
-                    sbp.implementations.d4_compatible_halfvariable_6(m,h);
+                [obj.H, obj.HI, obj.D2, obj.D4, obj.e_1, obj.e_m, obj.M4,...
+                 obj.S2_1, obj.S2_m, obj.S3_1, obj.S3_m, obj.S_1,...
+                    obj.S_m] =...
+                    sbp.implementations.d4_compatible_halfvariable_6(m,obj.h);
                 obj.borrowing.N.S2 = 0.3259;
                 obj.borrowing.N.S3 = 0.1580;
             else
                 error('Invalid operator order.');
             end
 
-            obj.h = h;
             obj.m = m;
-
-            obj.norms.H = H;
-            obj.norms.HI = HI;
-            obj.norms.N = M4;
+            
+            obj.D1 = [];
+            obj.D3 = [];
 
-            obj.boundary.e_1 = e_1;
-            obj.boundary.S_1 = S_1;
-            obj.boundary.S2_1 = S2_1;
-            obj.boundary.S3_1 = S3_1;
-
-            obj.boundary.e_m = e_m;
-            obj.boundary.S_m = S_m;
-            obj.boundary.S2_m = S2_m;
-            obj.boundary.S3_m = S3_m;
-
-            obj.derivatives.D2 = D2;
-            obj.derivatives.D4 = D4;
 
         end
     end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+sbp/D4Standard.m	Thu Sep 08 17:50:30 2016 +0200
@@ -0,0 +1,59 @@
+classdef D4Standard < sbp.OpSet
+    properties
+        D1 % SBP operator approximating first derivative
+        H % Norm matrix
+        HI % H^-1
+        Q % Skew-symmetric matrix
+        e_1 % Left boundary operator
+        e_m % Right boundary operator
+        D2 % SBP operator for second derivative
+        M % Norm matrix, second derivative
+        S_1 % Left boundary first derivative
+        S_m % Right boundary first derivative
+        D3 % SBP operator for third derivative
+        Q3 % Skew-symmetric matrix in third derivative
+        S2_1 % Left boundary second derivative
+        S2_m % Right boundary second derivative
+        D4 % SBP operator for fourth derivative
+        M4 % Norm matrix, fourth derivative
+        S3_1 % Left boundary third derivative
+        S3_m % Right boundary third derivative
+        m % Number of grid points.
+        h % Step size
+        x % grid
+        borrowing % Struct with borrowing limits for different norm matrices
+    end
+
+
+
+    methods
+        function obj = D4Standard(m,L,order)
+            
+            obj.h = L/(m-1);
+            obj.x = linspace(0,L,m)';
+
+            if order == 4
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.D3, obj.D4,...
+                 obj.e_1, obj.e_m, obj.M, obj.M4, obj.Q, obj.Q3, obj.S2_1,...
+                 obj.S2_m, obj.S3_1, obj.S3_m, obj.S_1, obj.S_m] = ...
+                  sbp.implementations.d4_4(m,obj.h);
+                obj.borrowing.N.S2 = 0.5485;
+                obj.borrowing.N.S3 = 1.0882;
+            elseif order == 6
+                [obj.H, obj.HI, obj.D1, obj.D2, obj.D3, obj.D4,...
+                 obj.e_1, obj.e_m, obj.M, obj.M4, obj.Q, obj.Q3, obj.S2_1,...
+                 obj.S2_m, obj.S3_1, obj.S3_m, obj.S_1, obj.S_m] = ...
+                  sbp.implementations.d4_6(m,obj.h);
+                obj.borrowing.N.S2 = 0.3227;
+                obj.borrowing.N.S3 = 0.1568;
+            else
+                error('Invalid operator order %d.',order);
+            end
+
+            obj.m = m;
+
+        end
+    end
+
+
+end
\ No newline at end of file
--- a/+sbp/OpSet.m	Thu Sep 08 15:37:48 2016 +0200
+++ b/+sbp/OpSet.m	Thu Sep 08 17:50:30 2016 +0200
@@ -1,15 +1,9 @@
 classdef (Abstract) OpSet
     properties (Abstract)
-        norms % Struct containing norm matrices such as H,Q, M
-        boundary  % Struct contanging vectors for boundry point approximations
-        derivatives % Struct containging differentiation operators
         borrowing % Struct with borrowing limits for different norm matrices
         m % Number of grid points.
         h % Step size
-    end
-
-    methods (Abstract)
-
+        x % Grid
     end
 
 end
\ No newline at end of file