view +multiblock/+domain/Line.m @ 1198:2924b3a9b921 feature/d2_compatible

Add OpSet for fully compatible D2Variable, created from regular D2Variable by replacing d1 by first row of D1. Formal reduction by one order of accuracy at the boundary point.
author Martin Almquist <malmquist@stanford.edu>
date Fri, 16 Aug 2019 14:30:28 -0700
parents 532b58a9e849
children
line wrap: on
line source

classdef Line < multiblock.Definition
    properties

    xlims
    blockNames % Cell array of block labels
    nBlocks
    connections % Cell array specifying connections between blocks
    boundaryGroups % Structure of boundaryGroups

    end


    methods
        % Creates a divided line
        % x is a vector of boundary and interface positions.
        % blockNames: cell array of labels. The id is default.
        function obj = Line(x,blockNames)
            default_arg('blockNames',[]);

            N = length(x)-1; % number of blocks in the x direction.

            if ~issorted(x)
                error('The elements of x seem to be in the wrong order');
            end

            % Dimensions of blocks and number of points
            blockTi = cell(N,1);
            xlims = cell(N,1);
            for i = 1:N
                xlims{i} = {x(i), x(i+1)};
            end

            % Interface couplings
            conn = cell(N,N);
            for i = 1:N
                conn{i,i+1} = {'r','l'};
            end

            % Block names (id number as default)
            if isempty(blockNames)
                obj.blockNames = cell(1, N);
                for i = 1:N
                    obj.blockNames{i} = sprintf('%d', i);
                end
            else
                assert(length(blockNames) == N);
                obj.blockNames = blockNames;
            end
            nBlocks = N;

            % Boundary groups
            boundaryGroups = struct();
            L = { {1, 'l'} };
            R = { {N, 'r'} };
            boundaryGroups.L = multiblock.BoundaryGroup(L);
            boundaryGroups.R = multiblock.BoundaryGroup(R);
            boundaryGroups.all = multiblock.BoundaryGroup([L,R]);

            obj.connections = conn;
            obj.nBlocks = nBlocks;
            obj.boundaryGroups = boundaryGroups;
            obj.xlims = xlims;

        end


        % Returns a multiblock.Grid given some parameters
        % ms: cell array of m values
        % For same m in every block, just input one scalar.
        function g = getGrid(obj, ms, varargin)

            default_arg('ms',21)

            % Extend ms if input is a single scalar
            if (numel(ms) == 1) && ~iscell(ms)
                m = ms;
                ms = cell(1,obj.nBlocks);
                for i = 1:obj.nBlocks
                    ms{i} = m;
                end
            end

            grids = cell(1, obj.nBlocks);
            for i = 1:obj.nBlocks
                grids{i} = grid.equidistant(ms{i}, obj.xlims{i});
            end

            g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups);
        end

        % Returns a multiblock.Grid given some parameters
        % ms: cell array of m values
        % For same m in every block, just input one scalar.
        function g = getStaggeredGrid(obj, ms, varargin)

            default_arg('ms',21)

            % Extend ms if input is a single scalar
            if (numel(ms) == 1) && ~iscell(ms)
                m = ms;
                ms = cell(1,obj.nBlocks);
                for i = 1:obj.nBlocks
                    ms{i} = m;
                end
            end

            grids = cell(1, obj.nBlocks);
            for i = 1:obj.nBlocks
                [g_primal, g_dual] = grid.primalDual1D(ms{i}, obj.xlims{i});
                grids{i} = grid.Staggered1d(g_primal, g_dual);
            end

            g = multiblock.Grid(grids, obj.connections, obj.boundaryGroups);
        end

        % label is the type of label used for plotting,
        % default is block name, 'id' show the index for each block.
        function show(obj, label)
            default_arg('label', 'name')

            m = 10;
            figure
            for i = 1:obj.nBlocks
               x = linspace(obj.xlims{i}{1}, obj.xlims{i}{2}, m);
               y = 0*x + 0.05* ( (-1)^i + 1 ) ;
               plot(x,y,'+');
               hold on
            end
            hold off

            switch label
                case 'name'
                    labels = obj.blockNames;
                case 'id'
                    labels = {};
                    for i = 1:obj.nBlocks
                        labels{i} = num2str(i);
                    end
                otherwise
                    axis equal
                    return
            end

            legend(labels)
            axis equal
        end

        % Returns the grid size of each block in a cell array
        % The input parameters are determined by the subclass
        function ms = getGridSizes(obj, varargin)
        end
    end
end