資源簡介
這個C語言編寫的有限元剛架程序可以直接運行,詳細包括了單剛集成的過程,又采用了半帶寬存儲總剛的辦法,詳細編寫了高斯消元法過程,整個代碼非常實用
代碼片段和文件信息
//計算平面鋼架的程序
//程序開始
#include
#include
#define?NE?2
#define?NJ?3???????????????????//定義并輸入基本參數
#define?NZ?6
#define?NPJ?3
#define?NPF?2
#define?NJ3?9
#define?DD?9
#define?E0?3.0000E8????????????//?定義并輸入常數
#define?A0?0.5
#define?I0?4.1667E-2
#define?PI?3.141592654
//?這是輸入參數的初始化和定義全局變量
int?jm[NE+1][3]={{000}{012}{031}};
double?gc[NE+1]={0.05.05.0};
double?gj[NE+1]={0.00.090.0};
double?mj[NE+1]={0.0A0A0};
double?gx[NE+1]={0.0I0I0};
int?zc[NZ+1]={0456789};
double?pj[NPJ+1][3]={{0.00.00.0}{0.06.01.0}{0.02.02.0}{0.0-5.03.0}};
double?pf[NPF+1][5]={{00000}{0.0-4.85.01.01.0}{0.0-8.02.52.02.0}};
double?kz[NJ3+1][NJ3+1]p[NJ3+1];
double?pe[7]f[7]f0[7]t[7][7];
double?ke[7][7]kd[7][7];
//??kz[][]---整體剛度矩陣
//??ke[][]---整體坐標系下的單元剛度矩陣
//??kd[][]---局部坐標系下的單元剛度矩陣
//??t[][]?---坐標板換矩陣
//*****函數聲明*****
void?jdugd(int);
void?zb(int);
void?gdnl(int);
void?dugd(int);
//***主函數開始*****
void?main(void)
{
?????FILE?*fp;
int?ijkedhhiijjhza1b1mldlzlzj0;
double?clwy[7];
int?IMINjn;
//<功能:形成矩陣p>
if(NPJ>0)
{
for(i=1;i<=NPJ;i++)
{
j=(int)pj[i][2];
p[j]=pj[i][1];
}
}
if(NPF>0)
{
for(i=1;i<=NPF;i++)
{
hz=i;??//可否省略此行代碼,下一行直接寫gdnl(i),這樣也是將實參i傳遞給形參hz
gdnl(hz);
e=(int)pf[hz][3];
zb(e);
for(j=1;j<=6;j++)
{
pe[j]=0.0;
for(k=1;k<=6;k++)
{
pe[j]=pe[j]-t[k][j]*f0[k];????//用的是轉秩矩陣?????zb()函數出來的是直接矩陣???在這先讓列不動行動??相當于乘的轉秩
}
}
a1=jm[e][1];
b1=jm[e][2];
p[3*a1-2]=p[3*a1-2]+pe[1];
p[3*a1-1]=p[3*a1-1]+pe[2];
p[3*a1]=p[3*a1]+pe[3];
p[3*b1-2]=p[3*b1-2]+pe[4];
p[3*b1-1]=p[3*b1-1]+pe[5];
p[3*b1]=p[3*b1]+pe[6];
}
}
//*********************************************
//<功能:生成整體剛度矩陣ke[][]>
for(e=1;e<=NE;e++)????????????????????????????//這里的總剛KE實際是已經處理過的帶狀矩陣KZ*了!
{
dugd(e);
for(i=1;i<=2;i++)
{
for(ii=1;ii<=3;ii++)
{
h=3*(i-1)+ii;
dh=3*(jm[e][i]-1)+ii;
for(j=1;j<=2;j++)
{
for(jj=1;jj<=3;jj++)
{
l=3*(j-1)+jj;
zl=3*(jm[e][j]-1)+jj;
dl=zl-dh+1;????
if(dl>0)
kz[dh][dl]=kz[dh][dl]+ke[h][l];
}
}
}
}
}
//****引入邊界條件*******
for(i=1;i<=NZ;i++)????//按支撐循環,即約束總數(假設共一個固定端支座和一個固定鉸支座,則總數仍為6?)
{
z=zc[i];??????????//取出支撐對應的位移數(如固定鉸支座對應節點碼為3,則z=7?8?9)放入變量z中
kz[z][1]=1.0;?????//Z行第一個元素置為1.0,注意這里的KZ已是處理后的帶狀矩陣了,即對應于原總剛中的Z行中對角線處的元素置一了!
for(j=2;j<=DD;j++)??//這個循環是將帶狀矩陣中Z行的其他元素全部置為零,由于KZ與KZ*中行元素是不變的,即KZ中的r行元素在KZ*中
kz[z][j]=0.0;???//仍在r行。即這個循環的本質是將KZ總剛中Z行除對角線位置元素外的所有元素置為零!
if((z!=1))
{
if(z>DD)j0=DD;????//先通過一個判斷語句,得出正確的列數J0,要用這個列數來實現Z行斜向上45°所有元素置零,這個操作等同于
else?if(z<=DD)j0=z;??//將總剛KZ中的Z列除對角線元素外的所有元素置零!
for(j=2;j<=j0;j++)????//j從2到j0代表了斜向上45°各元素的列變化規律
kz[z-j+1][j]=0.0;??//代表了斜向上45°各元素的行變化規律
}
p[z]=0.0;???//將位移約束代碼所對應的荷載列陣處的元素置為零??????????????????????????
}
/*高斯
- 上一篇:漢字取模軟件----單片機使用必備
- 下一篇:C++編寫的萬年歷源碼
評論
共有 條評論