0001 function [Agrad,Kb,M,S,C]=FemMatrixNode(Node,Element,z);
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 Nel=max(size(z));
0028 NNode=max(size(Node));
0029 NElement=max(size(Element));
0030 M=sparse(NNode,Nel);
0031 Kb=sparse(NNode,NNode);
0032 s=zeros(Nel,1);
0033 mE=max(size(Element(1).Topology));
0034 if mE==3
0035 Agrad=sparse(NNode^2,NNode);
0036 H=reshape([Element.Topology],3,NElement)';
0037 mH=max(max(H));
0038 else
0039 H=reshape([Element.Topology],6,NElement)';
0040 mH=max(max(H(:,1:2:6)));
0041 Agrad=sparse(NNode^2,mH);
0042 clear H
0043 end
0044 g=reshape([Node.Coordinate],2,NNode)';
0045
0046 for jj=1:mH
0047 Aa=sparse(NNode,NNode);
0048 El=Node(jj).ElementConnection;
0049 for ii=1:max(size(El))
0050 ind=Element(El(ii)).Topology;
0051 gg=g(ind,:);
0052 if max(size(gg))==3
0053 indsig=ind;
0054 I=find(jj==indsig);
0055 anis=grinprodgausnode(gg,I);
0056 Aa(ind,ind)=Aa(ind,ind)+anis;
0057 else
0058 indsig=ind(1:2:6);
0059 I=find(jj==indsig);
0060 anis=grinprodgausnodequad(gg,I);
0061 Aa(ind,ind)=Aa(ind,ind)+anis;
0062 end
0063 end
0064 Agrad(:,jj)=Aa(:);
0065 end
0066
0067 for ii=1:NElement
0068 ind=(Element(ii).Topology);
0069 gg=g(ind,:);
0070
0071 if any([Element(ii).Face{:,3}]),
0072
0073 [In,Jn,InE]=find([Element(ii).Face{:,3}]);
0074 bind=Element(ii).Face{Jn,1};
0075 ab=g(bind(:),:);
0076
0077 if max(size(bind))==2
0078 bb1=bound1([ab]);Bb1=zeros(max(size(ind)),1);
0079 bb2=bound2([ab]);Bb2=zeros(max(size(ind)));
0080
0081 s(InE)=s(InE)+1/z(InE)*2*bb1;
0082
0083 eind=[find(bind(1)==ind),find(bind(2)==ind)];
0084 else
0085 bb1=boundquad1([ab]);Bb1=zeros(max(size(ind)),1);
0086 bb2=boundquad2([ab]);Bb2=zeros(max(size(ind)));
0087
0088 s(InE)=s(InE)+1/z(InE)*electrlen([ab]);
0089
0090 eind=[find(bind(1)==ind),find(bind(2)==ind),find(bind(3)==ind)];
0091 end
0092
0093 Bb1(eind)=bb1;
0094 M(ind,InE)=M(ind,InE)-1/z(InE)*Bb1;
0095
0096 Bb2(eind,eind)=bb2;
0097 Kb(ind,ind)=Kb(ind,ind)+1/z(InE)*Bb2;
0098 else
0099 end
0100 end
0101
0102 S=sparse(diag(s));
0103
0104 [II1,C]=Current(Nel,NNode,'adj');
0105 C=C(:,1:Nel-1);
0106 C=sparse(C(:,1:Nel-1));
0107
0108 S=C'*S*C;
0109 M=M*C;
0110
0111
0112
0113
0114
0115
0116