annotate +scheme/bcSetup.m @ 797:5cf9fdf4c98f feature/poroelastic

Merge with feature/grids and bugfix bcSetup
author Martin Almquist <malmquist@stanford.edu>
date Thu, 26 Jul 2018 10:53:05 -0700
parents 1f6b2fb69225 6afd3dd3ed96
children 006defd0247b 57760d7088ad
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));
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
23 gridData = {};
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
24 symbolicData = {};
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
26 % Collect closures, penalties and data
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
27 for i = 1:length(bcs)
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
28 [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
29 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
30
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
31 [ok, isSym, data] = parseData(bcs{i}, penalty, diffOp.grid);
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
32
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
33 if ~ok
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
34 % There was 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
35 continue
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
38 if isSym
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
39 symbolicData{end+1} = data;
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
40 else
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
41 gridData{end+1} = data;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
42 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
45 % 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
46 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
47 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
48 v = O;
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
49 for i = 1:length(gridData)
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
50 v = v + gridData{i}.penalty*gridData{i}.func(t);
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
51 end
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
52
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
53 for i = 1:length(symbolicData)
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
54 v = v + symbolicData{i}.penalty*symbolicData{i}.func(t, symbolicData{i}.coords{:});
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 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
58 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 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
60 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
61
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
62 function verifyBcFormat(bcs, diffOp)
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
63 for i = 1:length(bcs)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
64 assertType(bcs{i}, 'struct');
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
65 assertStructFields(bcs{i}, {'type', 'boundary'});
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
66
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
67 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
68 continue
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
69 end
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
70
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
71 if ~isa(bcs{i}.data, 'function_handle')
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
72 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
73 end
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
74
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
75 b = diffOp.grid.getBoundary(bcs{i}.boundary);
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
76
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
77 dim = size(b,2);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
78
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
79 if nargin(bcs{i}.data) == 1
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
80 % Grid data (only function of time)
797
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
81 assertSize(bcs{i}.data(0), 1, size(b));
5cf9fdf4c98f Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
parents: 795 790
diff changeset
82 elseif nargin(bcs{i}.data) ~= 1+dim
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
83 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
84 end
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
85 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
86 end
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
87
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
88 function [ok, isSym, dataStruct] = parseData(bc, penalty, grid)
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
89 if ~isfield(bc,'data') || isempty(bc.data)
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
90 ok = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
91 return
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
92 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
93 ok = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
94
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
95 nArg = nargin(bc.data);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
96
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
97 if nArg > 1
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
98 % Symbolic data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
99 isSym = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
100 coord = grid.getBoundary(bc.boundary);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
101 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
102 dataStruct.func = bc.data;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
103 dataStruct.coords = num2cell(coord, 1);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
104 else
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
105 % Grid data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
106 isSym = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
107 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
108 dataStruct.func = bcs{i}.data;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
109 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
110 end