view diracDiscrTest.m @ 836:049e4c6fa630 feature/poroelastic

Add dirac delta function, with corresponding test. Commented out tests for staggered grid because they do not yet exist on this branch.
author Martin Almquist <malmquist@stanford.edu>
date Wed, 05 Sep 2018 14:46:39 -0700
parents
children 43a1c3ac07b1
line wrap: on
line source

function tests = diracDiscrTest()
	    tests = functiontests(localfunctions);
end

function testLeftGP(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test left boundary grid points
        x0s = xl + [0, h, 2*h];

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testLeftRandom(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test random points near left boundary
        x0s = xl + 2*h*rand(1,10);

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testRightGP(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test right boundary grid points
        x0s = xr-[0, h, 2*h];

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testRightRandom(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test random points near right boundary
        x0s = xr - 2*h*rand(1,10);

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testInteriorGP(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test interior grid points
        m_half = round(m/2);
        x0s = xl + (m_half-1:m_half+1)*h;

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testInteriorRandom(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test random points in interior
        x0s = (xl+2*h) + (xr-xl-4*h)*rand(1,20);

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

% x0 outside grid should yield 0 integral!
function testX0OutsideGrid(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test points outisde grid
        x0s = [xl-1.1*h, xr+1.1*h];

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - 0);
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testAllGP(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test all grid points
        x0s = x;

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

function testHalfGP(testCase)

    orders = [2, 4, 6];
    mom_conds = orders;

    for o = 1:length(orders)
        order = orders(o);
        mom_cond = mom_conds(o);
        [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond);

        % Test halfway between all grid points
        x0s = 1/2*( x(2:end)+x(1:end-1) );

        for j = 1:length(fs)
                f = fs{j};
                fx = f(x);
            for i = 1:length(x0s)
                x0 = x0s(i);
                delta = diracDiscr(x0, x, mom_cond, 0, H);
                integral = delta'*H*fx;
                err = abs(integral - f(x0));
                testCase.verifyLessThan(err, 1e-12);
            end
        end
    end
end

% function testAllGPStaggered(testCase)

%     orders = [2, 4, 6];
%     mom_conds = orders;

%     for o = 1:length(orders)
%         order = orders(o);
%         mom_cond = mom_conds(o);
%         [xl, xr, m, h, x, H, fs] = setupStaggered(order, mom_cond);

%         % Test all grid points
%         x0s = x;

%         for j = 1:length(fs)
%                 f = fs{j};
%                 fx = f(x);
%             for i = 1:length(x0s)
%                 x0 = x0s(i);
%                 delta = diracDiscr(x0, x, mom_cond, 0, H);
%                 integral = delta'*H*fx;
%                 err = abs(integral - f(x0));
%                 testCase.verifyLessThan(err, 1e-12);
%             end
%         end
%     end
% end

% function testHalfGPStaggered(testCase)

%     orders = [2, 4, 6];
%     mom_conds = orders;

%     for o = 1:length(orders)
%         order = orders(o);
%         mom_cond = mom_conds(o);
%         [xl, xr, m, h, x, H, fs] = setupStaggered(order, mom_cond);

%         % Test halfway between all grid points
%         x0s = 1/2*( x(2:end)+x(1:end-1) );

%         for j = 1:length(fs)
%                 f = fs{j};
%                 fx = f(x);
%             for i = 1:length(x0s)
%                 x0 = x0s(i);
%                 delta = diracDiscr(x0, x, mom_cond, 0, H);
%                 integral = delta'*H*fx;
%                 err = abs(integral - f(x0));
%                 testCase.verifyLessThan(err, 1e-12);
%             end
%         end
%     end
% end

% function testRandomStaggered(testCase)

%     orders = [2, 4, 6];
%     mom_conds = orders;

%     for o = 1:length(orders)
%         order = orders(o);
%         mom_cond = mom_conds(o);
%         [xl, xr, m, h, x, H, fs] = setupStaggered(order, mom_cond);

%         % Test random points within grid boundaries
%         x0s = xl + (xr-xl)*rand(1,300);

%         for j = 1:length(fs)
%                 f = fs{j};
%                 fx = f(x);
%             for i = 1:length(x0s)
%                 x0 = x0s(i);
%                 delta = diracDiscr(x0, x, mom_cond, 0, H);
%                 integral = delta'*H*fx;
%                 err = abs(integral - f(x0));
%                 testCase.verifyLessThan(err, 1e-12);
%             end
%         end
%     end
% end


% ============== Setup functions =======================
function [xl, xr, m, h, x, H, fs] = setupStuff(order, mom_cond)

    % Grid
    xl = -3;
    xr = 900;
    L = xr-xl;
    m = 101;
    h = (xr-xl)/(m-1);
    g = grid.equidistant(m, {xl, xr});
    x = g.points();

    % Quadrature
    ops = sbp.D2Standard(m, {xl, xr}, order);
    H = ops.H;

    % Moment conditions
    fs = cell(mom_cond,1);
    for p = 0:mom_cond-1
        fs{p+1} = @(x) (x/L).^p;
    end

end

function [xl, xr, m, h, x, H, fs] = setupStaggered(order, mom_cond)

    % Grid
    xl = -3;
    xr = 900;
    L = xr-xl;
    m = 101;
    [~, g_dual] = grid.primalDual1D(m, {xl, xr});
    x = g_dual.points();
    h = g_dual.h;

    % Quadrature
    ops = sbp.D1Staggered(m, {xl, xr}, order);
    H = ops.H_dual;

    % Moment conditions
    fs = cell(mom_cond,1);
    for p = 0:mom_cond-1
        fs{p+1} = @(x) (x/L).^p;
    end

end