Mercurial > repos > public > sbplib
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 |
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 |