0001 function fmdl = remove_unused_nodes( fmdl );
0002
0003
0004
0005
0006
0007 if ischar(fmdl) && strcmp(fmdl,'UNIT_TEST'); do_unit_test; return; end
0008
0009 if num_elems(fmdl)==0; return; end;
0010
0011 usednodes = unique(fmdl.elems(:));
0012 if max(usednodes) > num_nodes(fmdl)
0013 error('remove_unused_nodes: more nodes are used than exist');
0014 end
0015 nidx = zeros(num_nodes(fmdl),1);
0016 nidx(usednodes) = 1:length(usednodes);
0017 fmdl.nodes(nidx==0,:) = [];
0018 fmdl.elems = remap(nidx, fmdl.elems);
0019
0020 for i=1:length(fmdl.electrode)
0021 fmdl.electrode(i).nodes = remap(nidx, fmdl.electrode(i).nodes);
0022 if isfield(fmdl.electrode(i),'faces')
0023 fmdl.electrode(i).faces = remap(nidx, fmdl.electrode(i).faces);
0024 end
0025 end
0026
0027 fmdl.boundary = remap(nidx, fmdl.boundary);
0028 fmdl.boundary(any(fmdl.boundary==0,2),:) = [];
0029 fmdl.gnd_node = nidx(fmdl.gnd_node);
0030 if fmdl.gnd_node == 0
0031 fmdl = assign_new_gnd_node( fmdl );
0032 end
0033
0034
0035 function mat = remap(nidx,mat)
0036 mat = reshape(nidx(mat),size(mat));
0037
0038 function fmdl = assign_new_gnd_node( fmdl );
0039 eidors_msg('FEM_ELECTRODE: Lost ground node => replacing',1);
0040 d2 = sum((fmdl.nodes - mean(fmdl.nodes)).^2,2);
0041 [~,fmdl.gnd_node] = min(d2);
0042
0043 function do_unit_test
0044 fmdl = getfield(mk_common_model('a2c2',4),'fwd_model');
0045 fmdl.elems(1:4,:) = [];
0046 fmdl = remove_unused_nodes(fmdl);
0047
0048 unit_test_cmp('nodes',size(fmdl.nodes),[40,2]);
0049 unit_test_cmp('elems',size(fmdl.elems),[60,3]);
0050 unit_test_cmp('ground',fmdl.gnd_node,3);