How can i correct this error ?

2 次查看(过去 30 天)
Mallouli Marwa
Mallouli Marwa 2016-8-4
Hi
My problem is about a three node cantilever beam. I do a program that estimate the mass and stiffness matrix. c is an
output variable.
But, i obtain this error
Undefined function or variable "c". Error in fe_mk (line 79) if length(c)~=0 Error in prog_principle (line 31) [m,k,mdof]= fe_mk(node,elt,pl,il)
My priniciple program is :
format long g;
format compact;
% node# unused x y z
node=[1 0 0 0 0 0 0;
2 0 0 0 25.4e-03 0 0;
3 0 0 0 50.8e-03 0 0;
4 0 0 0 1 1 1];
elt=[
%declaration of elemnt groupe
Inf abs('beam1')
%node1 node2 pl il refnode
1 2 1 1 4 0 %longerons
2 3 1 1 4 0];
% matid matType E nu rho
pl=[ 1 1 10.5e+10 3.4e-01 9e+03];
% secId SecType J i1 i2 A
il=[ 1 1 3.75e-10 7.27e-15 3.75e-10 4.452e-06 ]; %longerons
%call of function
[m,k,mdof]= fe_mk(node,elt,pl,il)
And the fe_mk funtion is :
function [m,k,mdof]=fe_mk(node,elt,pl,il)
NNode = zeros(max(node(:,1)),1);NNode(node(:,1))=(1:length(node(:,1)))';
if nargin==4 ty='mka';mode=[];adof=[];
elseif nargin==7 && opt(1)==2 ty='ene';
elseif nargin==7 && opt(1)==1 ty='dmk';
elseif nargin==7 && opt(1)==0 ty='mka';
else disp ('not a valid value for opt(1)');
end
EGroup = [find(elt(:,1)==Inf)' size(elt,1)+1];
nGroup = length(EGroup)-1;nM=size(mode,2);nA=length(adof);
if strcmp(ty,'mka')&& nM==0
k = spalloc(size(node,1)*6,size(node,1)*6,size(elt,1)*100);
m = spalloc(size(node,1)*6,size(node,1)*6,size(elt,1)*100);
if nargout==4
c = spalloc(size(node,1)*6,size(node,1)*6,size(elt,1)*100);
end
elseif strcmp(ty,'mka')&& nM~=0
k = zeros(nM); m = zeros(nM);
if nargout == 4 c = zeros(nM); end
elseif strcmp(ty,'ene')&& nM~=0
m=zeros(size(elt,1),nM);
if nargout==2 c=m;end
elseif strcmp(ty,'ene')&& nM==0
error('Cannot compute energies without a mode');
elseif strcmp(ty,'dmk') && nM==0
if nA==0 error('adof is empty, cannot assemble group stiffness'); end
k = spalloc(nA*nGroup,nA,size(elt,1)*100);m=k;
if nargout == 4 c = k; end
elseif strcmp(ty,'dmk') && nM~=0
k = zeros(nM*nGroup,nM); m = k;
if nargout == 4 c = k; end
end
mdof = [];EDof = [];
if nGroup == 0 % backward compatibility for beam only model
elt = [Inf abs('beam1') zeros(1,size(elt,2)-6);
elt zeros(size(elt,1),size(elt,2)-6)];
nGroup = 1;EGroup = [find(elt(:,1)==Inf)' size(elt,1)+1];
end
% ----------------------------------------------------------------------------
% loop over element groups
for jGroup = 1:nGroup
ElemF = [find(elt(EGroup(jGroup),:)==0) size(elt,2)+1];
ElemF = deblank(setstr(elt(EGroup(jGroup),2:ElemF(1)-1)));
cEGI = EGroup(jGroup)+1:EGroup(jGroup+1)-1;
if exist(ElemF)==2
eval(['eCall=' ElemF '(1);'],'eCall=[];');
else eCall=[];end
for jElt=1:length(cEGI)
if exist(ElemF)==2
if isempty(eCall)
eval(['[m1,k1,i1] = ' ElemF ...
'(node,elt(cEGI(jElt),:),pl,il,[1 jGroup jElt]);']);
else eval([eCall ';'])
end
else disp([ElemF ' : unkwown element function']);
end
% --------------------------------------------------------------------------
if strcmp(ty,'mka')
if isempty(adof)
%aa=clock;
ind = zeros(length(i1),1);for j2 = 1:length(i1)
i2 = find(mdof==i1(j2));
if isempty(i2) mdof = [mdof;i1(j2)];ind(j2)=length(mdof);
else ind(j2) = i2; end
end
%bb=[etime(clock,aa)];aa=clock;
k(ind,ind)=k(ind,ind)+k1;
m(ind,ind)=m(ind,ind)+m1;
if length(c)~=0
c(ind,ind)=c(ind,ind)+c1; end
else % selection of DOFs
in1=[];in2=[];for j2 = 1:length(i1)
i2 = find(mdof==i1(j2));
if isempty(i2)
i2 = find(adof==i1(j2));
if isempty(i2) i2=find(abs(adof-rem(i1(j2),1))<1e-7); end
if isempty(i2) i2=find(adof==fix(i1(j2))); end
if ~isempty(i2)
mdof = [mdof;i1(j2)];in1=[in1 length(mdof)];in2=[in2 j2];
end
else in1=[in1 i2];in2=[in2 j2]; end
end
k(in1,in1) = k(in1,in1)+k1(in2,in2);
m(in1,in1) = m(in1,in1)+m1(in2,in2);
if isempty(c) c(in1,in1) = c(in1,in1)+c1(in2,in2);end
end
if rem(cEGI(jElt),100)==0
disp(['Done ' num2str(cEGI(jElt)) ' elements']);
end
elseif strcmp(ty,'ene')
ind = zeros(length(i1),1);
for j2 = 1:length(i1) ind(j2) = find(adof==i1(j2)); end
in2 = find(ind~=0); ind = ind(in2);
if ~isempty(ind);for j2 = 1:size(mode,2);
if nargout>0
m(cEGI(jElt),j2) = mode(ind,j2)'*k1(in2,in2)*mode(ind,j2);
end
if nargout>1
c(cEGI(jElt),j2) = mode(ind,j2)'*m1(in2,in2)*mode(ind,j2);
end
end;end
if rem(cEGI(jElt),100)==0
disp(['Done ' num2str(cEGI(jElt)) ' elements']);
end
elseif strcmp(ty,'dmk')
ind = zeros(length(i1),1);
for j2 = 1:length(i1) ind(j2) = find(adof==i1(j2)); end
in2 = find(ind~=0); ind = ind(in2); if nM~=0 % projection of a basis of modes
k(jGroup*nM+[-nM+1:0],:) = k(jGroup*nM+[-nM+1:0],:) + ...
mode(ind,:)'*k1(in2,in2)*mode(ind,:);
m(jGroup*nM+[-nM+1:0],:) = m(jGroup*nM+[-nM+1:0],:) + ...
mode(ind,:)'*m1(in2,in2)*mode(ind,:);
if length(c)~=0
c(jGroup*nM+[-nM+1:0],:) = c(jGroup*nM+[-nM+1:0],:) + ...
mode(ind,:)'*c1(in2,in2)*mode(ind,:);
end
else % no projection
in3 = ind+nA*(jGroup-1);
m(in3,ind) = m(in3,ind)+ m1(in2,in2);
k(in3,ind) = k(in3,ind)+ k1(in2,in2);
if length(c)~=0 c(in3,ind) = c(in3,ind)+ c1(in2,in2);end
end
if rem(cEGI(jElt),100)==0
disp(['Done ' num2str(cEGI(jElt)) ' elements']);
end
end
end
% ----------------------------------------------------------------------------
end; % end loop on element groups
if strcmp(ty,'ene')
m=full(m(1:size(elt,1),1:size(mode,2)));
if nargout>1 c=full(c(1:size(elt,1),1:size(mode,2))); end
k=[];mdof=[];
elseif strcmp(ty,'mka')
[mdof,i1]=sort(mdof); [EDof,i2]=sort(EDof); i1 = [i1;i2];
k = k(i1,i1); m = m(i1,i1);
if ~isempty(c) c = c(i1,i1); end
mdof = [mdof;EDof];
if nargout==2 m=k;c=mdof; end
if nargout==3 c=k;k=mdof; end
elseif strcmp(ty,'dmk')
mdof = adof;
if nargout==2 m=k;c=mdof; end
if nargout==3 c=k;k=mdof; end
end

回答(0 个)

类别

Help CenterFile Exchange 中查找有关 String Parsing 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by