changeset 1228:ef08adea56c4 feature/volcano

Utilize grid module in Hypsyst3d. Pass cartesian grid and replace some of the previous functionality in Hypsyst3d with properties/methods for cartesian grids.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 18 Nov 2019 10:31:58 -0800
parents 0652b34f9f27
children e1f9bedd64a9
files +scheme/Hypsyst3d.m
diffstat 1 files changed, 71 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
diff -r 0652b34f9f27 -r ef08adea56c4 +scheme/Hypsyst3d.m
--- a/+scheme/Hypsyst3d.m	Tue Nov 12 09:00:48 2019 -0800
+++ b/+scheme/Hypsyst3d.m	Mon Nov 18 10:31:58 2019 -0800
@@ -1,14 +1,11 @@
 classdef Hypsyst3d < scheme.Scheme
     properties
-        m % Number of points in each direction, possibly a vector
-        n % Size of system
-        h % Grid spacing
-        grid %TODO: Abstract class requires a grid. Pass Cartesian grid to function instead
-        x, y, z % Grid
-        X, Y, Z% Values of x and y for each grid point
+        grid
         Yx, Zx, Xy, Zy, Xz, Yz %Grid values for boundary surfaces
         order % Order accuracy for the approximation
 
+        nEquations
+
         D % non-stabilized scheme operator
         A, B, C, E % Symbolic coefficient matrices
         Aevaluated,Bevaluated,Cevaluated, Eevaluated
@@ -24,23 +21,21 @@
 
     methods
         % Solving Hyperbolic systems on the form u_t=-Au_x-Bu_y-Cu_z-Eu
-        function obj = Hypsyst3d(m, lim, order, A, B, C, E, params, operator)
+        function obj = Hypsyst3d(cartesianGrid, order, A, B, C, E, params, operator)
+            assertType(cartesianGrid, 'grid.Cartesian');
             default_arg('E', [])
-            xlim =  lim{1};
-            ylim = lim{2};
-            zlim = lim{3};
-
-            if length(m) == 1
-                m = [m m m];
-            end
+            obj.grid = cartesianGrid;
+            xlim =  obj.grid.lim{1};
+            ylim = obj.grid.lim{2};
+            zlim = obj.grid.lim{3};
 
             obj.A = A;
             obj.B = B;
             obj.C = C;
             obj.E = E;
-            m_x = m(1);
-            m_y = m(2);
-            m_z = m(3);
+            m_x = obj.grid.m(1);
+            m_y = obj.grid.m(2);
+            m_z = obj.grid.m(3);
             obj.params = params;
 
             switch operator
@@ -54,29 +49,29 @@
                     ops_z = sbp.D2Standard(m_z,zlim,order);
             end
 
-            obj.x = ops_x.x;
-            obj.y = ops_y.x;
-            obj.z = ops_z.x;
-
-            obj.X = kr(obj.x,ones(m_y,1),ones(m_z,1));
-            obj.Y = kr(ones(m_x,1),obj.y,ones(m_z,1));
-            obj.Z = kr(ones(m_x,1),ones(m_y,1),obj.z);
+            x = obj.grid.x{1};
+            y = obj.grid.x{2};
+            z = obj.grid.x{3};
+            points = obj.grid.points();
+            X = points(:, 1);
+            Y = points(:, 2);
+            Z = points(:, 3);
 
-            obj.Yx = kr(obj.y,ones(m_z,1));
-            obj.Zx = kr(ones(m_y,1),obj.z);
-            obj.Xy = kr(obj.x,ones(m_z,1));
-            obj.Zy = kr(ones(m_x,1),obj.z);
-            obj.Xz = kr(obj.x,ones(m_y,1));
-            obj.Yz = kr(ones(m_z,1),obj.y);
+            obj.Yx = kr(y, ones(m_z,1));
+            obj.Zx = kr(ones(m_y,1), z);
+            obj.Xy = kr(x, ones(m_z,1));
+            obj.Zy = kr(ones(m_x,1), z);
+            obj.Xz = kr(x, ones(m_y,1));
+            obj.Yz = kr(ones(m_z,1), y);
 
-            obj.Aevaluated = obj.evaluateCoefficientMatrix(A, obj.X, obj.Y,obj.Z);
-            obj.Bevaluated = obj.evaluateCoefficientMatrix(B, obj.X, obj.Y,obj.Z);
-            obj.Cevaluated = obj.evaluateCoefficientMatrix(C, obj.X, obj.Y,obj.Z);
-            obj.Eevaluated = obj.evaluateCoefficientMatrix(E, obj.X, obj.Y,obj.Z);
+            obj.Aevaluated = obj.evaluateCoefficientMatrix(A, X, Y, Z);
+            obj.Bevaluated = obj.evaluateCoefficientMatrix(B, X, Y, Z);
+            obj.Cevaluated = obj.evaluateCoefficientMatrix(C, X, Y, Z);
+            obj.Eevaluated = obj.evaluateCoefficientMatrix(E, X, Y, Z);
 
-            obj.n = length(A(obj.params,0,0,0));
+            obj.nEquations = length(A(obj.params,0,0,0));
 
-            I_n = speye(obj.n);
+            I_n = speye(obj.nEquations);
             I_x = speye(m_x);
             obj.I_x = I_x;
             I_y = speye(m_y);
@@ -99,15 +94,13 @@
             obj.e_b = kr(I_n, I_x, I_y, ops_z.e_l);
             obj.e_t = kr(I_n, I_x, I_y, ops_z.e_r);
 
-            obj.m = m;
-            obj.h = [ops_x.h ops_y.h ops_x.h];
             obj.order = order;
 
             switch operator
                 case 'upwind'
-                    alphaA = max(abs(eig(A(params,obj.x(end),obj.y(end),obj.z(end)))));
-                    alphaB = max(abs(eig(B(params,obj.x(end),obj.y(end),obj.z(end)))));
-                    alphaC = max(abs(eig(C(params,obj.x(end),obj.y(end),obj.z(end)))));
+                    alphaA = max(abs(eig(A(params, x(end), y(end), z(end)))));
+                    alphaB = max(abs(eig(B(params, x(end), y(end), z(end)))));
+                    alphaC = max(abs(eig(C(params, x(end), y(end), z(end)))));
 
                     Ap = (obj.Aevaluated+alphaA*I_N)/2;
                     Am = (obj.Aevaluated-alphaA*I_N)/2;
@@ -191,7 +184,7 @@
         end
 
         function N = size(obj)
-            N = obj.m;
+            N = obj.grid.m;
         end
 
         function [ret] = evaluateCoefficientMatrix(obj, mat, X, Y, Z)
@@ -219,6 +212,10 @@
 
         function [BM] = boundary_matrices(obj,boundary)
             params = obj.params;
+            points = obj.grid.points();
+            X = points(:, 1);
+            Y = points(:, 2);
+            Z = points(:, 3);
 
             switch boundary
                 case {'w','W','west'}
@@ -226,42 +223,42 @@
                     mat = obj.A;
                     BM.boundpos = 'l';
                     BM.Hi = obj.Hxi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.X(1),obj.Yx,obj.Zx);
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,X(1),obj.Yx,obj.Zx);
                     BM.side = length(obj.Yx);
                 case {'e','E','east'}
                     BM.e_ = obj.e_e;
                     mat = obj.A;
                     BM.boundpos = 'r';
                     BM.Hi = obj.Hxi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.X(end),obj.Yx,obj.Zx);
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,X(end),obj.Yx,obj.Zx);
                     BM.side = length(obj.Yx);
                 case {'s','S','south'}
                     BM.e_ = obj.e_s;
                     mat = obj.B;
                     BM.boundpos = 'l';
                     BM.Hi = obj.Hyi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xy,obj.Y(1),obj.Zy);
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xy,Y(1),obj.Zy);
                     BM.side = length(obj.Xy);
                 case {'n','N','north'}
                     BM.e_ = obj.e_n;
                     mat = obj.B;
                     BM.boundpos = 'r';
                     BM.Hi = obj.Hyi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xy,obj.Y(end),obj.Zy);
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xy,Y(end),obj.Zy);
                     BM.side = length(obj.Xy);
                 case{'b','B','Bottom'}
                     BM.e_ = obj.e_b;
                     mat = obj.C;
                     BM.boundpos = 'l';
                     BM.Hi = obj.Hzi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xz,obj.Yz,obj.Z(1));
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xz,obj.Yz,Z(1));
                     BM.side = length(obj.Xz);
                 case{'t','T','Top'}
                     BM.e_ = obj.e_t;
                     mat = obj.C;
                     BM.boundpos = 'r';
                     BM.Hi = obj.Hzi;
-                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xz,obj.Yz,obj.Z(end));
+                    [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.Xz,obj.Yz,Z(end));
                     BM.side = length(obj.Xz);
             end
             BM.pos = signVec(1); BM.zeroval=signVec(2); BM.neg=signVec(3);
@@ -281,15 +278,15 @@
 
             switch BM.boundpos
                 case {'l'}
-                    tau = sparse(obj.n*side,pos);
+                    tau = sparse(obj.nEquations*side,pos);
                     Vi_plus = Vi(1:pos,:);
                     tau(1:pos,:) = -abs(D(1:pos,1:pos));
                     closure = Hi*e_*V*tau*Vi_plus*e_';
                     penalty = -Hi*e_*V*tau*Vi_plus;
                 case {'r'}
-                    tau = sparse(obj.n*side,neg);
-                    tau((pos+zeroval)+1:obj.n*side,:) = -abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side));
-                    Vi_minus = Vi((pos+zeroval)+1:obj.n*side,:);
+                    tau = sparse(obj.nEquations*side,neg);
+                    tau((pos+zeroval)+1:obj.nEquations*side,:) = -abs(D((pos+zeroval)+1:obj.nEquations*side,(pos+zeroval)+1:obj.nEquations*side));
+                    Vi_minus = Vi((pos+zeroval)+1:obj.nEquations*side,:);
                     closure = Hi*e_*V*tau*Vi_minus*e_';
                     penalty = -Hi*e_*V*tau*Vi_minus;
             end
@@ -307,41 +304,45 @@
             D = BM.D;
             e_ = BM.e_;
 
+            x = obj.grid.x{1};
+            y = obj.grid.x{2};
+            z = obj.grid.x{3};
+
             switch boundary
                 case {'w','W','west'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.x(1),obj.Yx,obj.Zx);
+                    L = obj.evaluateCoefficientMatrix(L,x(1),obj.Yx,obj.Zx);
                 case {'e','E','east'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.x(end),obj.Yx,obj.Zx);
+                    L = obj.evaluateCoefficientMatrix(L,x(end),obj.Yx,obj.Zx);
                 case {'s','S','south'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.Xy,obj.y(1),obj.Zy);
+                    L = obj.evaluateCoefficientMatrix(L,obj.Xy,y(1),obj.Zy);
                 case {'n','N','north'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.Xy,obj.y(end),obj.Zy);% General boundary condition in the form Lu=g(x)
+                    L = obj.evaluateCoefficientMatrix(L,obj.Xy,y(end),obj.Zy);% General boundary condition in the form Lu=g(x)
                 case {'b','B','bottom'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.Xz,obj.Yz,obj.z(1));
+                    L = obj.evaluateCoefficientMatrix(L,obj.Xz,obj.Yz, z(1));
                 case {'t','T','top'}
-                    L = obj.evaluateCoefficientMatrix(L,obj.Xz,obj.Yz,obj.z(end));
+                    L = obj.evaluateCoefficientMatrix(L,obj.Xz,obj.Yz, z(end));
             end
 
             switch BM.boundpos
                 case {'l'}
-                    tau = sparse(obj.n*side,pos);
+                    tau = sparse(obj.nEquations*side,pos);
                     Vi_plus = Vi(1:pos,:);
-                    Vi_minus = Vi(pos+zeroval+1:obj.n*side,:);
+                    Vi_minus = Vi(pos+zeroval+1:obj.nEquations*side,:);
                     V_plus = V(:,1:pos);
-                    V_minus = V(:,(pos+zeroval)+1:obj.n*side);
+                    V_minus = V(:,(pos+zeroval)+1:obj.nEquations*side);
 
                     tau(1:pos,:) = -abs(D(1:pos,1:pos));
                     R = -inv(L*V_plus)*(L*V_minus);
                     closure = Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_';
                     penalty = -Hi*e_*V*tau*inv(L*V_plus)*L;
                 case {'r'}
-                    tau = sparse(obj.n*side,neg);
-                    tau((pos+zeroval)+1:obj.n*side,:) = -abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side));
+                    tau = sparse(obj.nEquations*side,neg);
+                    tau((pos+zeroval)+1:obj.nEquations*side,:) = -abs(D((pos+zeroval)+1:obj.nEquations*side,(pos+zeroval)+1:obj.nEquations*side));
                     Vi_plus = Vi(1:pos,:);
-                    Vi_minus = Vi((pos+zeroval)+1:obj.n*side,:);
+                    Vi_minus = Vi((pos+zeroval)+1:obj.nEquations*side,:);
 
                     V_plus = V(:,1:pos);
-                    V_minus = V(:,(pos+zeroval)+1:obj.n*side);
+                    V_minus = V(:,(pos+zeroval)+1:obj.nEquations*side);
                     R = -inv(L*V_minus)*(L*V_plus);
                     closure = Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_';
                     penalty = -Hi*e_*V*tau*inv(L*V_minus)*L;
@@ -365,12 +366,12 @@
 
 
             side = max(length(x),length(y));
-            Dret = zeros(obj.n,side*obj.n);
-            Vret = zeros(obj.n,side*obj.n);
-            Viret= zeros(obj.n,side*obj.n);
+            Dret = zeros(obj.nEquations,side*obj.nEquations);
+            Vret = zeros(obj.nEquations,side*obj.nEquations);
+            Viret= zeros(obj.nEquations,side*obj.nEquations);
 
-            for ii=1:obj.n
-                for jj=1:obj.n
+            for ii=1:obj.nEquations
+                for jj=1:obj.nEquations
                     Dret(jj,(ii-1)*side+1:side*ii) = eval(D(jj,ii));
                     Vret(jj,(ii-1)*side+1:side*ii) = eval(V(jj,ii));
                     Viret(jj,(ii-1)*side+1:side*ii) = eval(Vi(jj,ii));