PffAll源程序.docx
- 文档编号:24136767
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:97
- 大小:40.40KB
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;i fscanf(fpin,"%lg,%lg",&x[i],&y[i]); fprintf(fpout,"\n结点坐标信息表\n"); fprintf(fpout,"结点号xy\n"); for(i=0;i fprintf(fpout,"%-4d%-7lg%-7lg\n",i+1,x[i],y[i]);//0基调整 for(i=0;i fscanf(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;i fprintf(fpout,"%-4d%-4d%-4d%-7lg%-7lg\n", i+1,ij[i][0],ij[i][1],a[i],zi[i]);//0基调整 for(i=0;i for(j=0;j fscanf(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;j fprintf(fpout,"%-4d",jn[i][j]); fprintf(fpout,"\n"); } if(np>0) { for(i=0;i for(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;i for(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;i for(j=i+1;j ek[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;i for(j=0;j tk[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;j fo[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;i p[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;j a[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;j b[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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PffAll 源程序