📄 stamp.m
字号:
clear all;
close all;
file =textread('Tree_l7.sp','%s','delimiter','\n','whitespace','')
[N,M]=size(file); %文件长度
sizeall=0; % 总矩阵大小
line=1; % 读入的文件行数
matpt(1).X=' '; %总矩阵的X
select(1)=0; %总矩阵节点是否属于电压源
matall.G=sparse(1,1); % 总矩阵的G C B
matall.C=sparse(1,1);
matall.B=sparse(1,1);
U='';
LT(1,1)=0; %矩阵LT
Y(1).name=''; %矩阵Y
partpt(1).X=' '; %子电路的X
partse(1)=0;
sizepart=0; %子电路数目
part(1).name=0; %子电路 名称,
part(1).num=0; %子电路节点数
part(1).pt(1)=0; %子电路节点在总电路矩阵中的位置
partmat.G=sparse(1,1); %子电路的G C B 矩阵
partmat.C=sparse(1,1);
partmat.B=sparse(1,1);
partnum=0;
pronum=0; %probe的变量数目
renum=0;
while (line<=N)
[words,rem]=strtok(file{line});
words=upper(words);
% 各种输入情况 分类 empty * .subckt R L K C V I X .probe .end
if ((isempty(words))==1)
line=line+1;
disp('empty');
elseif strcmp(words,'*')
line=line+1;
elseif strcmp(words,'.SUBCKT') % 处理子电路 deal with subckt
ptnum=0;
[partname,rem]=strtok(rem);
partname=upper(partname);
[n,m]=size(partpt); %节点数及节点名称
for i=1:m
partpt(i).X=' ';
partse(i)=0;
end
while (isempty(rem)==0)
[data,rem]=strtok(rem);
data=upper(data);
ptnum=ptnum+1;
partpt(ptnum).X=data;
end
partnum=ptnum;
while 1 %分情况讨论R L C K V I
line=line+1;
[words,rem]=strtok(file{line});
words=upper(words);
ori_partnum=partnum;
if strcmp(words,'.ENDS')==1
break;
elseif isempty(words)
disp('empty');
elseif strcmp(words(1),'R')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
if partnum>ori_partnum;
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
partse(partnum)=0;
end
datac=str2num(datac);
[partmat] = SEL(1,partmat,num1,num2,datac)
elseif strcmp(words(1),'V')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
if isnumeric(datac)
datac=str2num(datac);
else
datac=strtok(rem);
datac=str2num(datac);
end
partnum=partnum+1;
num3=partnum;
partse(partnum)=1;
partpt(partnum).X={'I',words};
partpt(partnum).X=cell2mat(partpt(partnum).X);
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
[partmat] = VL(1,partmat,num1,num2,num3,datac);
elseif strcmp(words(1),'L')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
datac=str2num(datac);
words={'I',words};
words=cell2mat(words);
renum=findpt(words,partpt);
if renum==0
partnum=partnum+1;
num3=partnum;
partpt(partnum).X=words;
else
num3=0;
end
if partnum>ori_partnum
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
partse(partnum)=0;
end
[partmat] = VL(2,partmat,num1,num2,num3,datac);
elseif strcmp(words(1),'C')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
datac=str2num(datac);
if partnum>ori_partnum;
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
partse(partnum)=0;
end
[partmat] = SEL(3,partmat,num1,num2,datac);
elseif strcmp(words(1),'K')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,0);
if partnum>ori_partnum;
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
partse(partnum)=0;
end
datac=str2num(datac);
[partmat] = SEL(2,partmat,num1,num2,datac);
elseif strcmp(words(1),'I')
[num1,num2,datac,partnum,partpt,rem] = duandian(rem,partpt,partnum,1);
if partnum>ori_partnum;
partmat.C(partnum,partnum)=0;
partmat.G(partnum,partnum)=0;
partmat.B(partnum,1)=0;
partse(partnum)=0;
end
datac=str2num(datac);
[partmat] = SEL(4,partmat,num1,num2,datac);
end
end
%读完所有元件,将前面出现过的子电路X1 X2 等,依次将子电路矩阵加入到总矩阵里
ll=ptnum+1;
for i=1:sizepart
if strcmp(partname,part(i).name)
ori_sizeall=sizeall;
sizeall=sizeall+(partnum-ptnum);
if sizeall>ori_sizeall
matall.G(sizeall,sizeall)=0;
matall.C(sizeall,sizeall)=0;
matall.B(sizeall,1)=0;
select(sizeall)=0;
end
for kk=1:ptnum
for jj=1:ptnum;
matall.G(part(i).pt(kk),part(i).pt(jj))=matall.G(part(i).pt(kk),part(i).pt(jj))+partmat.G(kk,jj);
matall.C(part(i).pt(kk),part(i).pt(jj))=matall.C(part(i).pt(kk),part(i).pt(jj))+partmat.C(kk,jj);
end
end
for kk=1:ptnum
matall.B(part(i).pt(kk),1)=matall.B(part(i).pt(kk),1)+partmat.B(kk,1);
end
for tt=1:ptnum
for num=ll:partnum
matall.G(part(i).pt(tt),ori_sizeall+num-ptnum)=matall.G(part(i).pt(tt),ori_sizeall+num-ptnum)+partmat.G(tt,num);
matall.G(ori_sizeall+num-ptnum,part(i).pt(tt))=matall.G(ori_sizeall+num-ptnum,part(i).pt(tt))+partmat.G(num,tt);
matall.C(part(i).pt(tt),ori_sizeall+num-ptnum)=matall.C(part(i).pt(tt),ori_sizeall+num-ptnum)+partmat.C(tt,num);
matall.C(ori_sizeall+num-ptnum,part(i).pt(tt))=matall.C(ori_sizeall+num-ptnum,part(i).pt(tt))+partmat.C(num,tt);
end
end
for num=ll:partnum
matpt(ori_sizeall+num-ptnum).X={partpt(num).X,'_',part(i).ptname};
matpt(ori_sizeall+num-ptnum).X=cell2mat(matpt(ori_sizeall+num-ptnum).X);
select(ori_sizeall+num-ptnum)=select(ori_sizeall+num-ptnum)+partse(num);
matall.B(ori_sizeall+num-ptnum,1)=matall.B(ori_sizeall+num-ptnum,1)+partmat.B(num,1);
end
for n_num=ll:partnum
for nz_num=ll:partnum
matall.G(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)=matall.G(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)+partmat.G(n_num,nz_num);
matall.C(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)=matall.C(ori_sizeall+n_num-ptnum,ori_sizeall+nz_num-ptnum)+partmat.C(n_num,nz_num);
end
end
end
end
% 子电路矩阵加入总矩阵 结束
line=line+1;
elseif strcmp(words,'.PROBE') %probe 寻找V,I,并确定LT矩阵
pronum=pronum+1; %需要probe的变量数目 每一个probe对应一个变量
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -