changeset 1015:9b7fcd5e4480 feature/advectionRV

Debug ResidualViscosity - Pass exact time derivative to RungeKuttaExteriorRV and use that for evaluating the residual - Start bootstrapping from later time level with higher order bdf
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 06 Dec 2018 17:03:22 +0100
parents e547794a9407
children 4b42999874c0
files +rv/+time/RungekuttaExteriorRV.m +rv/ResidualViscosity.m
diffstat 2 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
diff -r e547794a9407 -r 9b7fcd5e4480 +rv/+time/RungekuttaExteriorRV.m
--- a/+rv/+time/RungekuttaExteriorRV.m	Thu Dec 06 11:30:47 2018 +0100
+++ b/+rv/+time/RungekuttaExteriorRV.m	Thu Dec 06 17:03:22 2018 +0100
@@ -10,10 +10,13 @@
         bdfOrder
         v_prev  % Solution vector at previous time levels, used for the RV update
         DvDt    % Function for computing the time deriative used for the RV update
+
+
+        dudt
     end
     methods
 
-        function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrder)
+        function obj = RungekuttaExteriorRV(F, k, t0, v0, RV, rkOrder, bdfOrder, dudt)
             obj.F = F;
             obj.k = k;
             obj.t = t0;
@@ -29,10 +32,12 @@
             %  TBD: Decide on if the initialization of the previous stages used by
             %       the BDF should be done here, or if it should be checked for each
             %       step taken.
-            assert(bdfOrder >= 2);
+            assert((bdfOrder >= 1) && (bdfOrder <= 6));
             obj.bdfOrder = bdfOrder;
             obj.v_prev = [];
             obj.DvDt = rv.time.BDFDerivative();
+
+            obj.dudt = dudt;
         end
 
         function [v, t] = getV(obj)
@@ -56,11 +61,14 @@
             % Fix the viscosity of the RHS function F
             F_visc = @(v,t) obj.F(v,t,obj.RV.getViscosity()); %TBD: Remove state in RV?
             obj.v = time.rk.rungekutta(obj.v, obj.t, obj.k, F_visc, obj.coeffs);
-            % Calculate dvdt and update RV
-            dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k);
-            obj.RV.update(obj.v,dvdt);
             obj.t = obj.t + obj.k;
             obj.n = obj.n + 1;
+            % Calculate dvdt and update RV for the new time level
+            dvdt = obj.DvDt.evaluate(obj.v, obj.v_prev, obj.k);
+            if ((size(obj.v_prev,2) >= 4) && (size(obj.v_prev,2) <= obj.bdfOrder))
+                obj.RV.update(obj.v,dvdt);
+            end
+            %obj.RV.update(obj.v,obj.dudt(obj.t));
         end
     end
 end
\ No newline at end of file
diff -r e547794a9407 -r 9b7fcd5e4480 +rv/ResidualViscosity.m
--- a/+rv/ResidualViscosity.m	Thu Dec 06 11:30:47 2018 +0100
+++ b/+rv/ResidualViscosity.m	Thu Dec 06 17:03:22 2018 +0100
@@ -37,7 +37,9 @@
             obj.u_t = dvdt;
             obj.grad_f = obj.D(v);
             obj.residual = obj.u_t + obj.grad_f;
-            obj.viscosity = min(obj.Cmax*obj.h*abs(obj.waveSpeed(v)), obj.Cres*obj.h^2*abs(obj.residual)/norm(v-mean(v),inf));
+            %obj.viscosity = min(obj.Cmax*obj.h*abs(obj.waveSpeed(v)), obj.Cres*obj.h^2*abs(obj.residual)/norm(v-mean(v),inf));
+            obj.viscosity = obj.smoothen(obj.Cres*obj.h^2*abs(obj.residual)/norm(v-mean(v),inf));
+
         end
 
         function smoothendVector = smoothen(obj, vector)