changeset 1031:2ef20d00b386 feature/advectionRV

For easier comparison, return both the first order and residual viscosity when evaluating the residual. Add the first order and residual viscosity to the state of the RungekuttaRV time steppers
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 17 Jan 2019 10:25:06 +0100
parents 78c75c95b7dd
children 1a5c8723c9be 037f203b9bf5 1f0f2276e678
files +rv/+time/RungekuttaExteriorRv.m +rv/+time/RungekuttaExteriorRvBdf.m +rv/+time/RungekuttaInteriorRv.m +rv/ResidualViscosity.m
diffstat 4 files changed, 32 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/+rv/+time/RungekuttaExteriorRv.m	Fri Jan 11 15:52:48 2019 +0100
+++ b/+rv/+time/RungekuttaExteriorRv.m	Thu Jan 17 10:25:06 2019 +0100
@@ -9,7 +9,6 @@
         
         % Properties related to the residual viscositys
         RV              % Residual Viscosity operator
-        viscosity       % Viscosity vector
         v_prev          % Solution vector at previous time levels, used for the RV evaluation
         DvDt            % Function for computing the time deriative used for the RV evaluation
         lowerBdfOrder   % Orders of the approximation of the time deriative, used for the RV evaluation.
@@ -18,9 +17,11 @@
                         % Dictates the order of accuracy used once the boot-strapping is complete.
         
         % Convenience properties. Only for plotting
-        residual
-        dvdt
-        Df
+        viscosity % Total viscosity
+        residualViscosity % Residual viscosity
+        firstOrderViscosity % first order viscosity
+        dvdt % Evaluated time derivative in residual
+        Df % Evaluated flux in residual
     end
     methods
 
@@ -38,8 +39,7 @@
             obj.RV = RV;
             obj.DvDt = DvDt;
             obj.dvdt = obj.DvDt(obj.v);
-            [obj.viscosity, obj.Df] = RV.evaluate(obj.v,obj.dvdt);
-            obj.residual = obj.dvdt + obj.Df;
+            [obj.viscosity,  obj.Df, obj.firstOrderViscosity, obj.residualViscosity] = RV.evaluate(obj.v,obj.dvdt);
         end
 
         function [v, t] = getV(obj)
@@ -48,13 +48,12 @@
         end
 
         function state = getState(obj)
-            state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t);
+            state = struct('v', obj.v, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 'residualViscosity', obj.residualViscosity, 'firstOrderViscosity', obj.firstOrderViscosity, 't', obj.t);
         end
 
         function obj = step(obj)            
             obj.dvdt = obj.DvDt(obj.v);
-            [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
-            obj.residual = obj.dvdt + obj.Df;
+            [obj.viscosity, obj.Df, obj.firstOrderViscosity, obj.residualViscosity] = obj.RV.evaluate(obj.v,obj.dvdt);
 
             % Fix the viscosity of the RHS function F
             F_visc = @(v,t) obj.F(v,t,obj.viscosity);
--- a/+rv/+time/RungekuttaExteriorRvBdf.m	Fri Jan 11 15:52:48 2019 +0100
+++ b/+rv/+time/RungekuttaExteriorRvBdf.m	Thu Jan 17 10:25:06 2019 +0100
@@ -9,7 +9,6 @@
         
         % Properties related to the residual viscositys
         RV              % Residual Viscosity operator
-        viscosity       % Viscosity vector
         v_prev          % Solution vector at previous time levels, used for the RV evaluation
         DvDt            % Function for computing the time deriative used for the RV evaluation
         lowerBdfOrder   % Orders of the approximation of the time deriative, used for the RV evaluation.
@@ -18,9 +17,11 @@
                         % Dictates the order of accuracy used once the boot-strapping is complete.
         
         % Convenience properties. Only for plotting
-        residual
-        dvdt
-        Df
+        viscosity % Total viscosity
+        residualViscosity % Residual viscosity
+        firstOrderViscosity % first order viscosity
+        dvdt % Evaluated time derivative in residual
+        Df % Evaluated flux in residual
     end
     methods
         function obj = RungekuttaExteriorRvBdf(F, k, t0, v0, RV, rkOrder, bdfOrders)
@@ -47,7 +48,8 @@
             obj.v_prev = [];
             obj.DvDt = rv.time.BdfDerivative();
             obj.viscosity = zeros(size(v0));
-            obj.residual = zeros(size(v0));
+            obj.firstOrderViscosity = zeros(size(v0));
+            obj.residualViscosity = zeros(size(v0));
             obj.dvdt = zeros(size(v0));
             obj.Df = zeros(size(v0));
         end
@@ -58,7 +60,7 @@
         end
 
         function state = getState(obj)
-            state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t);
+            state = struct('v', obj.v, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 'residualViscosity', obj.residualViscosity, 'firstOrderViscosity', obj.firstOrderViscosity, 't', obj.t);
         end
 
         function obj = step(obj)
@@ -81,8 +83,7 @@
             %Calculate dvdt and evaluate RV for the new time level
             if ((numStoredStages >=  obj.lowerBdfOrder) && (numStoredStages <= obj.upperBdfOrder))
                 obj.dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k);
-                [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
-                obj.residual = obj.dvdt + obj.Df;
+                [obj.viscosity, obj.Df, obj.firstOrderViscosity, obj.residualViscosity] = obj.RV.evaluate(obj.v,obj.dvdt);
             end
         end
     end
--- a/+rv/+time/RungekuttaInteriorRv.m	Fri Jan 11 15:52:48 2019 +0100
+++ b/+rv/+time/RungekuttaInteriorRv.m	Thu Jan 17 10:25:06 2019 +0100
@@ -7,12 +7,14 @@
         n       % Time level
         coeffs  % The coefficents used for the RK time integration
         RV      % Residual Viscosity
-        viscosity       % Viscosity vector
-        DvDt            % Function for computing the time deriative used for the RV evaluation
+        DvDt    % Function for computing the time deriative used for the RV evaluation
 
-        residual
-        dvdt
-        Df
+        % Convenience properties. Only for plotting
+        viscosity % Total viscosity
+        residualViscosity % Residual viscosity
+        firstOrderViscosity % first order viscosity
+        dvdt % Evaluated time derivative in residual
+        Df % Evaluated flux in residual
     end
 
     methods
@@ -29,8 +31,7 @@
             obj.RV = RV;
             obj.DvDt = DvDt;
             obj.dvdt = obj.DvDt(obj.v);
-            [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
-            obj.residual = obj.dvdt + obj.Df;
+            [obj.viscosity,  obj.Df, obj.firstOrderViscosity, obj.residualViscosity] = obj.RV.evaluate(obj.v,obj.dvdt);
         end
 
         function [v, t] = getV(obj)
@@ -39,7 +40,7 @@
         end
 
         function state = getState(obj)
-            state = struct('v', obj.v, 'residual', obj.residual, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 't', obj.t);
+            state = struct('v', obj.v, 'dvdt', obj.dvdt, 'Df', obj.Df, 'viscosity', obj.viscosity, 'residualViscosity', obj.residualViscosity, 'firstOrderViscosity', obj.firstOrderViscosity, 't', obj.t);
         end
 
         function obj = step(obj)
@@ -47,8 +48,7 @@
             obj.t = obj.t + obj.k;
             obj.n = obj.n + 1;
             obj.dvdt = obj.DvDt(obj.v);
-            [obj.viscosity, obj.Df] = obj.RV.evaluate(obj.v,obj.dvdt);
-            obj.residual = obj.dvdt + obj.Df;
+            [obj.viscosity,  obj.Df, obj.firstOrderViscosity, obj.residualViscosity] = obj.RV.evaluate(obj.v,obj.dvdt);
         end
     end
 end
\ No newline at end of file
--- a/+rv/ResidualViscosity.m	Fri Jan 11 15:52:48 2019 +0100
+++ b/+rv/ResidualViscosity.m	Thu Jan 17 10:25:06 2019 +0100
@@ -22,9 +22,12 @@
             obj.normalization = normalization;
         end
 
-        function [viscosity, Df] = evaluate(obj, v, dvdt)
+        function [viscosity, Df, firstOrderViscosity, residualViscosity] = evaluate(obj, v, dvdt)
             Df = obj.Df(v);
-            viscosity = min(obj.Cmax*obj.h*abs(obj.waveSpeed(v)), obj.Cres*obj.h^2*abs(dvdt + Df)/obj.normalization(v));
+            firstOrderViscosity = obj.Cmax*obj.h*abs(obj.waveSpeed(v));
+            residualViscosity = obj.Cres*obj.h^2*abs(dvdt + Df)/obj.normalization(v);
+            viscosity = min(firstOrderViscosity, residualViscosity);
+            %viscosity = obj.Cmax*obj.h*abs(obj.waveSpeed(v));
         end
     end
 end
\ No newline at end of file