EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software |
EIDORS
(mirror) Main Documentation Tutorials − Image Reconst − Data Structures − Applications − FEM Modelling − GREIT − Old tutorials − Workshop Download Contrib Data GREIT Browse Docs Browse SVN News Mailing list (archive) FAQ Developer
|
Using Netgen to create general (arbitrary) EIDORS ModelsEIDORS can use Netgen to create sophisticated 2D and 3D modelsHere are some examples of the varity of models which can be generated using the function: ng_mk_gen_models.
Shape 1shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid p1= plane(0,0,0;0,0.5,-1);\n' ... 'solid p2= plane(0,0,2;0.5,0, 1);\n' ... 'solid mainobj= p1 and p2 and cyl -maxh=0.3;\n']; elec_pos = []; elec_shape = []; elec_obj = {}; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 2shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid mainobj= plane(0,0,0;0,0,-1)\n' ... 'and plane(0,0,1.5;0.2,0.2,1)\n' ... 'and cyl -maxh=0.3;\n']; elec_pos = [ -1, 0, 1, 1, 0, 0; 0, -1,1.2, 0, 1, 0]; elec_shape=[0.1,0,0;0.2,0.3,0.02]; elec_obj = 'cyl'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 3shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid mainobj= orthobrick(-2,-2,0;2,2,2) and cyl -maxh=0.3;\n']; th = linspace(0,2*pi,15)'; th(end) = []; cs = [cos(th), sin(th)]; elec_pos = [ cs, th/2/pi + 0.5, cs, 0*th]; elec_shape=[0.1]; elec_obj = 'cyl'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 4shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid mainobj= orthobrick(-2,-2,0;2,2,2) and cyl -maxh=0.3;\n']; th = linspace(0,2*pi,15)'; th(end) = []; cs = [cos(th), sin(th)]; elec_pos = [ cs, th/2/pi + 0.5, cs, 0*th]; elec_shape=[0.1*th/2/pi + 0.05]; elec_obj = 'cyl'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 5shape_str = ['solid cyl = cylinder (0,0,0; 1,0,0; 1); \n', ... 'solid mainobj= plane(0,0,0;-1,0,0)\n' ... 'and plane(2,0,0;1,0,0)\n' ... 'and plane(0,0,-0.5;0,0,-1)\n' ... 'and cyl -maxh=0.3;\n']; elec_pos = [ 1, 0, 1, 0, 0, 1; 1.2, 1, 0, 0, 1, 0]; elec_shape=[0.1]; elec_obj = 'cyl'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 6shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid bottom = plane(0,0,0;0,0,-1);\n' ... 'solid top = plane(0,0,2;0,0,1);\n' ... 'solid mainobj= top and bottom and cyl -maxh=0.3;\n']; elec_pos = [ 1, 0, 1, 1, 0, 0; 0, 1,1.2, 0, 1, 0; 0.8, 0, 0, 0, 0, -1]; elec_shape=[0.1]; elec_obj = {'cyl','cyl','bottom'}; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 7shape_str = ['solid top = plane(0,0,0;0,0,1);\n' ... 'solid mainobj= top and orthobrick(-2,-2,-2;2,2,0);\n']; elec_pos = [ 1, 0, 0, 0, 0, 1; 0, 0, 0, 0, 0, 1; -1, 0, 0, 0, 0, 1]; elec_shape=[0.1]; elec_obj = 'top'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 8shape_str = ['solid top = plane(0,0,0;0,0,1);\n' ... 'solid cyl = ellipticcylinder(0,0,0;2.5,0,0;0,1,0);\n' ... 'solid mainobj= top and cyl and orthobrick(-2,-2,-2;2,2,0);\n']; elec_pos = [ 1, 0, 0, 0, 0, 1; 0, 0, 0, 0, 0, 1; -1, 0, 0, 0, 0, 1; 1, -1,-1.2, 0, -1, 0; 0, -1,-1.0, 0, -1, 0; -1, -1,-0.8, 0, -1, 0]; elec_shape=[0.1]; elec_obj = {'top','top','top','cyl','cyl','cyl'}; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); show_fem( fmdl ); Shape 9shape_str = ['solid top = plane(0,0,0;0,0,1);\n' ... 'solid ball = sphere(-1.25,0,-1;0.5); tlo ball;\n' ... 'solid mainobj= top and orthobrick(-2,-1,-2;2,1,0) and not ball -maxh=0.5;\n']; elec_pos = linspace( -1.5,1.5,5)'; elec_pos = [ elec_pos, elec_pos*[0,0,0,0], elec_pos*0+1]; elec_shape=[0.3]; elec_obj = 'top'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); img = mk_image( fmdl, 1); img.elem_data(fmdl.mat_idx{2}) = 1.1; show_fem( img ); Shape 10shape_str = ['solid top = plane(0,0,0;0,0,1);\n' ... 'solid mainobj= top and orthobrick(-3,-3,-2;3,3,0) -maxh=0.5;\n']; [elec_pos_x,elec_pos_y] = meshgrid(linspace( -1.5,1.5,5),linspace(-2,2,7)); elec_pos = [ elec_pos_x(:), elec_pos_y(:), ones(size(elec_pos_x(:)))*[0,0,0,1] ]; elec_shape=[0.2]; elec_obj = 'top'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); Shape 11This shape could represent an elliptical fish or submarine generating electrical signals in a tank with electrodes on the tank boundary.shape_str = ['solid cyl = cylinder (0,0,0; 0,0,1; 1.0); \n', ... 'solid tank = orthobrick(-2,-2,0;2,2,0.4) and cyl; \n', ... 'solid fish = ellipsoid(0.2,0.2,0.2;0.2,0,0;0,0.1,0;0,0,0.1); tlo fish;\n', ... 'solid mainobj= tank and not fish -maxh=0.3;\n']; n_elec = 7; th = linspace(0,2*pi,n_elec+1)'; th(end) = []; cs = [cos(th), sin(th)]; elec_pos = [ cs, 0.2+0*th, cs, 0*th]; elec_shape=[0.05]; for i=1:n_elec; elec_obj{i} = 'cyl'; end i=i+1;elec_pos(i,:) = [ 0 ,0.2,0.2,-1,0,0]; elec_obj{i} = 'fish'; i=i+1;elec_pos(i,:) = [ 0.4,0.2,0.2, 1,0,0]; elec_obj{i} = 'fish'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); Tank with 7 electrodes on the boundary an two electrodes on the inclusion. Shape 12shape_str = ['solid top = ellipsoid(0,0,0; 0,0,1; 1,0,0; 0,1,0); \n' ... 'solid mainobj= top and orthobrick(-2,-2,0;2,2,2) -maxh=0.1;\n']; deg2rad = pi/180; th = (-70:20:70)'*deg2rad; elec_pos = [0*th,sin(th),cos(th),0*th,sin(th),cos(th); ... sin(th),0*th,cos(th),sin(th),0*th,cos(th)]; elec_shape=[0.05]; elec_obj = 'top'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); Half sphere with top surface electrodes Shape 13shape_str = ['solid cyl = cylinder (0,0,0; 0,1,0; 1); \n', ... 'solid bottom = plane(0, 0,0;0,-1,0);\n' ... 'solid top = plane(0,10,0;0, 1,0);\n' ... 'solid cut1 = plane(0, 4,0;0,-1,0);\n' ... 'solid cut2 = plane(0, 6,0;0, 1,0);\n' ... 'solid ball = cyl and cut1 and cut2; tlo ball;\n' ... 'solid mainobj= ( top and (not cut2) and cyl ) or ' ... '(bottom and (not cut1) and cyl ) -maxh=0.8;\n']; elec_pos = [ 0, 10, 0, 0, 1, 0; 0, 0, 0, 0, -1, 0]; elec_shape=[1.0]; elec_obj = {'top','bottom'}; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); img = mk_image(fmdl,1); img.elem_data(fmdl.mat_idx{2}) = 1.1; Fem model of a cylindrical resistor with electrodes at the ends Shape 14shape_str = ['solid cyl = cylinder (0,0,0; 0,1,0; 1); \n', ... 'solid bottom = plane(0, 0,0;0,-1,0);\n' ... 'solid top = plane(0,15,0;0, 1,0);\n' ... 'solid cut1 = plane(0, 6,0;0,-1,0);\n' ... 'solid cut2 = plane(0, 9,0;0, 1,0);\n' ... 'solid rod = cyl and (top and not cut2) or cyl and (bottom and not cut1);\n' ... 'tlo rod -maxh=0.8;\n',... 'solid mainobj= orthobrick(-5,-5,-5;5,20,5) and not rod;\n']; elec_pos = [0,15, 0, 0, 1, 0; %top end electrode 0,13, 0,-1, 0, 0; %top cylinder electrode 0, 0, 0, 0,-1, 0; %bot end electrode 0, 2, 0, 1, 0, 0];%bot cylinder electrode elec_shape=[6,0,0]; elec_obj = {'rod','rod','rod','rod'}; [fmdl,mat_idx] = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); img = mk_image(fmdl,1); % join electrodes fmdl.electrode(3).nodes = unique(horzcat(fmdl.electrode(3:4).nodes)); fmdl.electrode(4) = []; fmdl.electrode(1).nodes = unique(horzcat(fmdl.electrode(1:2).nodes)); fmdl.electrode(2) = []; Bare conductive wires within a tank Shape 15shape_str = [ ... 'solid cyl = cylinder (-2,0,0;-2,0,1; 0.1); \n', ... 'solid borehole= cyl and plane (0,0,-2;0,0,-1); \n', ... 'solid cel1= orthobrick(-10,-10,-1.1;10,10,-1.0) and cyl; tlo cel1 -maxh=0.5;\n' ... 'solid cel2= orthobrick(-10,-10,-1.6;10,10,-1.5) and cyl; tlo cel2 -maxh=0.5;\n' ... 'solid top = plane(0,0,0;0,0,1);\n' ... 'solid top_obj= top and orthobrick(-5,-5,-5;5,5,0) -maxh=0.5;\n' ... 'solid mainobj= top_obj and not borehole;\n']; [elec_pos_x,elec_pos_y] = meshgrid(linspace( -1.5,1.5,3),linspace(-2,2,4)); elec_pos = [ elec_pos_x(:), elec_pos_y(:), ones(size(elec_pos_x(:)))*[0,0,0,1] ]; elec_shape=[0.1]; elec_obj = repmat({'top'}, 1, size(elec_pos,1)); elec_pos(end+1,:) = [-2.0,0,-1.05,0,0,1]; elec_obj(end+1) = {'cel1'}; elec_pos(end+1,:) = [-2.0,0,-1.55,0,0,1]; elec_obj(end+1) = {'cel2'}; [fmdl,mat_idx] = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj);To crop the model, use the code crop_model([], inline('z<-2 | abs(x)>2.5 | abs(y)>2.5','x','y','z')); axis([-2.5,2.5,-2.5,2.5,-2,0]); Surface electrodes and ring electrodes on a borehole Shape 16shape_str = ['solid top = plane( 0, 0, 0; 0, 0, 1);\n' ... 'solid bot = plane( 0, 0,-1; 0, 0,-1);\n' ... 'solid xmax = plane( 3, 0, 0; 1, 0, 0);\n' ... 'solid xmin = plane(-3, 0, 0;-1, 0, 0);\n' ... 'solid ymax = plane( 0, 2, 0; 0, 2, 0);\n' ... 'solid ymin = plane( 0,-2, 0; 0,-2, 0);\n' ... 'solid mainobj= top and bot and xmax and xmin and ymax and ymin;']; elec_pos = [ 1, -2, 0, 0, 1, 0; 0, -2, 0, 0, 1, 0; -1, -2, 0, 0, 1, 0; -1, 2, 0, 0, -1, 0; -3, 1, 0, -1, 0, 0]; elec_shape=[0.4,1,0.05]; elec_obj = {'ymin', 'ymin', 'ymin','ymax','xmin'}; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj);To crop the z=0 layer, use fmdl = mdl2d_from3d(fmdl); A 2D slice of a model on the z=0 plane Shape 17shape_str = [ ... 'solid cyl = cylinder (0,0,0; 0,0,1; 1); \n', ... 'solid mainobj= plane(0,0,0;0,0,-1)\n' ... 'and plane(0,0,2;0,0,1)\n' ... 'and cyl -maxh=0.3;\n' ... 'solid in_elec = sphere(0,-1,1;0.2)' ... 'and not sphere(0,-1,1;0.15) -maxh=0.05;\n' ... 'solid in_elec0= in_elec and mainobj;\n' ... 'tlo in_elec0 cyl;\n' ... 'solid out_elec = sphere(0,-1,1;0.4)' ... 'and not sphere(0,-1,1;0.35) -maxh=0.05;\n' ... 'solid out_elec0= out_elec and mainobj;\n' ... 'tlo out_elec0 cyl;\n']; % Find a background electrode (for all) first. This will stop errors in the next elec_pos = [ 0, -1, 0, NaN,NaN,NaN; 1, 0, 1, 1, 0, 0; 0, 1, 1.2, 0, 1, 0; 0, -1, 1.2, NaN,NaN,NaN; 0, -1, 1.4, NaN,NaN,NaN]; elec_shape=[0.1]; elec_obj = 'cyl'; fmdl = ng_mk_gen_models(shape_str, elec_pos, elec_shape, elec_obj); % Throw away the first electrode (background). We don't need it fmdl.electrode = fmdl.electrode(2:end); Complex electrodes defined from intersection with spheres Shape 18shape_str= [ ... 'solid top = plane(0,0,0;0,1,0);\n' ... 'solid cut2d = plane(0,0,0;0,0,1) -maxh=0.15;\n' ... 'solid mainobj= top and cut2d and orthobrick(-2,-2,-1;2,2,1);\n']; x_elec_pos = linspace(-1.5,1.5,5); elec_pos = x_elec_pos(:)*[1,0,0,0,0,0]; elec_pos(:,5) = 1; elec_shape=[0.05]; elec_obj = 'top'; fmdl3= ng_mk_gen_models(shape_str, ... elec_pos, elec_shape, elec_obj); subplot(121); show_fem(fmdl3); fmdl2 = mdl2d_from3d( fmdl3); subplot(122); show_fem_enhanced( fmdl2); gridx= linspace(-2.0,2.0,15); gridy= linspace(-2.0,0,7); [cmdl,c2f]= mk_grid_model(fmdl2,gridx,gridy); fmdl2.coarse2fine = c2f; hold on; hh=show_fem(cmdl); set(hh,'LineWidth',2,'EdgeColor',[.5,.7,1],'FaceAlpha',0); Grid model on onto a 2D model from a z=0 slice of a 3D model |
Last Modified: $Date: 2018-11-10 07:39:55 -0500 (Sat, 10 Nov 2018) $ by $Author: aadler $