Mercurial > repos > public > sbplib
view +multiblock/stitchSchemes.m @ 577:e45c9b56d50d feature/grids
Add an Empty grid class
The need turned up for the flexural code when we may or may not have a grid for the open water and want to plot that solution.
In case there is no open water we need an empty grid to plot the empty gridfunction against to avoid errors.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 07 Sep 2017 09:16:12 +0200 |
parents | 419ec303e97d |
children | 437fad4a47e1 |
line wrap: on
line source
% Stitch schemes together given connection matrix and BC vector. % schmHand - function_handle to a Scheme constructor % order - order of accuracy % schmParam - cell array of extra parameters sent to each Scheme stored as cell arrays % blocks - block definitions, On whatever form the scheme expects. % ms - grid points in each direction for each block. Ex {[10,10], [10, 20]} % conn - connection matrix % bound - boundary condition vector, array of structs with fields w,e,s,n % each field with a parameter array that is sent to schm.boundary_condition % % Output parameters are cell arrays and cell matrices. % % Ex: [schms, D, H] = stitchSchemes(schmHand, order, schmParam, blocks, ms, conn, bound) function [schms, D, H] = stitchSchemes(schmHand, order, schmParam, grids, conn, bound) default_arg('schmParam',[]); n_blocks = numel(grids); % Creating Schemes for i = 1:n_blocks if isempty(schmParam); schms{i} = schmHand(grids{i},order,[]); elseif ~iscell(schmParam) param = schmParam(i); schms{i} = schmHand(grids{i},order,param); else param = schmParam{i}; if iscell(param) schms{i} = schmHand(grids{i},order,param{:}); else schms{i} = schmHand(grids{i},order,param); end end % class(schmParam) % class(ms) % class(blocks) % class(schmParam{i}) % class(ms) end % Total norm H = cell(n_blocks,n_blocks); for i = 1:n_blocks H{i,i} = schms{i}.H; end %% Total system matrix % Differentiation terms D = cell(n_blocks,n_blocks); for i = 1:n_blocks D{i,i} = schms{i}.D; end % Boundary penalty terms for i = 1:n_blocks if ~isstruct(bound{i}) continue end fn = fieldnames(bound{i}); for j = 1:length(fn); bc = bound{i}.(fn{j}); if isempty(bc) continue end [closure, ~] = schms{i}.boundary_condition(fn{j},bc{:}); D{i,i} = D{i,i}+closure; end end % Interface penalty terms for i = 1:n_blocks for j = 1:n_blocks intf = conn{i,j}; if isempty(intf) continue end [uu,uv,vv,vu] = schms{i}.interface_coupling(schms{i},intf{1},schms{j},intf{2}); D{i,i} = D{i,i} + uu; D{i,j} = uv; D{j,j} = D{j,j} + vv; D{j,i} = vu; end end end