remove_unused_nodes

PURPOSE ^

REMOVE_UNUSED_NODES: identify and remove unused nodes in model

SYNOPSIS ^

function fmdl = remove_unused_nodes( fmdl );

DESCRIPTION ^

 REMOVE_UNUSED_NODES: identify and remove unused nodes in model
 Usage: fmdl = remove_unused_nodes( fmdl );

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function fmdl = remove_unused_nodes( fmdl );
0002 % REMOVE_UNUSED_NODES: identify and remove unused nodes in model
0003 % Usage: fmdl = remove_unused_nodes( fmdl );
0004 
0005 % (C) 2019 Andy Adler. License: GPL v2 or v3. $Id: remove_unused_nodes.m 6009 2019-06-29 15:01:33Z aadler $
0006 
0007    if ischar(fmdl) && strcmp(fmdl,'UNIT_TEST'); do_unit_test; return; end
0008 
0009    if num_elems(fmdl)==0; return; end; % don't operate on pathalogical models
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 %  fmdl.boundary = find_boundary(fmdl);
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 %% New gnd node if missing
0031       fmdl = assign_new_gnd_node( fmdl );
0032    end
0033 
0034 %  fmdl.elems = reshape(nidx(fmdl.elems),[],size(fmdl.elems,2));
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);

Generated on Tue 31-Dec-2019 17:03:26 by m2html © 2005