Mercurial > repos > public > sbplib
view +rv/ResidualViscosity.m @ 1039:a8ee5eca0e6c feature/burgers1d
Allow for the residual normalization function to return a vector. Also change the default normalization from normalizing on norm(u-mean(u),inf) to norm(u/2), since this proved to be better for 1d burgers
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:06:20 +0100 |
parents | 2ef20d00b386 |
children | 922996695952 |
line wrap: on
line source
classdef ResidualViscosity < handle properties Df % Diff op approximating the gradient of the flux f(u) waveSpeed % Wave speed at each grid point, e.g f'(u). %TBD: Better naming? Cmax % Constant controlling relative amount of upwind dissipation Cres % Constant controling relative amount of upwind dissipation h % Length scale used for scaling the viscosity. Typically grid spacing. normalization % Function used to normalize the residual such that it is amplified in the % shocks. end methods % TBD: Decide on how to treat waveSpeed. It would be nice to just pass a constant value without % wrapping it in a function. function obj = ResidualViscosity(Df, waveSpeed, Cmax, Cres, h, normalization) default_arg('normalization',@(v)norm(v/2,inf)); obj.Df = Df; obj.waveSpeed = waveSpeed; obj.h = h; obj.Cmax = Cmax; obj.Cres = Cres; obj.normalization = normalization; end function [viscosity, Df, firstOrderViscosity, residualViscosity] = evaluate(obj, v, dvdt) Df = obj.Df(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); end end end