PffAll源程序.docx
《PffAll源程序.docx》由会员分享,可在线阅读,更多相关《PffAll源程序.docx(97页珍藏版)》请在冰豆网上搜索。
PffAll源程序
Pff_All源程序
Pff_All源程序共包含七个cpp源文件:
Shell.cpp、pff.cpp、pff_nuv.cpp、pff_nu.cpp、pff_2DTr.cpp、pff_3DTr.cpp和pff_GlBm.cpp,它们分别对应外壳调用程序及类型1至类型6(参见2.6节)的杆件结构静力分析程序。
这七个源文件必须插入到同一个VisualC++6.0工程中进行编译连接,才能获得完整的可执行程序。
将源文件插入工程的具体操作方法,请参见附录A。
除外壳源文件外,其余六个源文件经过少量修改,均可作为独立的静力分析程序进行编译连接。
具体修改方法有如下两步:
1.去除头文件引用声明后,文件指针声明行前的“extern”,即该行变为“FILE*fpin,*fpout;”;
2.将主文件名中“main”后的数字删除。
下面分文件列出七个cpp源文件的代码。
一.Shell.cpp
/*杆件结构静力分析程序*/
/*(先处理法)*/
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
FILE*fpin,*fpout;
externintmain1();
externintmain2();
externintmain3();
externintmain4();
externintmain5();
externintmain6();
voidmain()
{
intstype;
printf("请选择结构类型\n\n");
printf("类型1->平面刚架\n");
printf("类型2->无结点线位移的连续梁或刚架\n");
printf("类型3->无结点水平线位移的连续梁或刚架\n");
printf("类型4->平面桁架\n");
printf("类型5->空间桁架\n");
printf("类型6->交叉梁系\n\n");
scanf("%d",&stype);
if(stype<1||stype>6)
{
printf("非法输入!
请重试。
\n");
return;
}
printf("你已选择类型%d。
\n",stype);
switch(stype)
{
case1:
main1();
break;
case2:
main2();
break;
case3:
main3();
break;
case4:
main4();
break;
case5:
main5();
break;
case6:
main6();
break;
}
}
二.pff.cpp
/*第1类:
平面刚架静力分析程序*/
/*(先处理法)*/
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
externFILE*fpin,*fpout;
staticconstintARRSIZE=50;//数组大小
staticconstintJDOF=3;//结构坐标系下的结点自由度
staticconstintJPE=2;//每单元结点数
//一级子程序原型声明
staticintinput(intne,intnj,intnp,intnf,double*x,double*y,int(*ij)[JPE],
double*a,double*zi,int(*jn)[JDOF],double(*pj)[3],double(*pf)[4]);
staticinttsm(intne,intnj,intn,doublee,double*x,double*y,
int(*ij)[JPE],double*a,double*zi,int(*jn)[JDOF],
double(*tk)[JDOF*ARRSIZE]);
staticintjlp(intne,intnj,intn,intnp,intnf,double*x,double*y,
int(*ij)[JPE],int(*jn)[JDOF],double(*pj)[3],double(*pf)[4],
double*p);
staticintgauss(double(*a)[JDOF*ARRSIZE],double*b,intn);
staticintmvn(intne,intnj,intn,intnf,doublee,double*x,double*y,
int(*ij)[JPE],double*a,double*zi,int(*jn)[JDOF],double(*pf)[4],
double*p);
//二级子程序原型声明
staticintlsc(intm,intne,intnj,double*x,double*y,int(*ij)[JPE],
double*bl,double*si,double*co);
staticintelv(intm,intne,intnj,int(*ij)[JPE],int(*jn)[JDOF],int*lv);
staticintesm(intm,intne,doublee,double*a,double*zi,doublebl,
doublesi,doubleco,doubleek[JPE*JDOF][JPE*JDOF]);
staticinteff(inti,double(*pf)[4],intnf,doublebl,double*fo);
/*主程序读取总体信息,调用一级子程序进行计算*/
intmain1()
{
charindat[30],outdat[30];
intne,nj,n,np,nf;
doublee;
doublex[ARRSIZE],y[ARRSIZE],a[ARRSIZE],zi[ARRSIZE],pj[ARRSIZE][3],
pf[ARRSIZE][4];
doublep[JDOF*ARRSIZE],tk[JDOF*ARRSIZE][JDOF*ARRSIZE];
intij[ARRSIZE][JPE],jn[ARRSIZE][JDOF];
printf("请输入原始数据文件名:
\n");
scanf("%s",indat);
if((fpin=fopen(indat,"r"))==NULL)
{printf("无法打开原始数据文件!
\n");
return
(1);}
printf("请输入结果数据文件名:
\n");
scanf("%s",outdat);
if((fpout=fopen(outdat,"w"))==NULL)
{printf("无法打开结果数据文件!
\n");
return
(1);}
fscanf(fpin,"%d,%d,%d,%d,%d,%lg",&ne,&nj,&n,&np,&nf,&e);
fprintf(fpout,"平面刚架静力分析程序\n\n");
fprintf(fpout,"总体信息\n");
fprintf(fpout,"NE=%dNJ=%dN=%dNP=%dNF=%dE=%lg\n",ne,nj,n,np,nf,e);
input(ne,nj,np,nf,x,y,ij,a,zi,jn,pj,pf);
tsm(ne,nj,n,e,x,y,ij,a,zi,jn,tk);
jlp(ne,nj,n,np,nf,x,y,ij,jn,pj,pf,p);
gauss(tk,p,n);
mvn(ne,nj,n,nf,e,x,y,ij,a,zi,jn,pf,p);
fclose(fpin);
fclose(fpout);
printf("\n计算结束!
\n");
printf("请查看结果数据文件“%s”。
\n",outdat);
return(0);
}
/*读取并输出原始数据*/
staticintinput(intne,intnj,intnp,intnf,double*x,double*y,int(*ij)[JPE],
double*a,double*zi,int(*jn)[JDOF],double(*pj)[3],double(*pf)[4])
{
inti,j;
for(i=0;ifscanf(fpin,"%lg,%lg",&x[i],&y[i]);
fprintf(fpout,"\n结点坐标信息表\n");
fprintf(fpout,"结点号xy\n");
for(i=0;ifprintf(fpout,"%-4d%-7lg%-7lg\n",i+1,x[i],y[i]);//0基调整
for(i=0;ifscanf(fpin,"%d,%d,%lg,%lg",&ij[i][0],&ij[i][1],&a[i],&zi[i]);
fprintf(fpout,"\n单元信息表\n");
fprintf(fpout,"单元号始结点号i末结点号j横截面积A截面惯性矩ZI\n");
for(i=0;ifprintf(fpout,"%-4d%-4d%-4d%-7lg%-7lg\n",
i+1,ij[i][0],ij[i][1],a[i],zi[i]);//0基调整
for(i=0;ifor(j=0;jfscanf(fpin,"%d,",&jn[i][j]);
fprintf(fpout,"\n结点位移分量统一编码表\n");
fprintf(fpout,"结点号u方向v方向ceta方向\n");
for(i=0;i{
fprintf(fpout,"%-4d",i+1);//0基调整
for(j=0;jfprintf(fpout,"%-4d",jn[i][j]);
fprintf(fpout,"\n");
}
if(np>0)
{
for(i=0;ifor(j=0;j<3;j++)
fscanf(fpin,"%lg,",&pj[i][j]);
fprintf(fpout,"\n结点荷载表\n");
fprintf(fpout,"结点号方向代码XYM荷载大小\n");
for(i=0;i{
for(j=0;j<3;j++)
fprintf(fpout,"%-7lg",pj[i][j]);
fprintf(fpout,"\n");
}
}
if(nf>0)
{
for(i=0;ifor(j=0;j<4;j++)
fscanf(fpin,"%lg,",&pf[i][j]);
fprintf(fpout,"\n非结点荷载表\n");
fprintf(fpout,"单元号荷载类型荷载大小荷载位置参数c\n");
for(i=0;i{
for(j=0;j<4;j++)
fprintf(fpout,"%-7lg",pf[i][j]);
fprintf(fpout,"\n");
}
}
return(0);
}
/*计算单元长度,夹角alph的正余弦值*/
staticintlsc(intm,intne,intnj,double*x,double*y,int(*ij)[JPE],double*bl,
double*si,double*co)
{
inti,j;
doubledx,dy;
i=ij[m][0]-1,j=ij[m][1]-1;//0基调整
dx=x[j]-x[i];
dy=y[j]-y[i];
*bl=sqrt(dx*dx+dy*dy);
*si=dy/*bl;
*co=dx/*bl;
return(0);
}
/*形成单元定位向量*/
staticintelv(intm,intne,intnj,int(*ij)[JPE],int(*jn)[JDOF],int*lv)
{
inti,j,k;
i=ij[m][0]-1,j=ij[m][1]-1;//0基调整
for(k=0;k{
lv[k]=jn[i][k];
lv[k+JDOF]=jn[j][k];
}
return(0);
}
/*计算整体坐标系下的单元刚度矩阵*/
staticintesm(intm,intne,doublee,double*a,double*zi,doublebl,
doublesi,doubleco,doubleek[JPE*JDOF][JPE*JDOF])
{
inti,j;
doublec1,c2,c3,c4,s1,s2,s3,s4,s5,s6;
c1=e*a[m]/bl;
c2=2.0*e*zi[m]/bl;
c3=3.0*c2/bl;
c4=2.0*c3/bl;
s1=c1*co*co+c4*si*si;
s2=(c1-c4)*si*co;
s3=c3*si;
s4=c1*si*si+c4*co*co;
s5=c3*co;
s6=c2;
ek[0][0]=s1;
ek[0][1]=s2;
ek[0][2]=-s3;
ek[0][3]=-s1;
ek[0][4]=-s2;
ek[0][5]=-s3;
ek[1][1]=s4;
ek[1][2]=s5;
ek[1][3]=-s2;
ek[1][4]=-s4;
ek[1][5]=s5;
ek[2][2]=2.0*s6;
ek[2][3]=s3;
ek[2][4]=-s5;
ek[2][5]=s6;
ek[3][3]=s1;
ek[3][4]=s2;
ek[3][5]=s3;
ek[4][4]=s4;
ek[4][5]=-s5;
ek[5][5]=2.0*s6;
for(i=0;ifor(j=i+1;jek[j][i]=ek[i][j];
return(0);
}
/*集成总刚*/
staticinttsm(intne,intnj,intn,doublee,double*x,double*y,int(*ij)[JPE],
double*a,double*zi,int(*jn)[JDOF],double(*tk)[JDOF*ARRSIZE])
{
doubleek[JPE*JDOF][JPE*JDOF];
intlv[JPE*JDOF];
inti,j,l,k,m;
doublebl,si,co;
for(i=0;ifor(j=0;jtk[i][j]=0.0;
for(m=0;m{
lsc(m,ne,nj,x,y,ij,&bl,&si,&co);
esm(m,ne,e,a,zi,bl,si,co,ek);
elv(m,ne,nj,ij,jn,lv);
for(l=0;l{
i=lv[l];
if(i!
=0)
{
for(k=0;k{
j=lv[k];
if(j!
=0)tk[i-1][j-1]=tk[i-1][j-1]+ek[l][k];//0基调整
}
}
}
}
return(0);
}
/*计算单元固端力*/
staticinteff(inti,double(*pf)[4],intnf,doublebl,double*fo)
{
intno;
doubleq,c,b,c1,c2,c3;
intj;
no=int(pf[i][1]);
q=pf[i][2];
c=pf[i][3];
b=bl-c;
c1=c/bl;
c2=c1*c1;
c3=c1*c2;
for(j=0;jfo[j]=0.0;
switch(no)
{
case1:
fo[1]=-q*c*(1.0-c2+c3/2.0);
fo[2]=-q*c*c*(0.5-2.0*c1/3.0+0.25*c2);
fo[4]=-q*c*c2*(1.0-0.5*c1);
fo[5]=q*c*c*c1*(1.0/3.0-0.25*c1);
return(0);
case2:
fo[1]=-q*b*b*(1.0+2.0*c1)/bl/bl;
fo[2]=-q*c*b*b/bl/bl;
fo[4]=-q*c2*(1.0+2.0*b/bl);
fo[5]=q*c2*b;
return(0);
case3:
fo[1]=6.0*q*c1*b/bl/bl;
fo[2]=q*b*(2.0-3.0*b/bl)/bl;
fo[4]=-6.0*q*c1*b/bl/bl;
fo[5]=q*c1*(2.0-3.0*c1);
return(0);
case4:
fo[1]=-q*c*(0.5-0.75*c2+0.4*c3);
fo[2]=-q*c*c*(1.0/3.0-0.5*c1+0.2*c2);
fo[4]=-q*c*c2*(0.75-0.4*c1);
fo[5]=q*c*c*c1*(0.25-0.2*c1);
return(0);
case5:
fo[0]=-q*c*(1.0-0.5*c1);
fo[3]=-0.5*q*c*c1;
return(0);
case6:
fo[0]=-q*b/bl;
fo[3]=-q*c1;
return(0);
}
return(0);
}
/*计算综合结点荷载列阵*/
staticintjlp(intne,intnj,intn,intnp,intnf,double*x,double*y,
int(*ij)[JPE],int(*jn)[JDOF],double(*pj)[3],double(*pf)[4],double*p)
{
inti,j,k,l,m;
doublebl,si,co;
intlv[JPE*JDOF];
doublefo[6],pe[JPE*JDOF];
for(i=0;ip[i]=0.0;
if(np>0)
{
for(i=0;i{
j=int(pj[i][0]);
k=int(pj[i][1]);
l=jn[j-1][k-1];//0基调整
if(l!
=0)p[l-1]=pj[i][2];//0基调整
}
}
if(nf>0)
{
for(i=0;i{
m=int(pf[i][0])-1;//0基调整
lsc(m,ne,nj,x,y,ij,&bl,&si,&co);
eff(i,pf,nf,bl,fo);
elv(m,ne,nj,ij,jn,lv);
pe[0]=-fo[0]*co+fo[1]*si;
pe[1]=-fo[0]*si-fo[1]*co;
pe[2]=-fo[2];
pe[3]=-fo[3]*co+fo[4]*si;
pe[4]=-fo[3]*si-fo[4]*co;
pe[5]=-fo[5];
for(j=0;j{
l=lv[j];
if(l!
=0)p[l-1]=p[l-1]+pe[j];//0基调整
}
}
}
return(0);
}
/*Gauss消去法解方程*/
staticintgauss(double(*a)[JDOF*ARRSIZE],double*b,intn)
{
inti,j,k;
doublea1;
for(k=0;k{
for(i=k+1;i{
a1=a[k][i]/a[k][k];
for(j=k+1;ja[i][j]=a[i][j]-a1*a[k][j];
b[i]=b[i]-a1*b[k];
}
}
b[n-1]=b[n-1]/a[n-1][n-1];//0基调整
for(i=n-2;i>-1;i--)//0基调整
{
for(j=i+1;jb[i]=b[i]-a[i][j]*b[j];
b[i]=b[i]/a[i][i];
}
return(0);
}
/*输出结点位移;计算并输出单元杆端力*/
staticintmvn(intne,intnj,intn,intnf,doublee,double*x,double*y,
int(*ij)[JPE],double*a,double*zi,int(*jn)[JDOF],double(*pf)[4],
double*p)
{
inti,j,l,m,ii;
intlv[JPE*JDOF];
doublebl,si,co;
doublefo[6],d[JPE*JDOF],fd[JPE*JDOF],f[6];
doubleek[JPE*JDOF][JPE*JDOF];
fprintf(fpout,"\n结点位移表\n");
fprintf(fpout,"结点号uvceta\n");
fo