0001 function [Ef,D,Ela] = bld_master_full(vtx,simp,mat,elec,zc);
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 dimen= size(vtx,2);
0020 if dimen==2
0021 [Ef,D,Ela] = bld_master_full_2d(vtx,simp,mat,elec,zc);
0022 elseif dimen==3
0023 [Ef,D,Ela] = bld_master_full_3d(vtx,simp,mat,elec,zc);
0024 else
0025 error('not 2d or 3d');
0026 end
0027
0028 function [Ef,D,Ela] = bld_master_full_2d(vtx,simp,mat,elec,zc);
0029
0030 [vr, vc] = size(vtx);
0031 [sr, sc] = size(simp);
0032 [er, ec] = size(elec);
0033
0034
0035 if length(mat) ~= sr
0036 error('Invalid conductivity information for this mesh');
0037 end
0038
0039
0040 if length(zc) == er
0041
0042
0043
0044
0045 [E,D,Ela] = bld_master(vtx,simp,mat);
0046
0047
0048 E = full(E);
0049
0050 Ef = spalloc(vr+er,vr+er, er * vr);
0051
0052 Ef(1:vr,1:vr) = E;
0053
0054
0055 while length(zc) ~= er
0056 disp(sprintf('Please enter the correct zc column vector with length: %d',er));
0057
0058 end
0059
0060
0061 for q=1:er
0062
0063 tang_dist = 0;
0064
0065 q_th_ele = elec(q,:);
0066
0067 q_th_ele_zf = nonzeros(q_th_ele)';
0068
0069 for w=1:2:length(q_th_ele_zf)
0070
0071 m = q_th_ele_zf(w);
0072 n = q_th_ele_zf(w+1);
0073
0074
0075
0076
0077
0078 xm = vtx(m,1);
0079 ym = vtx(m,2);
0080 xn = vtx(n,1);
0081 yn = vtx(n,2);
0082
0083 [dist] = db2p(xm,ym,xn,yn);
0084
0085 cali_dist = dist ./ zc(q);
0086
0087 tang_dist = tang_dist + cali_dist;
0088
0089
0090
0091 Ef(m,vr+q) = Ef(m,vr+q) - cali_dist/2 ;
0092 Ef(n,vr+q) = Ef(n,vr+q) - cali_dist/2 ;
0093
0094 Ef(vr+q,m) = Ef(vr+q,m) - cali_dist/2 ;
0095 Ef(vr+q,n) = Ef(vr+q,n) - cali_dist/2 ;
0096
0097
0098 Ef(m,m) = Ef(m,m) + cali_dist/3;
0099 Ef(n,n) = Ef(n,n) + cali_dist/3;
0100 Ef(m,n) = Ef(m,n) + cali_dist/6;
0101 Ef(n,m) = Ef(n,m) + cali_dist/6;
0102
0103 end
0104
0105 Ef(vr+q,vr+q) = Ef(vr+q,vr+q) + tang_dist;
0106
0107 end
0108
0109 end
0110
0111 function [Ef,D,Ela] = bld_master_full_3d(vtx,simp,mat,elec,zc);
0112 [vr, vc] = size(vtx);
0113 [sr, sc] = size(simp);
0114 [er, ec] = size(elec);
0115
0116
0117 if length(mat) ~= sr
0118 error('Invalid conductivity information for this mesh');
0119 end
0120
0121
0122 [Ef,D,Ela] = bld_master(vtx,simp,mat);
0123
0124
0125
0126 [Ef_i, Ef_j, Ef_s]= find( Ef );
0127 Ef = sparse(Ef_i, Ef_j, Ef_s, vr+er, vr+er);
0128
0129
0130
0131
0132
0133
0134 if length(zc) ~= er
0135 error(sprintf('zc (=%d) should be equal to er (=%d)',length(zc),er));
0136 end
0137
0138
0139 for q=1:er
0140
0141 tang_area = 0;
0142
0143 q_th_ele = nonzeros(elec(q,:));
0144
0145 if length(q_th_ele) ==1
0146 m = q_th_ele;
0147 cali_area = 1 / zc(q);
0148
0149 tang_area = tang_area + cali_area;
0150
0151 Ef(m,vr+q) = Ef(m,vr+q) - cali_area/2 ;
0152 Ef(vr+q,m) = Ef(vr+q,m) - cali_area/2 ;
0153
0154 Ef(m,m) = Ef(m,m) + cali_area/2;
0155
0156 else
0157 for w=1:3:length(q_th_ele)
0158
0159 m = q_th_ele(w);
0160 n = q_th_ele(w+1);
0161 l = q_th_ele(w+2);
0162
0163
0164
0165
0166
0167 Are = triarea3d(vtx([m n l],:));
0168
0169
0170
0171 cali_area = (2*Are) ./ zc(q);
0172
0173
0174 tang_area = tang_area + cali_area;
0175
0176
0177
0178 Ef(m,vr+q) = Ef(m,vr+q) - cali_area/6 ;
0179 Ef(n,vr+q) = Ef(n,vr+q) - cali_area/6 ;
0180 Ef(l,vr+q) = Ef(l,vr+q) - cali_area/6 ;
0181
0182 Ef(vr+q,m) = Ef(vr+q,m) - cali_area/6 ;
0183 Ef(vr+q,n) = Ef(vr+q,n) - cali_area/6 ;
0184 Ef(vr+q,l) = Ef(vr+q,l) - cali_area/6 ;
0185
0186 Ef(m,m) = Ef(m,m) + cali_area/12;
0187 Ef(m,n) = Ef(m,n) + cali_area/24;
0188 Ef(m,l) = Ef(m,l) + cali_area/24;
0189
0190 Ef(n,m) = Ef(n,m) + cali_area/24;
0191 Ef(n,n) = Ef(n,n) + cali_area/12;
0192 Ef(n,l) = Ef(n,l) + cali_area/24;
0193
0194 Ef(l,m) = Ef(l,m) + cali_area/24;
0195 Ef(l,n) = Ef(l,n) + cali_area/24;
0196 Ef(l,l) = Ef(l,l) + cali_area/12;
0197
0198
0199 end
0200 end
0201 Ef(vr+q,vr+q) = Ef(vr+q,vr+q) + 0.5*tang_area;
0202
0203 end
0204
0205
0206 function [dist] = db2p(xa,ya,xb,yb);
0207
0208 dist = sqrt((xb - xa).^2 + (yb - ya).^2);
0209
0210
0211
0212
0213
0214
0215
0216
0217