annotate +scheme/bcSetup.m @ 787:fef739088f20 bcSetupExperiment

Move more stuff into verifyFormat
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 24 Jul 2018 16:27:36 -0700
parents 18ce4b1ab3e1
children b3ea4cccaf15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 % function [closure, S] = bcSetup(diffOp, bc)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 % Takes a diffOp and a cell array of boundary condition definitions.
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 % Each bc is a struct with the fields
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 % * type -- Type of boundary condition
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 % * boundary -- Boundary identifier
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
6 % * data -- A function_handle for a function which provides boundary data.(see below)
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 % Also takes S_sign which modifies the sign of S, [-1,1]
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
8 % Returns a closure matrix and a forcing function S.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
9 %
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
10 % The boundary data function can either be a function of time or a function of time and space coordinates.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
11 % In the case where it only depends on time it should return the data as grid function for the boundary.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
12 % In the case where it also takes space coordinates the number of space coordinates should match the number of dimensions of the problem domain.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
13 % For example in the 2D case: f(t,x,y).
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
14 function [closure, S] = bcSetup(diffOp, bcs, S_sign)
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 default_arg('S_sign', 1);
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
16 assertType(bcs, 'cell');
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 assert(S_sign == 1 || S_sign == -1, 'S_sign must be either 1 or -1');
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
19 verifyBcFormat(bcs, diffOp);
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
21 % Setup storage arrays
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22 closure = spzeros(size(diffOp));
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
23 gridDataPenalties = {};
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
24 gridDataFunctions = {};
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
25 symbolicDataPenalties = {};
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
26 symbolicDataFunctions = {};
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
27 symbolicDataCoords = {};
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
29 % Collect closures, penalties and data
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
30 for i = 1:length(bcs)
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
31 [localClosure, penalty] = diffOp.boundary_condition(bcs{i}.boundary, bcs{i}.type);
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 closure = closure + localClosure;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
34 if ~isfield(bcs{i},'data') || isempty(bcs{i}.data)
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
35 % Skip to next loop if there is no data
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 continue
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
39 % Find dimension
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
40 dim = size(diffOp.grid.getBoundary(bcs{i}.boundary), 2);
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
42 if nargin(bcs{i}.data) == 1
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
43 % Grid data
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
44 gridDataPenalties{end+1} = penalty;
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
45 gridDataFunctions{end+1} = bcs{i}.data;
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
46 elseif nargin(bcs{i}.data) == 1+dim
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
47 % Symbolic data
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
48 coord = diffOp.grid.getBoundary(bcs{i}.boundary);
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
49 symbolicDataPenalties{end+1} = penalty;
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
50 symbolicDataFunctions{end+1} = bcs{i}.data;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
51 symbolicDataCoords{end+1} = num2cell(coord ,1);
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
52 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
55 % Setup penalty function
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 O = spzeros(size(diffOp),1);
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 function v = S_fun(t)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 v = O;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
59 for i = 1:length(gridDataFunctions)
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
60 v = v + gridDataPenalties{i}*gridDataFunctions{i}(t);
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
61 end
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
62
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
63 for i = 1:length(symbolicDataFunctions)
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
64 v = v + symbolicDataPenalties{i}*symbolicDataFunctions{i}(t, symbolicDataCoords{i}{:});
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
67 v = S_sign * v;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
68 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69 S = @S_fun;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
70 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
71
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
72 function verifyBcFormat(bcs, diffOp)
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
73 for i = 1:length(bcs)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
74 assertType(bcs{i}, 'struct');
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
75 assertStructFields(bcs{i}, {'type', 'boundary'});
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
76
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
77 if ~isfield(bcs{i}, 'data') || isempty(bcs{i}.data)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
78 continue
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
79 end
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
80
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
81 if ~isa(bcs{i}.data, 'function_handle')
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
82 error('bcs{%d}.data should be a function of time or a function of time and space',i);
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
83 end
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
84
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
85 b = diffOp.grid.getBoundary(bc.boundart);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
86
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
87 dim = size(b,2);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
88
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
89 if nargin(bc.data) == 1
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
90 % Grid data (only function of time)
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
91 assertSize(bc.data(0), 1, size(b));
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
92 elseif nargin(bc.data) ~= 1+dim
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
93 error('sbplib:scheme:bcSetup:DataWrongNumberOfArguments', 'bcs{%d}.data has the wrong number of input arguments. Must be either only time or time and space.', i);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
94 end
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
95 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
96 end