#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
void hbw();
void sncs(int nel);
void fix(int np);
void trmat();
void fis(int nel);
void fpj();
void force();
void stiff();
void addsm();
void restr();
void matmul();
void soleq();
void outdis();
float sm[6][6], tsm[300][30],res[60][2],pj[300],t[6][6],d[6][6],r[300],
fo[6],foj[6],pf[200][4],x[100],y[100],ae[10][3],sl,sn,cs,eal,eil;
int nj,ne,nt,nr,npj,npf,nn,mbw,jel[100][2],nae[100],is[6];
FILE *infile,*outfile;
/******主函数*****/
int main()
{ char name1[30],name2[30];
int i,j,nel,np;
printf("程序汉化与输入优化\n");
printf("请输入数据文件名(请使用txt文件格式,并不要输入后缀名)\n");
scanf("%s",name1);
printf("请输出输出文件名,后缀名将会自动补全\n");
scanf("%s",name2);
if((infile=fopen(strcat(name1,".txt"),"r"))!= NULL)
{ fscanf(infile,"%d%d%d%d%d%d",&nj,&ne,&nt,&nr,&npj,&npf);
for(i=0;i<ne;i++) fscanf(infile,"%d%d%d",&jel[i][0],&jel[i][1],&nae[i]);
for(i=0;i<nj;i++) fscanf(infile,"%f%f",&x[i],&y[i]);
for(i=0;i<nt;i++) fscanf(infile,"%f%f%f",&ae[i][0],&ae[i][1],&ae[i][2]);
for(i=0;i<nr;i++) fscanf(infile,"%f%f",&res[i][0],&res[i][1]); }
else
{ printf("未找到%s!",name1);
exit(1);}
nn=3*nj;
outfile=fopen(strcat(name2,".txt"),"w");
if(outfile==NULL)
{ printf("结果文件输出失败!"); exit(1);}
fprintf(outfile,"平面刚架分析结果文件——汉化\n");
fprintf(outfile,"\n读入数据\n");
fprintf(outfile,"*******\n");
fprintf(outfile,"控制数据\n");
fprintf(outfile,"结点总数:%3d\n",nj);
fprintf(outfile,"单元总数:%3d\n",ne);
fprintf(outfile,"单元性质总数:%3d\n",nt);
fprintf(outfile,"约束总数:%3d\n",nr);
fprintf(outfile,"有荷载结点总数:%3d\n",npj);
fprintf(outfile,"非结点荷载数:%3d\n",npf);
fprintf(outfile,"结点自由度总数:%3d\n",nn);
fprintf(outfile,"\n以下为单元结点号与性质:\n");
fprintf(outfile,"\n 单元号 起点坐标 终点坐标 单元性质编号\n");
for(i=0;i<ne;i++)
fprintf(outfile,"%7d%13d%15d%15d\n",i+1,jel[i][0],jel[i][1],nae[i]);
fprintf(outfile,"\n结点的坐标列表:\n");
fprintf(outfile," 结点号 x y\n");
for(i=0;i<nj;i++)
fprintf(outfile,"%10d%10.2f%10.2f\n",i+1,x[i],y[i]);
fprintf(outfile,"\n单元截面类型性质列表:\n");
fprintf(outfile,"\n 种类号 面积 惯性矩 弹性模量\n");
for(i=0;i<nt;i++)
fprintf(outfile,"%8d%15.6f%15.6f%20.6f\n",i+1,ae[i][0],ae[i][1],ae[i][2]);
fprintf(outfile,"\n约束列表\n");
fprintf(outfile,"\n 约束编号 约束位置 约束方向位移/转角\n");
for(i=0;i<nr;i++)
fprintf(outfile,"%10d%25.0f%19.3f\n",i+1,res[i][0],res[i][1]);
hbw();
for(i=0;i<nn;i++) pj[i]=0.0;
if (npj==0) goto aa;
fprintf(outfile,"\n结点荷载列表:\n");
fprintf(outfile,"\n结点号 x向分荷载 y向分荷载 弯矩\n");
for(i=0;i<npj;i++)
{ int no;
float px,py,zm;
fscanf(infile,"%d%f%f%f",&no,&px,&py,&zm);
fprintf(outfile,"%6d %12.2f %12.2f%12.2f\n",no,px,py,zm);
pj[3*no-3]=px; pj[3*no-2]=py; pj[3*no-1]=zm; }
aa: for(i=0;i<nn;i++) r[i]=0.0;
for(i=0;i<nr;i++)
{ int ni;
ni=floor(res[i][0]+0.1)-1;
if(pj[ni]!=0.0) r[ni]=r[ni]-pj[ni]; }
if(npf==0) goto bb;
fprintf(outfile,"\n非结点荷载列表:\n");
fprintf(outfile,"\n 荷载大小 作用点/范围 单元号 荷载类型\n");
for(i=0;i<npf;i++)
{ fscanf(infile,"%f%f%f%f",&pf[i][0],&pf[i][1],&pf[i][2],&pf[i][3]);
fprintf(outfile,"%15.2f%15.2f%15.0f%15.0f\n",pf[i][0],pf[i][1],pf[i][2],pf[i][3]);}
for(np=0;np<npf;np++)
{ nel=floor(pf[np][2]+0.1);
sncs(nel-1);
fix(np);
trmat();
fis(nel-1);
fpj(); }
bb:for(i=0;i<nn;i++)
for(j=0;j<mbw;j++) tsm[i][j]=0.0;
for(nel=0;nel<ne;nel++)
{ sncs(nel);
trmat();
stiff();
matmul();
fis(nel);
addsm(); }
restr();
soleq();
outdis();
force();
fclose(outfile);
system(name2);
return 0;
}
/*求最大半带宽*/
void hbw()
{ int nel;
mbw=0;
for( nel=0;nel<ne;nel++)
{ int ma=abs(jel[nel][0]-jel[nel][1]);
if(mbw<ma) mbw=ma; }
mbw=3*(mbw+1);
fprintf(outfile,"\n最大半带宽:%5d\n",mbw);
}
/*矩阵相乘*/
void matmul()
{ int i,j,k;
for(i=0;i<6;i++)
for(j=0;j<6;j++) d[i][j]=0.0;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
for(k=0;k<6;k++) d[i][j]=d[i][j]+t[k][i]*sm[k][j];
for(i=0;i<6;i++)
for(j=0;j<6;j++) sm[i][j]=0.0;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
for(k=0;k<6;k++)
sm[i][j]=sm[i][j]+d[i][k]*t[k][j];
}
/*求单元常数*/
void sncs (int nel)
{ int ii,jj,k;
float xi,yi,xj,yj;
ii=jel[nel][0];
jj=jel[nel][1];
xi=x[ii-1];
xj=x[jj-1];
yi=y[ii-1];
yj=y[jj-1];
sl=sqrt((xj-xi)*(xj-xi)+(yj-yi)*(yj-yi));
sn=(yj-yi)/sl;
cs=(xj-xi)/sl;
k=nae[nel];
eal=ae[k-1][0]*ae[k-1][2]/sl;
eil=ae[k-1][1]*ae[k-1][2]/sl;
}
/*求单元坐标转换矩阵*/
void trmat()
{ int i,j;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
t[i][j]=0.0; t[0][0]=cs; t[0][1]=sn;
t[1][0]=-sn; t[1][1]=cs; t[2][2]=1.0;
for(i=0;i<3;i++)
for(j=0;j<3;j++) t[i+3][j+3]=t[i][j];
}
/*求单元固端力*/
void fix (int np)
{ float w,c,c1,c2,cc,cc1,cc2;
int i,im;
w=pf[np][0]; c=pf[np][1];
c1=c/sl; c2=c1*c1; cc=sl-c;
cc1=cc/sl; cc2=cc1*cc1;
for(i=0;i<6;i++) fo[i]=0.0;
im=floor(pf[np][3]+0.1);
if(im==1)
{ fo[1]=-w*c*(1.0-c2+c2*c1/2.0);
fo[2]=-w*c*c*(6.0-8.0*c1+3*c2)/12.0;
fo[4]=-w*c-fo[1];
fo[5]=w*c1*c*c*(4.0-3.0*c1)/12.0; }
else if (im==2)
{ fo[1]=-w*(1+2*c1)*cc2;
fo[2]=-w*c*cc2;
fo[4]=-w*(1+2*cc1)*c2;
fo[5]=w*cc*c2; }
else if (im==3)
{ fo[1]=6*w*c1*cc1/sl;
fo[2]=w*cc1*(2-3*cc1);
fo[4]=-fo[2];
fo[5]=w*c1*(2-3*c1); }
else if (im==4)
{ fo[1]=-0.25*w*c*(2.-3.*c2+1.6*c2*c1);
fo[2]=-w*c*c*(2.-3.*c1+1.2*c2)/6.0;
fo[4]=-w*c/2.0-fo[1];
fo[5]=0.25*w*c*c*c1*(1.-0.8*c1); }
else if (im==5)
{ fo[0]=-w*cc1;
fo[3]=-w*c1; }
else if (im==6)
{ fo[0]=-w*c*(1.-0.5*c1);
fo[3]=-0.5*w*c*c1; }
}
/*形成总结点荷载向量*/
void fpj()
{ int i,j,k,ii,jj;
for( k=0;k<6;k++)
foj[k]=0.0;
for(i=0;i<6;i++)
for(j=0;j<6;j++) foj[i]=foj[i]+t[j][i]*fo[j];
for(ii=0;ii<6;ii++) pj[is[ii]]=pj[is[ii]]-foj[ii];
}
/*形成单元刚度矩阵*/
void stiff()
{ int i,j;
float s1,s2;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
sm[i][j]=0.0; sm[0][0]=eal;
sm[3][0]=-eal; sm[3][3]=eal;
s1=12.*eil/(sl*sl); s2=6.*eil/sl;
sm[1][1]=s1; sm[4][1]=-s1 ;
sm[4][4]=s1; sm[2][1]=s2;
sm[5][1]=s2; sm[4][2]=-s2;
sm[5][4]=-s2; sm[2][2]=4*eil;
sm[5][5]=4*eil; sm[5][2]=2*eil;
for(i=0;i<6;i++)
for(j=0;j<i;j++)
sm[j][i]=sm[i][j];
}
/*由单元位移分量码L形成总刚位移分量码IS(L)*/
void fis(int nel)
{ int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++) is[3*i+j]=3*(jel[nel][i]-1)+j; }
/*形成结构原始总刚度矩阵*/
void addsm()
{ int i,j;
for( i=0;i<6;i++)
for(j=0;j<6;j++)
{ int kc;
kc=is[j]-is[i];
if(kc>=0) tsm[is[i]][kc]=tsm[is[i]][kc]+sm[i][j]; }
}
/*约束处理*/
void restr()
{ int i;
for(i=0;i<nr;i++)
{ int ni;
ni=floor(res[i][0]+0.1); tsm[ni-1][0]=1.0e25;
pj[ni-1]=tsm[ni-1][0]*res[i][1]; }
}
/*解线性方程组*/
void soleq()
{ float c1;
int k,ni,im,i,m,j,nm,jm;
for(k=1;k<nn;k++)
{ if (fabs(tsm[k-1][0])<=0.000001)
{ fprintf(outfile,"*****%4d行数据异常******\n",k+1);
goto fin; }
ni=k+mbw-1; im=ni;
if(ni>nn) im=nn;
for(i=k+1;i<im+1;i++)
{ m=i-k+1;
c1=tsm[k-1][m-1]/tsm[k-1][0];
for(j=1;j<mbw-m+2;j++)
tsm[i-1][j-1]=tsm[i-1][j-1]-c1*tsm[k-1][j+i-k-1];
pj[i-1]=pj[i-1]-c1*pj[k-1]; }
}
if(fabs(tsm[nn-1][0])<=0.000001)
{ fprintf(outfile,"*****%4d行数据异常******\n",nn);
goto fin; }
pj[nn-1]=pj[nn-1]/tsm[nn-1][0];
for(i=nn-1;i>0;i--)
{ nm=nn-i+1;
jm=nm;
if(nm>mbw) jm=mbw;
for(j=2;j<jm+1;j++)
pj[i-1]=pj[i-1]-tsm[i-1][j-1]*pj[j+i-2];
pj[i-1]=pj[i-1]/tsm[i-1][0]; }
fin: return;
}
/*输出位移向量*/
void outdis()
{ int i;
fprintf(outfile,"\n输出结果\n");
fprintf(outfile,"******\n");
fprintf(outfile,"\n结点位移列表:\n");
fprintf(outfile,"\n 结点号 x向 y向 转角\n");
for(i=0;i<nj;i++) fprintf(outfile,"%10d%15.4f%15.4f%15.4f\n",i+1,pj[3*i],pj[3*i+1],pj[3*i+2]);
}
/*求单元杆端力、支座反力或结点合力*/
void force ()
{ float dj[6],f[6],fj[6],dd[6];
int nel,np,i,j,ip;
fprintf(outfile,"\n单元号 轴力1 剪力1 弯矩1 轴力2 剪力2 弯矩2 \n");
for(nel=0;nel<ne;nel++){
sncs(nel);
trmat();
stiff();
fis(nel);
for(i=0;i<6;i++) dj[i]=pj[is[i]];
for(i=0;i<6;i++) {dd[i]=0.0;f[i]=0.0;}
for(i=0;i<6;i++)
for(j=0;j<6;j++) dd[i]=dd[i]+t[i][j]*dj[j];
for(i=0;i<6;i++)
for(j=0;j<6;j++) f[i]=f[i]+sm[i][j]*dd[j];
if(npf==0) goto a;
for(np=0;np<npf;np++){
ip=floor(pf[np][2]+0.1)-1;
if(ip==nel){ fix(np);
for(j=0;j<6;j++) f[j]=f[j]+fo[j];}
}
a: fprintf(outfile,"%5d%11.2f%11.2f%11.2f%11.2f%11.2f%11.2f\n",
nel+1,f[0], f[1],f[2],f[3],f[4],f[5]);
for(i=0;i<6;i++) fj[i]=0.0;
for(i=0;i<6;i++) fj[i]=0.0;
for(i=0;i<6;i++)
for(j=0;j<6;j++) fj[i]=fj[i]+t[j][i]*f[j];
for(i=0;i<6;i++) r[is[i]]=r[is[i]]+fj[i]; }
fprintf(outfile,"\n结点合力列表:\n");
fprintf(outfile,"\n 结点号 X向合力 Y向合力 合力矩\n");
for(i=0;i<nj;i++)
fprintf(outfile,"%10d%15.4f%15.4f%15.4f\n",i+1,r[3*i],r[3*i+1],r[3*i+2]);
}
输入文件示例:
3 2 1 4 1 2
1 2 1 2 3 1
0 0 0 5 5 5
0.008 0.002 2.5E7
1 0 2 0 7 0 9 0
2 0 0 12000
-6000 5 2 1
-8000 2.5 1 2
输出文件:
平面刚架分析结果文件——汉化
读入数据
控制数据
结点总数: 3
单元总数: 2
单元性质总数: 1
约束总数: 4
有荷载结点总数: 1
非结点荷载数: 2
结点自由度总数: 9
以下为单元结点号与性质:
单元号 起点坐标 终点坐标 单元性质编号
1 1 2 1
2 2 3 1
结点的坐标列表:
结点号 x y
1 0.00 0.00
2 0.00 5.00
3 5.00 5.00
单元截面类型性质列表:
种类号 面积 惯性矩 弹性模量
1 0.008000 0.002000 25000000.000000
约束列表
约束编号 约束位置 约束方向位移/转角
1 1 0.000
2 2 0.000
3 7 0.000
4 9 0.000
最大半带宽: 6
结点荷载列表:
结点号 x向分荷载 y向分荷载 弯矩
2 0.00 0.00 12000.00
非结点荷载列表:
荷载大小 作用点/范围 单元号 荷载类型
-6000.00 5.00 2 1
-8000.00 2.50 1 2
输出结果
结点位移列表:
结点号 x向 y向 转角
1 -0.0000 -0.0000 0.2000
2 0.2500 -0.7500 -0.8000
3 0.0000 -5.8750 -0.0000
单元号 轴力1 剪力1 弯矩1 轴力2 剪力2 弯矩2
1 30000.00 -2000.00 0.00 -30000.00 10000.00 -30000.01
2 10000.00 30000.00 42000.00 -10000.00 0.00 33000.00
结点合力列表:
结点号 X向合力 Y向合力 合力矩
1 2000.0010 30000.0000 0.0000
2 0.0010 0.0000 11999.9941
3 -10000.0020 0.0000 33000.0039
程序解读:
以上代码和图片来自大连理工大学陈廷国教授结构力学专题课件