-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathLayeredModel.m
230 lines (194 loc) · 9.57 KB
/
LayeredModel.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
classdef LayeredModel < comsolkit.ComsolModel
% LayeredModel Inherits from ComsolModel and adds layer functionality.
properties
layerArray % Contains Layer object handles.
end
properties(Constant)
DEFAULT_LAYER_CLASS = @comsolkit.Layer; % Used for add functions.
end
methods
function obj = LayeredModel(varargin)
% LayeredModel Creates a comsol model object supporting layers.
%
% LayeredModel(varargin)
%
% Parameters:
% FromFile: Load from a mph-file on the file system
% FromTag: Load from an existing model on the server by tag
% %%% parameters below only for new models %%%
% LengthUnit: Length of a unit in meters (default: 1e-9)
% Call super constructor with explicit 3d geometry.
obj = [email protected](varargin{:}, ...
'GeomDimension', 3);
% Prepare array for Layer objects.
obj.layerArray = comsolkit.Layer.empty();
end
function [startIndex, stopIndex] = batch_add_layer(obj, ...
coordinateCell, varargin)
% batch_add_layer Creates layers with polygons per layer.
%
% [startIndex, stopIndex] = batch_add_layer(obj, ...
% coordinateCell)
% [startIndex, stopIndex] = batch_add_layer(obj, ...
% coordinateCell, ...
% nameCell)
% [startIndex, stopIndex] = batch_add_layer(obj, ...
% coordinateCell, ...
% nameCell, ...
% layerClass)
% [startIndex, stopIndex] = batch_add_layer(obj, ...
% coordinateCell, ...
% nameCell, ...
% layerClass, ...
% varargin)
%
% Parameter:
% coordinateCell: Cell array of cell arrays with n x 2
% coorinate arrays: {{[...], ...}, {...}, ...}
% nameCell: Cell array of names per layer element (optional).
% If not provided, names are generated by comsol
% layerClass: handle to constructor from which an object is
% generated. (Default: '@comsolkit.Layer')
% varargin: Passed on to Layer object constructor. See help of
% comsolkit.Layer.Layer
%
% Return Parameters:
% startIndex, stopIndex: Start/stop index of added layers to
% layerArray
if nargin < 3
nameCell = {};
layerClass = obj.DEFAULT_LAYER_CLASS;
elseif nargin < 4
nameCell = varargin{1};
layerClass = obj.DEFAULT_LAYER_CLASS;
else
nameCell = varargin{1};
layerClass = varargin{2};
end
assert(isa(layerClass, 'function_handle'), ...
'layerClass must be a function handle.');
assert(iscell(coordinateCell) && iscell(nameCell), ...
'Input parameters not valid.');
% If nameCell does not match coordinateCell or no names
% provided generate empty nameCell matching coordinateCell.
if length(nameCell) ~= length(coordinateCell) || ...
isempty(nameCell)
nameCell = cell(size(coordinateCell));
end
startIndex = length(obj.layerArray) + 1;
% Loop over input cell of coordinate arrays.
for i = 1:length(coordinateCell)
coordinateArrayCell = coordinateCell{i};
assert(iscell(coordinateArrayCell), ...
'Wrong format of input coordinates.');
name = nameCell{i};
if isempty(name)
obj.layerArray(end+1) = layerClass(obj, ...
varargin{3:end});
else
obj.layerArray(end+1) = layerClass(obj, ...
varargin{3:end}, ...
'Name', name);
end
for coordinateArray = coordinateArrayCell
% For elem = cell pattern: elem 1x1 cell, use elem{1}.
obj.layerArray(end).add_poly(coordinateArray{1});
end
end
stopIndex = length(obj.layerArray);
end
function index = add_layer(obj, coordinateArrayCell, varargin)
% add_layer Creates one layer with polygons.
%
% index = add_layer(obj, coordinateArrayCell)
% index = add_layer(obj, coordinateArrayCell, name)
% index = add_layer(obj, coordinateArrayCell, name, ...
% layerClass)
% index = add_layer(obj, coordinateArrayCell, name, ...
% layerClass, varargin)
%
% Parameter:
% coordinateArrayCell: Cell array with n x 2
% coorinate arrays: {[...], ...}
% name: Name of layer element (optional). If not provided,
% a name is generated from LAYER_NAME_BASE
% layerClass: handle to constructor from which an object is
% generated. (Default: '@comsolkit.Layer')
% varargin: Passed on to Layer object constructor. See help of
% comsolkit.Layer.Layer
%
% Return Parameters:
% index: Index of added layer to layerArray
if nargin < 3
index = obj.batch_add_layer({coordinateArrayCell});
else
name = varargin{1};
if isempty(name)
index = obj.batch_add_layer({coordinateArrayCell}, ...
{}, ...
varargin{2:end});
else
index = obj.batch_add_layer({coordinateArrayCell}, ...
{name}, ...
varargin{2:end});
end
end
end
function batch_remove_layer(obj, startIndex, stopIndex)
% batch_remove_layer Remove layers from server and layerArray.
%
% batch_remove_layer(obj, startIndex, stopIndex)
assert(isscalar(startIndex) && ...
isscalar(stopIndex) && ...
startIndex >= 1 && ...
startIndex <= stopIndex && ...
stopIndex <= length(obj.layerArray), ...
'Start/stop index is not valid.');
for i = startIndex:stopIndex
obj.layerArray(i).delete();
end
% Mask the deleted Layer objects.
obj.layerArray = obj.layerArray( ...
[1:startIndex-1 stopIndex+1:end]);
end
function remove_layer(obj, index)
% remove_layer Remove a layer index from layerArray.
%
% remove_layer(obj, index)
obj.batch_remove_layer(index, index);
end
function remove_all_layers(obj)
% remove_all_layers Remove all layers from layerArray.
%
% remove_all_layers(obj)
endIndex = length(obj.layerArray);
obj.batch_remove_layer(1, endIndex);
end
function savedObj = saveobj(obj)
% saveobj Saves the object including the comsol model.
%
% savedObj = saveobj(obj)
savedObj = [email protected](obj);
end
function print_layer_info(obj)
% print_layer_info Prints layer information in a table.
%
% print_layer_info(obj)
fprintf(' %-30s %-30s %-15s %-15s\n','Class', 'Name', ...
'zPosition', 'totDistance');
fprintf([repmat('-', 1, 93), '\n']);
for index = 1:length(obj.layerArray)
layer = obj.layerArray(index);
fprintf('%-3d %s\n', index, layer.info_string());
end
end
end
methods(Static)
function loadedObj = loadobj(obj)
% loadobj Loads the object including the comsol model.
%
% loadedObj = loadobj(obj)
loadedObj = [email protected](obj);
end
end
end