annotate +scheme/bcSetup.m @ 788:b3ea4cccaf15 bcSetupExperiment

Remove some stuff duplicated from the verifyFormat function
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 24 Jul 2018 16:30:15 -0700
parents fef739088f20
children 1a6095bed6d6
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
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
39 if nargin(bcs{i}.data) == 1
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
40 % Grid data
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
41 gridDataPenalties{end+1} = penalty;
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
42 gridDataFunctions{end+1} = bcs{i}.data;
788
b3ea4cccaf15 Remove some stuff duplicated from the verifyFormat function
Jonatan Werpers <jonatan@werpers.com>
parents: 787
diff changeset
43 elseif nargin(bcs{i}.data) > 1
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
44 % Symbolic data
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
45 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
46 symbolicDataPenalties{end+1} = penalty;
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
47 symbolicDataFunctions{end+1} = bcs{i}.data;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
48 symbolicDataCoords{end+1} = num2cell(coord ,1);
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
49 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
52 % 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
53 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
54 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
55 v = O;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
56 for i = 1:length(gridDataFunctions)
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
57 v = v + gridDataPenalties{i}*gridDataFunctions{i}(t);
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
58 end
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
59
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
60 for i = 1:length(symbolicDataFunctions)
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
61 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
62 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 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
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 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
67 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
68
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
69 function verifyBcFormat(bcs, diffOp)
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
70 for i = 1:length(bcs)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
71 assertType(bcs{i}, 'struct');
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
72 assertStructFields(bcs{i}, {'type', 'boundary'});
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
73
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
74 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
75 continue
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
76 end
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
77
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
78 if ~isa(bcs{i}.data, 'function_handle')
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
79 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
80 end
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
81
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
82 b = diffOp.grid.getBoundary(bc.boundart);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
83
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
84 dim = size(b,2);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
85
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
86 if nargin(bc.data) == 1
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
87 % Grid data (only function of time)
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
88 assertSize(bc.data(0), 1, size(b));
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
89 elseif nargin(bc.data) ~= 1+dim
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
90 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
91 end
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
92 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
93 end