程序需要的主要数据,struct ND_COORD { // 定义结构体类型 int n; //结点总数 float *x; // 结点坐标 }; // *x相当于 x[2n]; x[n],y[n].前n个为结点的x坐标,后n个为结点的y坐标。 struct ND_COORD F_X; // 定义结构体变量F_X ,来存放结点信息。可设为全局变量。 如*(F_X.x+i), *(F_X.x+n+i),代表结点i的x,y坐标。,程序需要的主要数据,struct FE_INFO { // 定义结构体类型 int n; // 单元总数 int *t; // t[2n]] 单元的节点编码 int *b; // b[n]] 单元的截面编码 }; struct FE_INFO F_T; /* 定义结构体变量F_T ,来存放单元信息。可设为全局变量。 如第5单元的结点分别为F_T.t[8],F_T.t[9],截面编号为F_T.b[4] */,struct FE_PKMATRIX { //定义结构体类型 int n; // 自由度总数,即总刚方程的阶数 int *i; // i[n];总刚矩阵的索引数组,即 主元素在k中的位置 float *k; // k[i[n-1]+1] 变半带宽一维压缩存储的总刚矩阵 }; struct FE_PKMATRIX F_K; /* 定义结构体变量F_X ,来存放总刚矩阵的信息。 如*(F_K.i+i),代表下标为i行主元素在压缩存储总刚F_K.k[]中的位置, nd=*(F_X.i+i+1)- *(F_K.i+i)代表下标为i行非0元素的个数。,struct FE_BOUNDARY { //定义结构体类型 int n; // 约束总数或结点荷载数 int *node; // 约束对应的结点编号 int *attr; // 约束的方向值; 1-x方向; // 2--y方向,3—转动方向 double *value; //沉降值或 荷载值 }; struct FE_BOUNDARY F_U,F_P; /* 定义结构体变量F_U,F_P ,分别来存放边界约束和结点荷载的信息。 */,struct FE_LOAD { // 定义结构体类型 int n; // 非结点荷载总数 int *e; // e[n],荷载作用的单元编号 int *attr; //attr[n], 荷载类型编号 double *f; //f[3n],常数c,a,G。 }; struct FE_LOAD F_F; /* 定义结构体变量F_F ,来存放单元非结点荷载的信息。 */,struct FE_AREA_INTER { // 定义结构体类型 int n; // 截面類型數 double *A; // 截面面积 double *I; // 截面惯性矩。 }; struct FE_AREA_INTER F_AI; /* 定义结构体变量F_AI ,来存放各类截面面积和惯性矩。 */,平面刚架静力计算程序流程图,平面刚架静力计算程序流程图,程序模块设计,int Readdata_2(char *file) 读取平面刚架有限元分析需要的所有数据,如结点信息、单元信息、截面信息、边界支座信息、荷载信息、材料信息等; 在此函数中定义全局变量F_X,F_T,F_U,F_P,F_AI,F_F,E0,并从文件中读取相应的数据。 函数所需参数:*file为数据文件名。 成功读取数据,函数的返回值为0,数据文件不存在,返回-1;内存出错,返回1。,int Kindex_2( ),建立采用2结点梁单元计算平面刚架的变带宽一维压缩存储的总刚矩阵的索引数组F_K.i[],即 总刚矩阵的主元素k[i][i]被压缩存储后,在F_K.k[]中的位置。 记录总刚信息的结构体变量F_K在此定义,并计算出总刚矩阵F_K.k[]元素的个数,并为之分配存储单元; 函数需要的数据:结点信息F_X,单元信息F_T,均为全局变量; 返回总刚矩阵的最大半带宽值,如果内存出错,则返回0。,void Ekbeam_2( ),计算平面刚架变带宽一维压缩存储的总刚度矩阵F_K.k[]; 所需数据:结点信息F_X, 单元信息F_T,截面信息F_AI, 材料信息E0,总刚信息F_K,均为全局变量; 需调用的函数: void E_Proporty(int nb, float *x,double *d),计算截面相应的参数 d[4] ,即杆长l,抗拉刚度EA/l、抗弯刚度EI/l、杆与整体坐标的夹角; void Ek1002(double *d, double *ek),计算2结点梁单元的单元坐标表示的单元刚度矩阵 ek[6*6]; void Coorchang(double arf, double *ek),把单元局部坐标的单元刚度ek[6][6]矩阵转换到整体坐标下;,void P_load_2(float *p),计算刚架总的荷载向量 *p ; 所需数据:结点信息F_X, 单元信息F_T,荷载信息F_P,F_F,均为全局变量; 需调用的函数: void P_Unode(int id,double *lap,double *d,double *ep),计算单元非结点荷载引起的等效结点荷载; void E_Proporty(int nb, float *x,double *d),计算截面相应的参数 d[4] ,即杆长l,抗拉刚度EA/l、抗弯刚度EI/l、杆与整体坐标的夹角; void P_Guduan(int id,double *lap,double *pe);计算单元固定力向量;,void BoundProcess(struct FE_BOUNDARY u,float *p),根据边界条件修改刚度方程,主元素乘大数法 (主元素置1法 ); * u: 记录边界支座条件的结构体变量; *p: 结构总的的荷载向量,高斯法解方程组,int Solvc1(long *n, float *ak, long jn) ; Solvc1: 总刚矩阵三角分解. [ak]=[L][U] (Uji=Lij/Lii); 正确返回1;当主元素 if k[i][i] = 0,返回-i; void Solvc2(float *p, long *n, float *ak, int jn) Solvc2: 回代求解. ak[] 一维压缩存储的总刚矩阵F_K.k[]. n[jn]--总刚矩阵索引数组; jn--总刚方程的阶数 p[jn]--荷载向量,函数返回时,存放结点位移,void Ele_Force(float *force,float *p),计算所有单元的杆端力*force ; 所需数据:结点信息F_X, 单元信息F_T,荷载信息,F_F,均为全局变量;*p,所有结点位移向量; 调用函数:void Eforce_2(double arf, double *ek, double *up),计算2节点梁单元的单元杆端力向量,
展开阅读全文