edge_refined_elem_mapper

PURPOSE ^

EDGE_REFINED_ELEM_MAPPER: map elements from coarse to dense model

SYNOPSIS ^

function [index_simp]=edge_refined_elem_mapper( mdl_coarse, mdl_dense)

DESCRIPTION ^

 EDGE_REFINED_ELEM_MAPPER: map elements from coarse to dense model
 Calculates the index array mapping each dense mesh (from netgen)
  simp onto a coarse mesh (from netgen) simp.

 Usage:
  [index_simp]=edge_refined_elem_mapper( mdl_coarse, mdl_dense)

 (C) 2005 David Stephenson. Licensed under GPL v 2
 $Id: edge_refined_elem_mapper.html 2819 2011-09-07 16:43:11Z aadler $

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function [index_simp]=edge_refined_elem_mapper( mdl_coarse, mdl_dense)
0002 % EDGE_REFINED_ELEM_MAPPER: map elements from coarse to dense model
0003 % Calculates the index array mapping each dense mesh (from netgen)
0004 %  simp onto a coarse mesh (from netgen) simp.
0005 %
0006 % Usage:
0007 %  [index_simp]=edge_refined_elem_mapper( mdl_coarse, mdl_dense)
0008 %
0009 % (C) 2005 David Stephenson. Licensed under GPL v 2
0010 % $Id: edge_refined_elem_mapper.html 2819 2011-09-07 16:43:11Z aadler $
0011 
0012 index_simp = eidors_obj('get-cache', mdl_dense, 'index_simp', mdl_coarse);
0013 if ~isempty(index_simp)
0014     eidors_msg('edge_refined_elem_mapper: using cached value', 2);
0015     return
0016 end
0017 
0018 vtx_coarse =  mdl_coarse.nodes;
0019 simp_coarse = mdl_coarse.elems;
0020 vtx_dense =  mdl_dense.nodes;
0021 simp_dense = mdl_dense.elems;
0022 
0023 eidors_msg('edge_refined_elem_mapper: lookup_bld',4);
0024 [lookup]=lookup_bld(simp_coarse,simp_dense);
0025 
0026 eidors_msg('edge_refined_elem_mapper: center_of_simps',4);
0027 [center_simp_dense]=center_of_simps(simp_dense, vtx_dense);
0028 
0029 eidors_msg('edge_refined_elem_mapper: midpoints',4);
0030 [vtx_midpoints_coarse]=midpoints(vtx_coarse,simp_coarse);
0031 
0032 eidors_msg('edge_refined_elem_mapper: calc_h_refinement_centers',4);
0033 [center_h_refined_simps]=calc_h_refinement_centers(simp_coarse,vtx_coarse,vtx_midpoints_coarse);
0034 
0035 eidors_msg('edge_refined_elem_mapper: calc_simp_index',4);
0036 [index_simp] = calc_simp_index(simp_dense,center_simp_dense,center_h_refined_simps,lookup);
0037 
0038 % Cache the restult - it depends on both dense and coarse mdl
0039 eidors_obj('set-cache', mdl_dense, 'index_simp', index_simp, mdl_coarse);
0040 eidors_msg('edge_refined_elem_mapper: setting cached value', 2);
0041 
0042 
0043 function [lookup]=lookup_bld(simp_coarse,simp_dense);
0044 
0045 % This function calculates the lookup matrix of the dual mesh system (h-refinement) & is used for calculating index_simp.
0046 %
0047 % simp_coarse = the coarse mesh simp array.
0048 % simp_dense = the dense mesh simp array.
0049 
0050 a=size(simp_coarse,1); % i.e the number of coarse mesh elements
0051 b=size(simp_dense,1); % i.e the number of dense mesh elements
0052 
0053 lookup=zeros(b,1);
0054 
0055 x=1;
0056 y=8;
0057 
0058 for i=1:a;
0059     
0060     for ii=x:y;
0061         
0062         lookup(ii)=i;
0063         
0064         ii=ii+1;
0065         
0066     end
0067     
0068     x=x+8;
0069     y=y+8;
0070     
0071 end
0072 
0073 
0074 function [vtx_midpoints]=midpoints(vtx,simp);
0075 
0076 % Calculates The x y z co-ordinates of the 6 midpoints of a 4 node simp.
0077 %
0078 % vtx = The vertices matrix
0079 % simp = The simplices matrix
0080 % vtx_midpoints = The x y z co-ordinates of the 6 midpoints of a 4 node simp
0081 
0082 % Preallocation
0083 
0084 vtx_midpoints=zeros(size(simp,1),18);
0085 
0086 for i=1:size(simp,1);
0087     
0088     % Simp node 1~2
0089     x1=vtx(simp(i,1),1);
0090     y1=vtx(simp(i,1),2);
0091     z1=vtx(simp(i,1),3);
0092     x2=vtx(simp(i,2),1);
0093     y2=vtx(simp(i,2),2);
0094     z2=vtx(simp(i,2),3);
0095 
0096     
0097     x_mid=((x1+x2)/2);
0098     y_mid=((y1+y2)/2);
0099     z_mid=((z1+z2)/2);
0100     
0101     vtx_midpoints(i,1)=x_mid;
0102     vtx_midpoints(i,2)=y_mid;
0103     vtx_midpoints(i,3)=z_mid;
0104     
0105     % Simp node 1~3
0106     x1=vtx(simp(i,1),1);
0107     y1=vtx(simp(i,1),2);
0108     z1=vtx(simp(i,1),3);
0109     x2=vtx(simp(i,3),1);
0110     y2=vtx(simp(i,3),2);
0111     z2=vtx(simp(i,3),3);
0112     
0113     x_mid=((x1+x2)/2);
0114     y_mid=((y1+y2)/2);
0115     z_mid=((z1+z2)/2);
0116     
0117     vtx_midpoints(i,4)=x_mid;
0118     vtx_midpoints(i,5)=y_mid;
0119     vtx_midpoints(i,6)=z_mid;
0120     
0121     % Simp node 1~4
0122     x1=vtx(simp(i,1),1);
0123     y1=vtx(simp(i,1),2);
0124     z1=vtx(simp(i,1),3);
0125     x2=vtx(simp(i,4),1);
0126     y2=vtx(simp(i,4),2);
0127     z2=vtx(simp(i,4),3);
0128     
0129     x_mid=((x1+x2)/2);
0130     y_mid=((y1+y2)/2);
0131     z_mid=((z1+z2)/2);
0132     
0133     vtx_midpoints(i,7)=x_mid;
0134     vtx_midpoints(i,8)=y_mid;
0135     vtx_midpoints(i,9)=z_mid;
0136     
0137     % Simp node 2~3
0138     x1=vtx(simp(i,2),1);
0139     y1=vtx(simp(i,2),2);
0140     z1=vtx(simp(i,2),3);
0141     x2=vtx(simp(i,3),1);
0142     y2=vtx(simp(i,3),2);
0143     z2=vtx(simp(i,3),3);
0144    
0145     x_mid=((x1+x2)/2);
0146     y_mid=((y1+y2)/2);
0147     z_mid=((z1+z2)/2);
0148     
0149     vtx_midpoints(i,10)=x_mid;
0150     vtx_midpoints(i,11)=y_mid;
0151     vtx_midpoints(i,12)=z_mid;
0152 
0153     
0154     % Simp node 2~4
0155     x1=vtx(simp(i,2),1);
0156     y1=vtx(simp(i,2),2);
0157     z1=vtx(simp(i,2),3);
0158     x2=vtx(simp(i,4),1);
0159     y2=vtx(simp(i,4),2);
0160     z2=vtx(simp(i,4),3);
0161     
0162     x_mid=((x1+x2)/2);
0163     y_mid=((y1+y2)/2);
0164     z_mid=((z1+z2)/2);
0165     
0166     vtx_midpoints(i,13)=x_mid;
0167     vtx_midpoints(i,14)=y_mid;
0168     vtx_midpoints(i,15)=z_mid;
0169     
0170     % Simp node 3~4
0171     x1=vtx(simp(i,3),1);
0172     y1=vtx(simp(i,3),2);
0173     z1=vtx(simp(i,3),3);
0174     x2=vtx(simp(i,4),1);
0175     y2=vtx(simp(i,4),2);
0176     z2=vtx(simp(i,4),3);
0177     
0178     x_mid=((x1+x2)/2);
0179     y_mid=((y1+y2)/2);
0180     z_mid=((z1+z2)/2);
0181     
0182     vtx_midpoints(i,16)=x_mid;
0183     vtx_midpoints(i,17)=y_mid;
0184     vtx_midpoints(i,18)=z_mid;
0185     
0186     i=i+1;
0187     
0188 end
0189 
0190 function [center_h_refined_simps]=calc_h_refinement_centers(simp,vtx,vtx_midpoints);
0191 
0192 % This function calculates the center of mass of each h-refined simp from the coarse mesh.
0193 %
0194 % vtx      = The vertices matrix
0195 % simp     = The simplices matrix
0196 % vtx_midpoints  = The x y z co-ordinates of the 6 midpoints of a 4 node simp
0197 % center_h_refined_simps = the center of mass of each h-refined simp from the coarse mesh
0198 
0199 vtx_dave_1=[];
0200 vtx_dave_2=[];
0201 simp_dave=[1 5 6 7;2 5 8 9;3 6 8 10;4 7 9 10;5 6 7 9;5 6 8 9;6 7 9 10;6 8 9 10];
0202 center_simp_proximity=[];
0203 
0204 for i=1:size(simp,1);
0205     
0206     vtx_dave_1(1,1)=vtx(simp(i,1),1);
0207     vtx_dave_1(1,2)=vtx(simp(i,1),2);
0208     vtx_dave_1(1,3)=vtx(simp(i,1),3);
0209     
0210     vtx_dave_1(2,1)=vtx(simp(i,2),1);
0211     vtx_dave_1(2,2)=vtx(simp(i,2),2);
0212     vtx_dave_1(2,3)=vtx(simp(i,2),3);
0213     
0214     vtx_dave_1(3,1)=vtx(simp(i,3),1);
0215     vtx_dave_1(3,2)=vtx(simp(i,3),2);
0216     vtx_dave_1(3,3)=vtx(simp(i,3),3);
0217     
0218     vtx_dave_1(4,1)=vtx(simp(i,4),1);
0219     vtx_dave_1(4,2)=vtx(simp(i,4),2);
0220     vtx_dave_1(4,3)=vtx(simp(i,4),3);
0221     
0222     vtx_dave_2(1,1)=vtx_midpoints(i,1);
0223     vtx_dave_2(1,2)=vtx_midpoints(i,2);
0224     vtx_dave_2(1,3)=vtx_midpoints(i,3);
0225     
0226     vtx_dave_2(2,1)=vtx_midpoints(i,4);
0227     vtx_dave_2(2,2)=vtx_midpoints(i,5);
0228     vtx_dave_2(2,3)=vtx_midpoints(i,6);
0229     
0230     vtx_dave_2(3,1)=vtx_midpoints(i,7);
0231     vtx_dave_2(3,2)=vtx_midpoints(i,8);
0232     vtx_dave_2(3,3)=vtx_midpoints(i,9);
0233     
0234     vtx_dave_2(4,1)=vtx_midpoints(i,10);
0235     vtx_dave_2(4,2)=vtx_midpoints(i,11);
0236     vtx_dave_2(4,3)=vtx_midpoints(i,12);
0237     
0238     vtx_dave_2(5,1)=vtx_midpoints(i,13);
0239     vtx_dave_2(5,2)=vtx_midpoints(i,14);
0240     vtx_dave_2(5,3)=vtx_midpoints(i,15);
0241     
0242     vtx_dave_2(6,1)=vtx_midpoints(i,16);
0243     vtx_dave_2(6,2)=vtx_midpoints(i,17);
0244     vtx_dave_2(6,3)=vtx_midpoints(i,18);
0245     
0246     vtx_dave=[vtx_dave_1;vtx_dave_2];
0247     
0248     [center_simp_dave]=center_of_simps(simp_dave,vtx_dave);
0249     
0250     center_simp_proximity=[center_simp_proximity;center_simp_dave];
0251     
0252     vtx_dave_1=[];
0253     vtx_dave_2=[];
0254     
0255     i=i+1;
0256     
0257 end
0258 
0259 center_h_refined_simps=center_simp_proximity;
0260 
0261 
0262 
0263 function [index_simp] = calc_simp_index(simp_dense,centre_simp_dense,center_h_refined_simps,lookup);
0264 
0265 % Calculates the index array mapping each dense mesh (from netgen) simp onto a coarse mesh (from netgen) simp.
0266 %
0267 % simp_dense = The dense mesh simplices matrix
0268 % centre_simp_dense = The center of mass of each (netgen) dense mesh element
0269 % center_h_refined_simps = The center of mass of each h-refined simp from the coarse mesh
0270 % lookup = the lookup matrix of the dual mesh system (h-refinement)
0271 
0272 % Array pre-allocation
0273 
0274 dist_simp=zeros(size(simp_dense,1),1);
0275 index_simp=zeros(size(simp_dense,1),2);
0276 mat_dense=zeros(size(simp_dense,1),1);
0277 
0278 % Down to business ...
0279 
0280 h = waitbar(0,'Calculating Simplex Map');
0281 
0282 for id=1:size(simp_dense,1);   % for all dense center of simplicies
0283 
0284     waitbar(id/size(simp_dense,1))
0285 
0286     % find the x,y,z co-ord difference
0287     dx=centre_simp_dense(id,1)-center_h_refined_simps(:,1);
0288     dy=centre_simp_dense(id,2)-center_h_refined_simps(:,2);
0289     dz=centre_simp_dense(id,3)-center_h_refined_simps(:,3);
0290     
0291     dist_simp=sqrt((dx.^2)+(dy.^2)+(dz.^2));
0292        
0293     
0294     [m,I]=min(dist_simp);   % index out the minimum distance from the dense mesh to the id'th center of simplex
0295     
0296     index_simp(id,1)=lookup(I);
0297 
0298     index_simp(id,2)=m;   % write the actual minimum distance (as a quality control procedure)
0299     
0300 end
0301 
0302 close(h)
0303 
0304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0305 % This is part of the EIDORS suite.
0306 % Copyright (c) D.R Stephenson 2004
0307 % Copying permitted under terms of GNU GPL
0308 % See enclosed file gpl.html for details.
0309 % EIDORS 3D version XXX
0310 % MATLAB Version 6.5.0.180913a (R13)
0311 % MATLAB License Number: 1560
0312 % Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Service Pack 1)
0313 % Java VM Version: Java 1.3.1_01 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
0314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0315 
0316 
0317

Generated on Tue 09-Aug-2011 11:38:31 by m2html © 2005