annotate +scheme/+bc/forcingSetup.m @ 1316:bd8e607768ce feature/poroelastic

Add interfaceForcing method in multiblock.DiffOp to facilitate mms forcing
author Martin Almquist <malmquist@stanford.edu>
date Sun, 26 Jul 2020 20:05:10 -0700
parents a52033540dd9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
1 % Setup the forcing function for the given boundary conditions and data.
899
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
2 % Each bc is a struct with the fields
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
3 % * type -- Type of boundary condition
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
4 % * boundary -- Boundary identifier
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
5 % * data -- A function_handle for a function which provides boundary data.(see below)
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
6 % S_sign allows changing the sign of the function to put on different sides in the system of ODEs.
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
7 % default is 1, which the same side as the diffOp.
899
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
8 % Returns a forcing function S.
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
9 %
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
10 % The boundary data function can either be a function of time or a function of time and space coordinates.
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
11 % In the case where it only depends on time it should return the data as grid function for the boundary.
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
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.
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
13 % For example in the 2D case: f(t,x,y).
ba10f24bf476 Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 878
diff changeset
14
870
fb91d12093f8 Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 869
diff changeset
15 function S = forcingSetup(diffOp, penalties, bcs, S_sign)
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 default_arg('S_sign', 1);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 assertType(bcs, 'cell');
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19 assertIsMember(S_sign, [1, -1]);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20
870
fb91d12093f8 Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents: 869
diff changeset
21 scheme.bc.verifyFormat(bcs, diffOp);
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
23 [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp);
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
24
1282
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
25 if length(gridData) + length(symbolicData) == 0
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
26 S = [];
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
27 else
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
28 % Setup penalty function
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
29 O = spzeros(size(diffOp),1);
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
30 S = @S_fun;
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
31 end
a52033540dd9 Make forcingSetup return empty array instead of zero function if all boundary data functions are empty.
Martin Almquist <malmquist@stanford.edu>
parents: 899
diff changeset
32
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 function v = S_fun(t)
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 v = O;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 for i = 1:length(gridData)
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 v = v + gridData{i}.penalty*gridData{i}.func(t);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 for i = 1:length(symbolicData)
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40 v = v + symbolicData{i}.penalty*symbolicData{i}.func(t, symbolicData{i}.coords{:});
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 v = S_sign * v;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
47 % Go through a cell array of boundary condition specifications and return cell arrays
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
48 % of structs for grid and symbolic data.
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
49 function [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp)
878
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
50 gridData = {};
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
51 symbolicData = {};
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
52 for i = 1:length(bcs)
878
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
53 [ok, isSymbolic, data] = parseData(bcs{i}, penalties{i}, diffOp.grid);
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
54
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
55 if ~ok
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
56 continue % There was no data
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
57 end
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
58
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
59 if isSymbolic
878
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
60 symbolicData{end+1} = data;
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
61 else
878
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
62 gridData{end+1} = data;
877
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
63 end
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
64 end
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
65 end
7ceaea27d944 Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 876
diff changeset
66
876
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
67 function [ok, isSymbolic, dataStruct] = parseData(bc, penalty, grid)
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
68 if ~isfield(bc,'data') || isempty(bc.data)
876
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
69 isSymbolic = [];
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
70 dataStruct = struct();
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 ok = false;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72 return
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
74 ok = true;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
75
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
76 nArg = nargin(bc.data);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
77
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
78 if nArg > 1
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
79 % Symbolic data
876
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
80 isSymbolic = true;
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
81 coord = grid.getBoundary(bc.boundary);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
82 dataStruct.penalty = penalty;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
83 dataStruct.func = bc.data;
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
84 dataStruct.coords = num2cell(coord, 1);
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
85 else
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
86 % Grid data
876
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
87 isSymbolic = false;
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
88 dataStruct.penalty = penalty;
878
51cc7b05b4ab Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
89 dataStruct.func = bc.data;
869
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
90 end
d356f1a22d4f Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
91 end