0001 function [fwd_mdl]= ...
0002 ng_mk_fwd_model( ng_vol_filename, centres, ...
0003 name, stim_pattern, z_contact, postprocmesh)
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 if isempty(name);
0024 name = ['MDL from', ng_vol_filename];
0025 end
0026
0027 if nargin<5
0028 z_contact=0.01;
0029 end
0030
0031
0032 [srf,vtx,fc,bc,simp,edg,mat_ind] = ng_read_mesh(ng_vol_filename);
0033 if isempty(vtx);
0034 error('EIDORS: ng_mk_fwd_model: Netgen meshing failed. Stopping');
0035 end
0036 if nargin>=6
0037 N_elec = max(size(centres));
0038 [srf,vtx,fc,bc,simp,edg,mat_ind] = feval(postprocmesh,...
0039 srf,vtx,fc,bc,simp,edg,mat_ind, N_elec);
0040 end
0041 fwd_mdl= construct_fwd_model(srf,vtx,simp,bc, name, ...
0042 stim_pattern, centres, z_contact,fc);
0043
0044 [fwd_mdl.mat_idx] = mk_mat_indices(mat_ind);
0045
0046 if ~isfield(fwd_mdl,'normalize_measurements')
0047 fwd_mdl.normalize_measurements = 0;
0048 end
0049
0050
0051 function fwd_mdl= construct_fwd_model(srf,vtx,simp,bc, name, ...
0052 stim_pattern, centres, z_contact,fc)
0053 mdl.nodes = vtx;
0054 mdl.elems = simp;
0055 mdl.boundary = srf;
0056 mdl.boundary_numbers=fc;
0057 mdl.gnd_node= find_centre_node(vtx);
0058 mdl.np_fwd_solve.perm_sym = '{n}';
0059 mdl.name = name;
0060
0061
0062 if ~isempty(stim_pattern)
0063 mdl.stimulation= stim_pattern;
0064 end
0065
0066 nelec= size(centres,1);
0067 if nelec>0
0068
0069 [elec,sels,electrodes] = ng_tank_find_elec(srf,vtx,bc,centres);
0070 if size(elec,1) ~= nelec
0071 error('Failed to find all the electrodes')
0072 end
0073
0074
0075 z_contact= z_contact.*ones(nelec,1);
0076 for i=1:nelec
0077 electrodes(i).z_contact= z_contact(i);
0078 end
0079
0080 mdl.electrode = electrodes;
0081 end
0082
0083 mdl.solve= 'eidors_default';
0084 mdl.jacobian= 'eidors_default';
0085 mdl.system_mat= 'eidors_default';
0086
0087 fwd_mdl= eidors_obj('fwd_model', mdl);
0088
0089
0090
0091
0092 function [mat_idx] = mk_mat_indices( mat_ind);
0093
0094
0095
0096 if isempty(mat_ind)
0097 mat_idx = [];
0098 return
0099 end
0100 mat_indices = unique( mat_ind );
0101 for i= 1:length(mat_indices);
0102 mat_idx{i}= find(mat_ind == mat_indices(i));
0103 end
0104
0105 function gnd_node= find_centre_node(vtx);
0106
0107 d = sum( vtx.^2, 2);
0108 [jnk,gnd_node] = min(d);
0109 gnd_node= gnd_node(1);