0001 function [s_mat]=system_mat_higher_order(fwd_model,img)
0002
0003
0004
0005 if nargin == 1
0006 img= fwd_model;
0007 elseif strcmp(getfield(warning('query','EIDORS:DeprecatedInterface'),'state'),'on')
0008 warning('EIDORS:DeprecatedInterface', ...
0009 ['Calling SYSTEM_MAT_HIGHER_ORDER with two arguments is deprecated and will cause' ...
0010 ' an error in a future version. First argument ignored.']);
0011 end
0012 fwd_model= img.fwd_model;
0013
0014
0015 elecstruc=fwd_model.electrode; nelecs=size(elecstruc,2);
0016 nodestruc=fwd_model.nodes; nnodes=size(nodestruc,1);
0017
0018
0019 if(size(elecstruc(1).nodes,2)==1 && size(elecstruc(1).nodes,1)==1)
0020
0021 [At,elemstiff]=mc_calc_stiffness(fwd_model,img);
0022 else
0023 [Am,elemstiff]=mc_calc_stiffness(fwd_model,img);
0024
0025 [Aw,Az,Ad]=mc_calc_complete(fwd_model);
0026 At=zeros(nnodes+nelecs,nnodes+nelecs);
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 At(1:nnodes,1:nnodes) = Am+Az;
0037 At(1:nnodes,nnodes+1:nnodes+nelecs) = Aw;
0038 At(nnodes+1:nnodes+nelecs,1:nnodes)=Aw';
0039 At(nnodes+1:nnodes+nelecs,nnodes+1:nnodes+nelecs)=Ad;
0040 end
0041
0042
0043 s_mat.E=sparse(At);
0044
0045
0046 s_mat.elemstiff=elemstiff;
0047 end
0048
0049
0050 function [Agal,elemstiff]=mc_calc_stiffness(fwd_model,img)
0051
0052
0053
0054
0055 if(nargin==1)
0056 img=fwd_model; fwd_model=img.fwd_model;
0057 end
0058
0059
0060
0061 nodestruc=fwd_model.nodes; nodedim=size(nodestruc,2); nnodes=size(nodestruc,1);
0062 elemstruc=fwd_model.elems; nelems=size(elemstruc,1);
0063
0064
0065 eletype=fwd_model.approx_type;
0066 if(strcmp(eletype,'tri3'))
0067 dim=2; order=0;
0068 elseif(strcmp(eletype,'tri6'))
0069 dim=2; order=2;
0070 elseif(strcmp(eletype,'tri10'))
0071 dim=2; order=4;
0072 elseif(strcmp(eletype,'tet4'))
0073 dim=3; order=0;
0074 elseif(strcmp(eletype,'tet10'))
0075 dim=3; order=2;
0076 else
0077 error('Element type not recognised for integration rules');
0078 end
0079 [weight,xcoord,ycoord,zcoord]=gauss_points(dim,order);
0080
0081
0082 for kk=size(weight,2):-1:1
0083 dphi(:,:,kk) = element_d_shape_function(eletype,xcoord(kk),ycoord(kk),zcoord(kk));
0084 end
0085
0086
0087 Agal=zeros(nnodes,nnodes);
0088
0089
0090
0091
0092 for i=nelems:-1:1
0093
0094 eleminodelist=elemstruc(i,:);
0095
0096
0097 thise = nodestruc(eleminodelist,:);
0098
0099
0100 if(nodedim==2); jacobianelem = ...
0101 [thise(2,1)-thise(1,1),thise(2,2)-thise(1,2); ...
0102 thise(3,1)-thise(1,1),thise(3,2)-thise(1,2)];
0103 elseif(nodedim==3); jacobianelem = ...
0104 [thise(2,1)-thise(1,1),thise(2,2)-thise(1,2),thise(2,3)-thise(1,3); ...
0105 thise(3,1)-thise(1,1),thise(3,2)-thise(1,2),thise(3,3)-thise(1,3); ...
0106 thise(4,1)-thise(1,1),thise(4,2)-thise(1,2),thise(4,3)-thise(1,3)];
0107 end
0108
0109
0110
0111 magjacelem=abs(det(jacobianelem));
0112
0113
0114 Ammat=0;
0115 for kk=1:size(weight,2)
0116
0117
0118
0119 jdphitemp=jacobianelem\dphi(:,:,kk);
0120 Ammat = Ammat + weight(kk)* ...
0121 (jdphitemp'*jdphitemp)*magjacelem;
0122 end
0123
0124
0125
0126
0127
0128 elemstiff(i).elemstiff=Ammat;
0129
0130
0131
0132 stiff=Ammat*img.elem_data(i);
0133
0134
0135 Agal(elemstruc(i,:), elemstruc(i,:)) = Agal(elemstruc(i,:), elemstruc(i,:)) + stiff;
0136
0137 end
0138
0139 end
0140
0141
0142 function [Aw,Az,Ad]=mc_calc_complete(fwd_model)
0143
0144
0145
0146
0147
0148 elecstruc=fwd_model.electrode; nelecs=size(elecstruc,2);boundstruc=fwd_model.boundary; nodestruc=fwd_model.nodes;
0149 nnodes=size(nodestruc,1); nodedim=size(nodestruc,2);
0150
0151
0152
0153
0154
0155
0156
0157 eletype=fwd_model.approx_type;
0158 if(strcmp(eletype,'tri3'))
0159 dim=1; order=2;
0160 elseif(strcmp(eletype,'tri6'))
0161 dim=1; order=4;
0162 elseif(strcmp(eletype,'tri10'))
0163 dim=1; order=6;
0164 elseif(strcmp(eletype,'tet4'))
0165 dim=2; order=2;
0166 elseif(strcmp(eletype,'tet10'))
0167 dim=2; order=4;
0168 else
0169 error('Element type not recognised for integration rules');
0170 end
0171 [weight,xcoord,ycoord]=gauss_points(dim,order);
0172
0173
0174 for kk=size(weight,2):-1:1
0175 phi(:,kk) = boundary_shape_function(eletype,xcoord(kk),ycoord(kk))';
0176 end
0177
0178
0179 Az=zeros(nnodes,nnodes); Aw=zeros(nnodes,nelecs); Ad=zeros(nelecs,nelecs);
0180
0181
0182 for ke=1:nelecs
0183
0184 [bdy_idx,bdy_area]=find_electrode_bdy(boundstruc(:,1:nodedim),nodestruc,elecstruc(ke).nodes);
0185
0186
0187 boundidx_ke=bdy_idx; area_ke=bdy_area;
0188
0189
0190 elecimped=elecstruc(ke).z_contact;
0191
0192
0193 elecarea=0;
0194 for i=1:size(area_ke,2)
0195 elecarea = elecarea + abs(area_ke(i));
0196 end
0197
0198
0199 Ad(ke,ke)=elecarea/elecimped;
0200
0201
0202
0203 for ii=1:length(boundidx_ke)
0204
0205 thisb=nodestruc(boundstruc(boundidx_ke(ii),:),:);
0206
0207
0208
0209 if(nodedim==2)
0210
0211 diff21=thisb(2,:)-thisb(1,:);
0212 magjacbound=0.5*sqrt(diff21(1)^2+diff21(2)^2);
0213 elseif(nodedim==3)
0214
0215 diffprod=cross(thisb(3,:)-thisb(1,:),thisb(3,:)-thisb(2,:));
0216 magjacbound=sqrt(diffprod(1)^2+diffprod(2)^2+diffprod(3)^2);
0217 end
0218
0219
0220 Azmat=0; Awmat=0;
0221 for kk=1:size(weight,2)
0222 temphikk = phi(:,kk);
0223 Azmat = Azmat + weight(kk)* ...
0224 (temphikk*temphikk')*magjacbound;
0225 Awmat = Awmat + weight(kk)* ...
0226 (phi(:,kk))'*magjacbound;
0227
0228
0229
0230
0231
0232 end
0233
0234
0235 boundnodes=boundstruc(boundidx_ke(ii),:);
0236
0237
0238 Az(boundnodes,boundnodes) = Az(boundnodes,boundnodes)+Azmat/elecimped;
0239 Aw(boundnodes,ke) = Aw(boundnodes,ke) - Awmat'/elecimped;
0240 end
0241
0242 end
0243
0244 end
0245