#include<io.h>
#include "string.h"
#include"stdlib.h"
#include"stdio.h"
#include"math.h"
void hbw();
void sncs(int nel);
void fix(int np);
void trmat();
void fis(int nel);
void fpj();
void force();
void stiff(int nel);
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],typ[100],is[6];
FILE  *infile,*outfile;

/******主函数*****/
int main()
{   char name1[30],name2[30];
	int i,j,nel,np;
	printf("please enter data-filename\n");
	scanf("%s",name1);
	printf("please enter result-filename\n");
	scanf("%s",name2);
    if((infile=fopen(name1,"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%d",&jel[i][0],&jel[i][1],&nae[i],&typ[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("the data-file not exit!");
	   exit(1);}
	nn=3*nj;
	outfile=fopen(name2,"w");
	if(outfile==NULL)
	{ printf("the result-file not exist!");  exit(1);}
	fprintf(outfile," statis analysis of plane frame\n");
	fprintf(outfile,"input data\n");
	fprintf(outfile,"*******\n");
	fprintf(outfile,"control data\n");
	fprintf(outfile,"the num. of node:%3d\n",nj);
	fprintf(outfile,"the num. of mem:%3d\n",ne);
	fprintf(outfile,"the num. of type of section characteristic:%3d\n",nt);
	fprintf(outfile,"the num. of restricted degrees of freedom:%3d\n",nr);
    fprintf(outfile,"the num. of nodal load:%3d\n",npj);
	fprintf(outfile,"the num. of non-nodal loads:%3d\n",npf);
	fprintf(outfile,"the num. of nodal degrees of freedom:%3d\n",nn);
	fprintf(outfile,"information of mem.\n");
	fprintf(outfile," mem. start node end node section type\n");
	for(i=0;i<ne;i++)
		fprintf(outfile,"%5d%10d%10d%10d%10d\n",i+1,jel[i][0],jel[i][1],nae[i],typ[i]);
	 fprintf(outfile,"coordinates x and y of nodes\n");
	 fprintf(outfile," node 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,"information of cross section each mem. \n");
	   fprintf(outfile," type area moment of interia elastic modulus\n");
    for(i=0;i<nt;i++)
		fprintf(outfile,"%8d%15.5f%15.5f%20.2f\n",i+1,ae[i][0],ae[i][1],ae[i][2]);
	   fprintf(outfile,"information restriction \n");
	   fprintf(outfile," rester.-no restr.-disp.-no restr.-disp.\n");
    for(i=0;i<nr;i++)
		fprintf(outfile,"%10d%19.3f%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,"nodal loads\n");
	fprintf(outfile," node px py zm\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,"%10d%10.2f%10.2f%10.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,"non-nodal loads\n");
	    fprintf(outfile," loads leng.supp. to load mem type\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.2f%15.2f\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(nel);
		   matmul();
		   fis(nel);
		   addsm();   }
	   restr();
	   soleq();
	   outdis();
	   force();
	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,"Half _Bandwidth Mbw:%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 nel)
{	int i,j,it;
	float s1,s2;
	it=floor(typ[nel]+0.1);
	if(it==1)
	{
		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];
		}
	}
	else if(it==2)
	{
		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=3.*eil/(sl*sl); s2=3.*eil/sl;
	             sm[1][1]=s1;  sm[4][1]=-s1;
	             sm[4][4]=s1;  sm[2][1]=s2;
	             sm[4][2]=-s2; sm[2][2]=3*eil;
			}
		}
		for(i=0;i<6;i++)
		{
			for(j=0;j<i;j++)
				sm[j][i]=sm[i][j];
		}
	}
	else if(it==3)
	{
		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=3.*eil/(sl*sl); s2=3.*eil/sl;
	             sm[1][1]=s1;  sm[4][1]=-s1;
	             sm[4][4]=s1;sm[5][1]=s2; 
                 sm[5][4]=-s2; sm[5][5]=3*eil;
			}
		}
		for(i=0;i<6;i++)
		{
			for(j=0;j<i;j++)
				sm[j][i]=sm[i][j];
		}
	}
	else if(it==4)
	{
		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;
			}
		}
		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.0e30;
		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,"*****singularity in row %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,"*****singularity in row %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,"output results\n");
   fprintf(outfile,"******\n");
   fprintf(outfile,"nodal displacements\n");
   fprintf(outfile," node u v ceta\n");
   for(i=0;i<nj;i++)	   fprintf(outfile,"%10d%15.6f%15.6f%15.6f\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," Mem. N1 Q1 M1 N2 Q2 M2 \n");
	for(nel=0;nel<ne;nel++){
	sncs(nel);
	trmat();
	stiff(nel);
	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,"Nodal Reaction\n");
	fprintf(outfile," Node RX RY RM\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]);
}

和平面刚架程序不同点在于,形成单元刚度矩阵的函数stiff()做了改变(第220行),杆系单元单元刚度矩阵可参考结构力学书籍。共分析了四种单元如下图所示。输入每个单元时还要输入单元类型typ[i]。

案例:
跨度5m,层高3m
荷载:集中力100kN,弯矩200kN,均布荷载20kN/m
截面:

输入文件:
输出文件:

经检验和结构力学求解器所得结果相近。