Eidors-logo    

EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software

EIDORS (mirror)
Main
Documentation
Examples
Tutorials
− Image Reconst
− Data Structures
− Application Examples
− FEM Modelling
Download
Contrib Data
GREIT
Browse SVN

News
FAQ
Developer
                       

 

Hosted by SourceForge.net Logo

 

Build Single Plane Models with Netgen

Check Netgen is installed.


If necessary, get netgen from: netgen.

Setup parameters and call netgen

% Build model
% $Id: build_single_plane01.m 1535 2008-07-26 15:36:27Z aadler $

% Choose Parameters
electrodes_per_plane= 16;
number_of_planes= 1;
refine_electrodes= 10;
tank_radius= 15;
tank_height= 10;
electrode_width = 0.5;
electrode_height= 0.5;
rect_or_circ_electrode= 'C';


fname ='tank_mdl';

first_plane_starts= tank_height/(number_of_planes+1);
height_between_centres = first_plane_starts;

[fmdl,centres] = create_tank_mesh_ng( ...
   tank_radius, tank_height, ...
   rect_or_circ_electrode, ...
   log2(electrodes_per_plane), ...
   number_of_planes, ...
   first_plane_starts, ...
   height_between_centres, ...
   electrode_width, electrode_height, ...
   fname, refine_electrodes  );

% The msz file was created here can be reused later
msz_file= [fname, '.msz'];
stim_pat= mk_stim_patterns(electrodes_per_plane, number_of_planes, ...
              '{ad}','{ad}',{'meas_current'});

% control mesh refinement: options are '-veryfine'; '-fine'; '';
for finemodels= 0:2
  if     finemodels==0; finelevel= '';
  elseif finemodels==1; finelevel= '-fine';
  elseif finemodels==2; finelevel= '-veryfine';
  end

  if ~isempty(finelevel);
      call_netgen([fname,'.geo'],[fname,'.vol'],msz_file, finelevel);
  end

  [fmdl,mat_idxs]= ng_mk_fwd_model( [fname,'.vol'], centres, [], stim_pat);

  if     finemodels==0; ng_mdl_16x1_coarse= fmdl;
  elseif finemodels==1; ng_mdl_16x1_fine  = fmdl;
  elseif finemodels==2; ng_mdl_16x1_vfine = fmdl;
  end

  subplot(311);
  show_fem( fmdl); view(0,14);

  subplot(312);
  show_fem( fmdl); view(0,0);
  crop_model(gca, inline('y>0','x','y','z'))

  subplot(313);
  show_fem( fmdl); view(0,0);
  crop_model(gca, inline('y>-10','x','y','z'))
  set(gca,'Xlim',[-2,2],'Zlim',[-1,1]+first_plane_starts);

  print('-r100','-dpng', ...
        sprintf('build_single_plane01%c.png',96+finemodels));
end
   

save ng_mdl_16x1_coarse.mat  ng_mdl_16x1_coarse
save ng_mdl_16x1_fine.mat    ng_mdl_16x1_fine
save ng_mdl_16x1_vfine.mat   ng_mdl_16x1_vfine

The calculated models are saved here [data_conbrib 16x1 models]

Figure: Tank model generated by netgen of a single plane with different levels of refinement flag to netgen. Left: refinement = '-coarse' (default) Middle: refinement = '-fine' Right: refinement = '-veryfine'

Verify that models are correct.

To test these models, we calculate the electrode surface area to see if it is the same for all electrodes and for all models
% Test area of electrodes
% $Id: build_single_plane02.m 1535 2008-07-26 15:36:27Z aadler $

% verify np_fwd_parameters identifies
for i= 1:electrodes_per_plane*number_of_planes
      fprintf('\nelec#%02d (area,nodes):',i);
   for fmdl= { ng_mdl_16x1_coarse, ng_mdl_16x1_fine, ng_mdl_16x1_vfine }
      pp= np_fwd_parameters( fmdl{1} );
      ee= reshape( pp.elec(i,:), 3, []);
      ee(:, all(ee==0,1)) = [];

   %  Xs = reshape(pp.vtx(ee,1),3,[]);
   %  Ys = reshape(pp.vtx(ee,2),3,[]);
   %  Zs = reshape(pp.vtx(ee,3),3,[]);
   %  h=patch(Xs,Ys,Zs, 'b');
   %  set(h, 'FaceLighting','none', 'CDataMapping', 'direct' );

      elec_area= 0; elec_nodes= size(ee,2);
      for j= 1:elec_nodes
         elec_area = elec_area + triarea3d( pp.vtx( ee(:,j),:) );
      end
      fprintf('[ %6.5f (%3d) ]',elec_area, elec_nodes);

   end
end

Results are:
elec#01 (area,nodes):[ 0.76960 ( 54) ][ 0.77125 ( 59) ][ 0.78014 (155) ]
elec#02 (area,nodes):[ 0.76725 ( 45) ][ 0.77126 ( 57) ][ 0.78014 (145) ]
elec#03 (area,nodes):[ 0.76959 ( 46) ][ 0.77126 ( 57) ][ 0.78014 (149) ]
elec#04 (area,nodes):[ 0.76958 ( 48) ][ 0.77125 ( 55) ][ 0.78014 (129) ]
elec#05 (area,nodes):[ 0.76960 ( 46) ][ 0.77126 ( 61) ][ 0.78014 (149) ]
elec#06 (area,nodes):[ 0.76958 ( 44) ][ 0.77126 ( 47) ][ 0.78014 (143) ]
elec#07 (area,nodes):[ 0.76958 ( 48) ][ 0.77126 ( 65) ][ 0.78014 (157) ]
elec#08 (area,nodes):[ 0.76959 ( 50) ][ 0.77125 ( 55) ][ 0.78014 (129) ]
elec#09 (area,nodes):[ 0.76960 ( 54) ][ 0.77126 ( 49) ][ 0.78014 (149) ]
elec#10 (area,nodes):[ 0.76951 ( 52) ][ 0.77126 ( 63) ][ 0.78014 (163) ]
elec#11 (area,nodes):[ 0.76958 ( 58) ][ 0.77126 ( 61) ][ 0.78014 (173) ]
elec#12 (area,nodes):[ 0.76945 ( 50) ][ 0.77126 ( 55) ][ 0.78014 (125) ]
elec#13 (area,nodes):[ 0.76950 ( 54) ][ 0.77126 ( 53) ][ 0.78014 (149) ]
elec#14 (area,nodes):[ 0.76755 ( 45) ][ 0.77126 ( 57) ][ 0.78014 (161) ]
elec#15 (area,nodes):[ 0.76754 ( 47) ][ 0.77126 ( 57) ][ 0.78014 (159) ]
elec#16 (area,nodes):[ 0.76959 ( 52) ][ 0.77126 ( 49) ][ 0.78014 (155) ]

Last Modified: $Date: 2008-07-26 11:36:27 -0400 (Sat, 26 Jul 2008) $ by $Author: aadler $