八节点等参单元平面有限元

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八节点等参单元平面有限元
分析程序
土木工程学院
2011.2
目录
1.概述 (1)
2.编程思想 (2)
2.1.八节点矩形单元介绍 (2)
2.2.有限元分析的模块组织 (5)
3.程序变量及函数说明 (6)
3.1.主要变量说明: (6)
3.2.主要函数说明 (7)
4.程序流程图 (8)
5.程序应用与ANSYS分析的比较 (9)
5.1.问题说明 (9)
5.2.ANSYS分析结果 (10)
5.3.自编程序分析结果 (12)
5.4.结果比较分析 (12)
参考文献 (14)
附录程序源代码 (15)
《计算力学》课程大作业
1.概述
通常情况下的有限元分析过程是运用可视化分析软件(如ANSYS、SAP等)进行前处理和后处理,而中间的计算部分一般采用自己编制的程序来运算。

具有较强数值计算和处理能力的Fortran语言是传统有限元计算的首选语言。

随着有限元技术的逐步成熟,它被应用在越来越复杂的问题处理中,但在实际应用中也暴露出一些问题。

有时网格离散化的区域较大,而又限于研究精度的要求,使得划分的网格数目极其庞大,结点数可多达数万个,从而造成计算中要运算的数据量巨大,程序运行的时间较长的弊端,这就延长了问题解决的时间,使得求解效率降低。

因为运行周期长,不利于程序的调试,特别是对于要计算多种运行工况时的情况;同时大数据量处理对计算机的内存和CPU 提出了更高的要求,而在实际应用中,单靠计算机硬件水平的提高来解决问题的能力是有限的。

因此,必须寻找新的编程语言。

随着有限元前后处理的不断发展和完善,以及大型工程分析软件对有限元接口的要求,有限元分析程序不应只满足解题功能,它还应满足软件工程所要求的结构化程序设计条件,能够对存储进行动态分配,以充分利用计算机资源,它还应很容易地与其它软件如CAD 的实体造型,优化设计等接口。

现在可编写工程应用软件的计算机语言较多,其中C语言是一个较为优秀的语言,很容易满足现在有限元分析程序编程的要求。

C语言最初是为操作系统、编译器以及文字处理等编程而发明的。

随着不断完善,它已应用到其它领域,包括工程应用软件的编程。

近年来,C语言已经成为计算机领域最普及的一个编程语言,几乎世界上所有的计算机都装有C的编译器,从PC机到巨型机到超巨型的并行机,C与所有的硬件和操作系统联系在一起。

用C 编写的程序,可移植性极好,几乎不用作多少修改,就可在任何一台装有ANSI、C编译器的计算机上运行。

C既是高级语言,也是低级语言,也就是说,可用它作数值计算,也可用它对计算机存储进行操作。

2. 编程思想
本程序采用C 语言编程,编制平面四边形八节点等参元程序,用以求解平面结构问题。

程序采用二维等带宽存储整体刚度矩阵,乘大数法引入约束,等带宽高斯消去法求解位移。

在有限元程序中,变量数据需赋值的可分为节点信息,单元信息,载荷信息等。

对于一个节点来说,需以下信息:节点编号(整型),节点坐标(实型),节点已知位移(实型),节点载荷(实型),边界条件(实型)和节点温度(实型)等。

同样,对于一个单元来说,需以下信息:单元的节点联接信息(整型),单元类型信息(桁架、梁、板、壳等)(整型) ,单元特性信息(厚度、内力矩等)(实型),材料信息(弹性模量,泊松比等)(实型)等。

在FORTRAN 程序中,以上这些变量混合在一起,很难辨认,使程序的可读性不好,如需要进行单元网络的自适应划分,节点及单元的修改将非常困难。

在进行C 语言编译过程中,采用结构struct 使每个节点信息存储在一个结构体数组中,提高程序的可读性,使数据结构更趋于合理。

2.1. 八节点矩形单元介绍
八节点矩形单元编号如图 2-1所示
八节点矩形单元的位移函数为:
222212345678u x y x xy y x y xy αααααααα=+++++++ (2.1)
2222910111213141516v x y x xy y x y xy αααααααα=+++++++ (2.2)
其形函数为
1122334455667788u N u N u N u N u N u N u N u N u =+++++++ (2.3) 1122334455667788v N v N v N v N v N v N v N v N v =+++++++ (2.4)
式(2.3)和式(2.4)中(,)i i N N εη=,并且采用等参变换,则单元的坐标变换式可取为
1122334455667788
1122334455667788X N x N x N x N x N x N x N x N x Y N y N y N y N y N y N y N y N y =+++++++⎧⎨
=+++++++⎩
(2.5)
图 2-1
单元应变矩阵为
{}x y xy u x u y u v y x εεεγ⎧⎫∂⎪⎪∂⎧⎫⎪⎪
⎪⎪⎪⎪∂==⎨⎬⎨⎬∂⎪⎪⎪⎪⎩⎭⎪⎪
∂∂+⎪⎪∂∂⎩⎭
(2.6)
式(2.6)一般简写为
{}[]{}B εδ= (2.7)
其中[]B 的子块矩阵为
[]i i i i i N x N B y N N y x ⎧⎫∂⎪⎪∂⎪⎪⎪

∂=⎨
⎬∂⎪⎪⎪⎪
∂∂⎪⎪∂∂⎩⎭
(2.8) 由于i N 是ε、η的函数,在[]i B 中的x 、y 要按照复合函数来求导,即
[]i i i i i i N N N x y x x J N N N x y y y εεεηηη∂∂∂∂∂⎡⎤⎡⎤
⎡⎤⎡⎤⎢⎥
⎢⎥⎢⎥⎢⎥∂∂∂∂∂⎢
⎥⎢⎥⎢⎥⎢⎥==∂∂∂∂∂⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢
⎥∂∂∂∂∂⎣⎦⎣⎦⎣⎦⎣⎦
(2.9) 从而有
[]1
i i i i N N x J N N y εη-∂∂⎡⎤⎡⎤
⎢⎥⎢⎥∂∂⎢⎥⎢⎥=∂∂⎢⎥⎢⎥⎢⎥⎢⎥∂∂⎣⎦⎣⎦
(2.10) 因此,单元应力矩阵为
{}[][]{}D B σδ= (2.11) 单元刚度矩阵为
[][][][]T
e
A
K B D B hdxdy =⎰⎰ (2.12)
其中积分采用三点高斯积分,
33
11
,11
11
1
(,)()(,)nip
i
j
i j i
i
i j i f d d f W f ξηξηωω
ξηξη--===∑∑∑⎰⎰
;
;
(2.13)
2nip n =(高斯积分点的总数),i ω和j ω或i W 是加权系数,i ξ和j η是单元内的坐标.。


于三点高斯积分,高斯积分点的位置:
11 5.09.0ξω==,220.0,8.0ξω==,
33 5.0ξω==。

单元等效节点荷载
{}[]
{}T
e
S P N P ds =⎰ (2.14)
结构刚度矩阵
e
e
K K
=∑ (2.15)
结构结点荷载列阵
e e
P P =∑ (2.16)
注意,对于式(2.15)和式(2.16)中e

的理解不是简单的叠加而是集成。

总刚平衡方程
[]{}{}K P δ= (2.17)
从式(2.17)求出
{}[]
{}1
K P δ-= (2.18)
将{}δ回代入式(2.7)和式(2.11),得到{}ε和{}σ。

2.2.有限元分析的模块组织
一个典型的有限元分析过程主要包括以下几个步骤:
1)读输入数据,定义节点及单元数组。

2)由边界条件计算方程个数,赋值荷载列阵。

3)读入在带状存储的总刚度矩阵中单元和载荷信息。

4)定义总刚度阵数组。

5)组装总刚度阵。

6)解方程组。

其流程图可见图2-2。

图2-2
3.程序变量及函数说明3.1.主要变量说明:
3.2.主要函数说明
4.程序流程图
任何一个有限元程序处理过程,都可以划分为三个阶段:
1)前处理:读入数据和生成数据。

2)处理器:有限元的矩阵计算、组集和求解。

3)后处理:输出节点位移、单元应变等。

为了更清楚地描述程序,我们给出了程序的流程图。

5. 程序应用与ANSYS 分析的比较
为了验证程序的正确性,我们取了一个简单框架结构,分别用自编程序和ANSYS 进行分析和比较。

5.1. 问题说明
图 5-1所示一简支梁,高3m ,长18m ,承受均布荷载210/N m ,10210E Pa =⨯,
0.167μ=,取1t =m ,作为平面应力问题。

由于结构和荷载对称,只对右边一半进行有限单元计算,如图 5-2所示,而在y 轴各节点布置水平连杆支座。

图 5-1
图 5-2
5.2. ANSYS 分析结果
ANSYS 分析中,采用plane82单元,在板单元上边施加均布荷载210/N m ,在y 轴上的各结点约束UX 方向的自由度,在板单元右下角的结点约束UX 自由度,结点布置、网格划分方案如图 5-3所示。

图 5-3
图 5-4 位移图和图 5-5 各单元X σ图分别给出了结构的位移图和X σ应力云图。

图 5-5 各单元X 图
图 5-4 位移图
从图 5-4 位移图和图 5-5 各单元X σ图可以看到,跨中的位移和正应力最大,与简支梁承受均布荷载,跨中挠度和正应力最大的力学常识相符合,可以初步认为模型是正确的。

表格 1给出了0.75x m =的截面上的正应力X σ和表格 2给出了 1.5y m =处各横截面Y 方向位移,其中
X σ的单位为a P ,y δ的单位为m 。

表格 2
5.3. 自编程序分析结果
用自编程序进行分析时,采用了整个结构模型进行计算,其他条件不变,因编程水平有限,在后处理阶段没有给出节点处的位移与应力,而只能得到高斯积分点处的位移与应力,得到积分点处的应力后,根据数值分析相关知识采用了插值进行处理,从而得到0.75x m =的截面上的正应力X σ和 1.5y m =-处各横截面Y 方向位移,分别列出表格如下:
表格 3
表格 4
5.4. 结果分析比较
为了更直观的比较自编程序和ANSYS 的计算结果,将表格 1和表格 3的数据绘入图 5-6,将表格 2和表格 4的数据绘入图 5-7。

图5-6 应力比较
图5-7 位移比较
自编程序所得结果与ANSYS分析结果进行比较发现,应力偏大而位移偏小。

分析其中的原因,一方面是编程水平有限,自编程序有很多不完善之处,有很多因素没有考虑(温度、变形、非线性等),所得结果可信度不是很高,只能得到应力以及位移大概的分布情况;另一方面是在后处理阶段,在对高斯积分点结果进行处理时,误差难以避免,还有一方面的原因是在进行求解时保留数据精度不够,造成误差较大,并且进行数值运算时可能会造成大数吃小数,从而引起结果的差异。

参考文献
[1](美)史密斯(Smith,I.m.)著;王崧等译.有限单元法编程(第三版)[M].北京:电子工业出版
社,2003
[2]王勖成.有限单元法[M].北京:清华大学出版社,2003
[3]宋建辉,涂志刚.MATLAB语言及其在有限元编程中的应用[J].湛江师范学院学
报.2003.6(24):101-105
[4]郑大玉, 连宏玉, 周跃发. 有限元编程与C语言[J]. 黑龙江商学院学报.1997.3(13):23-28
[5]王伟,刘德富.有限元编程中应用面向对象编程技术的探讨[J].三峡大学学
报.2001.2(23):124-128
[6]汪文立, 吕士俊.二级C语言程序设计教程[M]. 北京:中国水利水电出版社,2006
[7]赵翔龙.FORTRAN 90学习教程[M].北京:北京大学出版社,2002
附录程序源代码
#include<stdio.h>
#include<math.h>
/*The gemotry of the model*/
float mesh[2];
float wide,hight;
float wsize,hsize,young,poiss,thick;
int i,j,k,knelem,npoin,elem[500],ielem;
float coord[2][1],props[3][1],lnods[8][500],ifpre[1]; float posgp[3],weigp[3],estif[136],elcod[2][8];
int npoin,nelem,kevab,igaus,jgaus,kgasp,ngash,djacb; float gpcod[2][9],bmatx[3][16],dmatx[3][3];
float shape[8],deriv[2][8];
float xjacm[2][2],xjaci[2][2],elcod[2][8];
float cartd[2][8];
float bmatx[3][16],dmatx[3][3];
float nload[1];
float press[3][2],pgash[2],dgash[2];
struct node
{ int nodenu;/*The number of the node*/
float cor[2];/*The coordinate of the node*/
float displacement[2];/*The displacement of the node*/ float load[2]; /*The load of the node*/
float boundary[2];
} node[500];
struct
{ int elementnu;/*The number of element*/
int localnu[8];/*Local number*/
int localcorx[8];
int localcory[8]; /*Local coordinate of node*/
float qx,qy,t;/*The stress and strain*/
}element[500];
void meshing(float wide,float hight,float mesh[2])
{ printf("Please input the meshing size\n");
scanf("%f%f",&wsize,&hsize);
getchar();
mesh[0]=wide/wsize;
mesh[1]=hight/hsize;
}
/*The global coordinate of node*/
void coordinate()
{
int i,j=1;
float x,y;
for(i=1;i<=2*mesh[1]+1;i++)
{x=0;
while(x<=wide)
if(i%2!=0)
{ node[j].cor[1]+=wsize/2;
node[j].cor[2]+=(i-1)*hsize;
j++; }
else
{ node[j].cor[1]+=wsize;
node[j].cor[2]+=(i-1)*hsize;
j++; }
}
}
main()
{ int top[500],bottom[500];/*The number of top and bottom element*/ void input();
void stif();
void jacobi2( );
void load();
void asem();
void solve( );
void stre();
npoin=8;
for(i=1;i<=8;i++)
lnods[i][1]=i;
for(i=1;i<=3;i++)
scanf("%f",&props[i][1]);
printf("The EX is %e\nThe uo is %8f\nThe bt is %8f",props[1][1],props[2][1],props[3][1]); getch();
printf("Please input the gemotry of the model\n");
scanf("%f%f",&wide,&hight);
getchar();
printf("The wide is %0.3f,the hight is %0.3f",wide,hight);
getchar();
meshing(wide,hight,mesh);
printf("The wide size is %f,the hight size is %f\n",mesh[0],mesh[1]);
input();
getchar();
nelem=mesh[0]*mesh[1];
for(i=1;i<=nelem;i++) /*The element number*/
element[i].elementnu=i;
for(i=1;i<mesh[0];i++)
npoin+=5;
for(i=1;i<mesh[1];i++)
npoin+=3*mesh[0]+2;
printf("%d",npoin);
for(i=1;i<=npoin;i++)
node[i].nodenu=i;
for(i=1;i<=nelem;i++)
for(j=1;j<=8;j++)
element[i].localnu[j]=j;
for (i=1;i<=mesh[0];i++)
bottom[i]=i;
j=1;
for(i=mesh[0]*(mesh[1]-1)+1;i<=nelem;i++)
top[j++]=i;
for(i=1;i<j;i++)
printf("the top number is %d\n",top[i]);
printf("%d\n",element[1].localnu[8]);
coordinate();
stif();
jacobi2( );
load();
asem();
solve( );
stre();
getchar();
}
/*data input*/
void input()
{ int nnode=8;
int notreadchar;
/*input element node number*/
printf("input element node number\n");
for(ielem=1;ielem<=nelem;ielem++)
for(i=1;i<=nnode;i++)
scanf("%d",&lnods[i][ielem]);
/*Input restriction message*/
printf("double-digit is symbol of the restriction,1 representates stable,2 representates gived displacement\n");
i=1;
while(i)
{ scanf("%d",&i);
if(i!=0)
{scanf("%d",&j);
scanf("%d",&ifpre[j]);}
else break;
}
}
/*Element stiffness matrix*/
void stif()
{ int kevab,nstre,ievab,istre,lnode,jstre,jevab;
float kgasp,exisp,etasp, dvolu;
float btdbm,dbmat[3];
void sfr();
/*Gauss point*/
posgp[1]=-sqrt(0.6);
posgp[2]=0;
posgp[3]=sqrt(0.6);
/*weight coefficient*/
weigp[1]=5.0/9.0;
weigp[2]=8.0/9.0;
weigp[3]=5.0/9.0;
/*number of stress*/
nstre=3;
/*form elastic matrix*/
for(ielem=1;ielem<=nelem;ielem++)
{ printf("The number of element is %d\n",ielem);
for(i=1;i<=8;i++)
{ lnode=lnods[i][ielem];
for(j=1;j<=2;j++)
{coord[j][lnode]=node[lnode].cor[j];
elcod[j][i]=coord[j][lnode];
}
}
young=props[1][1];
poiss=props[2][1];
thick=props[3][1];
modps(young,poiss);
/*The initial value of [k]*/
kevab=0;
for(i=1;i<=16;i++)
for(j=1;j<=i;j++)
{ kevab++;
estif[kevab]=0.0;
}
/*The gauss point shape function and deriv*/
kgasp=0;
for(igaus=1;igaus<=3;igaus++)
for(jgaus=1;jgaus<=3;jgaus++)
{kgasp=kgasp+1;
exisp=posgp[igaus];
etasp=posgp[jgaus];
printf("The number of gauss point is %d\n",kgasp);
sfr2(exisp,etasp);
jacob2(ielem,djacb,kgasp,elcod);
dvolu=djacb*weigp[igaus]*weigp[jgaus]*thick;
bmatps()
/*The initial value of elastic matrix [D]*/
kevab=0;
for(ievab=1;ievab<=16;ievab++)
{for(istre=1;istre<=nstre;istre++)
{dbmat[istre]=0.0;
for(jstre=1;jstre<=nstre;jstre++)
dbmat[istre]=dbmat[istre]+bmatx[jstre][ievab]*dmatx[jstre][istre];
}
for(jevab=1;jevab<=ievab;ievab++)
{ kevab=kevab+1;
btdbm=0.0;
for(istre=1;istre<=nstre;istre++)
btdbm=btdbm+dbmat[istre]*bmatx[istre][jevab];
estif[kevab]=estif[kevab]+btdbm*dvolu;
}
}
}
} }
/*float sfr2(float s,float t)
{
float s2,t2,ss,tt,st,stt,sst,st2;
/*Shape function*/
/*these variables are to simplify the formula */ s2=s*2.0;
t2=t*2.0;
ss=s*s;
tt=t*t;
st=s*t;
stt=s*t*t;
sst=s*s*t;
st2=s*t*2.0;
/*shape function*/
shape[1]=(-1.0+st+ss+tt-sst-stt)/4.0;
shape[2]=(1.0-t-ss+sst)/2.0;
shape[3]=(-1.0-st+ss+tt-sst+stt)/4.0;
shape[4]=(1.0+s-tt-stt)/2.0;
shape[5]=(-1.0+st+ss+tt+sst+stt)/4.0;
shape[6]=(1.0+t-ss-sst)/2.0;
shape[7]=(-1.0-st+ss+tt+sst-stt)/4.0;
shape[8]=(1.0-s-tt+stt)/2.0;
/* differential coefficient to local coordinate*/ deriv[1][1]=(t+s2-st2-tt)/4.0;
deriv[1][2]=-s+st;
deriv[1][3]=(-t+s2-st2+tt)/4.0;
deriv[1][4]=(1.0-tt)/2.0;
deriv[1][5]=(t+s2+st2+tt)/4.0;
deriv[1][6]=-s-st;
deriv[1][7]=(-t+s2+st2-tt)/4.0;
deriv[1][8]=(-1.0+tt)/2.0;
deriv[2][1]=(s+t2-ss-st2)/4.0;
deriv[2][2]=(-1.0+ss)/2.0;
deriv[2][3]=(-s+t2-ss+st2)/4.0;
deriv[2][4]=-t-st;
deriv[2][5]=(s+t2+ss+st2)/4.0;
deriv[2][6]=(1.0-ss)/2.0;
deriv[2][7]=(-s+t2+ss-st2)/4.0;
deriv[2][8]=-t+st;
} */
/*Jacobi matrix*/
void jacobi2( )
{ /* xjacm[2][2]:jacobi matrix;xjaci[2][2]:[j]-1;elcod[2][8]:local coordinate*/ float cartd[2][8],gpcod[2][9];
int i,j,k;
for(i=1;i<=2;i++)
{ gpcod[i][kgasp]=0.0;
for(j=1;j<=8;j++)
gpcod[i][kgasp]=gpcod[i][kgasp]+elcod[i][j]*shape[j];
}
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
{ xjacm[i][j]=0.0;
for(k=1;k<=8;k++)
xjacm[i][j]=xjacm[i][j]+deriv[i][k]*elcod[j][k];
}
/*Caculate the value of Jacobi matrix*/
djacb=xjacm[1][1]*xjacm[2][2]-xjacm[1][2]*xjacm[2][1];
printf("The det of jacobi matrix is %f\n",djacb);
if(djacb<=1e-6)
printf("The jacobi det of %d is less or equal 0\n",ielem);
/*The element of [j]-1*/
xjaci[1][1]=xjacm[2][2]/djacb;
xjaci[2][2]=xjacm[1][1]/djacb;
xjaci[1][2]=-xjacm[1][2]/djacb;
xjaci[2][1]=-xjacm[2][1]/djacb;
/*The deriv of shape function to global coordinate*/
for(i=1;i<=2;i++)
for(k=1;k<=8;k++)
{cartd[i][k]=0.0;
for(j=1;j<=2;j++)
cartd[i][k]=cartd[i][k]+xjaci[i][j]*deriv[j][k];
}
}
/* Form elastic matris */
/*float modps()
{ float bmatx[3][16],dmatx[3][3];
float constant;
int i,j,y,p;
y=props[1][1];
p=props[2][1];
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
dmatx[i][j]=0.0;
/*If Ntype=1,it is plane stress question*/
constant=y/(1.0-p*p);
dmatx[1][1]=constant;
dmatx[2][2]=constant;
dmatx[1][2]=constant*p;
dmatx[2][1]=constant*p;
dmatx[3][3]=constant*(1.0-p)/2.0;
}
*/
/*Form strain matrix*/
/*void bmatps()
{ float cartd[2][8],shape[8],deriv[2][8],bmatx[3][16],dmatx[3][3]; int npoin,nelem,ngash,mgash;
float gpcod[2][9];
/*The initial value of[B]*/
for(i=1;i<=16;i++)
for(j=1;j<=3;j++)
bmatx[j][i]=0.0;
/*Form [B]*/
ngash=0;
for(i=1;i<=8;i++)
{
mgash=ngash+1;
ngash=mgash+1;
bmatx[1][mgash]=cartd[1][i];
bmatx[1][ngash]=0.0;
bmatx[2][mgash]=0.0;
bmatx[2][ngash]=cartd[2][i];
bmatx[3][mgash]=cartd[2][i];
bmatx[3][ngash]=cartd[1][i];
}
} */
/*equal load of node*/
void load()
{
float nload[500];
float elcod[2][3],eload[16],posgp[3],weigp[3];
float press[3][2],pgash[2],dgash[2],noprs[3];
int iedge,nedge,kount;
float sgmar,tau,s,dvolu,pxcom,pycom,n,m,t;
int lnode,number,nloca; /*The number of load side*/ /*element load*/
/*The position of gauss point*/
printf("input the number of load side*/n");
scanf("%d",&number);
posgp[1]=-sqrt(0.6);
posgp[2]=0.0;
posgp[3]=sqrt(0.6);
/*The weight of gauss point*/
weigp[1]=5.0/9.0;
weigp[2]=8.0/9.0;
weigp[3]=5.0/9.0;
/*The initial load of element*/
for(i=1;i<=nelem;i++)
nload[i]=0.0;
for(i=1;i<=number;i++)
/*The initial value of equal node load*/
for(i=1;i<=16;i++)
eload[i]=0;
scanf("%d",&nedge);
for(iedge=1;iedge<=nedge;iedge++)
{for(i=1;i<=3;i++)
scanf("%f%f",&sgmar,&tau);
/*if sgmar=0,input node load q(1,2,3)and t(1,2,3)*/ if((fabs(sgmar)<1e-8)&&(fabs(tau)<1e-8))
for(j=1;j<=3;j++)
for(i=1;i<=2;i++)
scanf("%f",&press[j][i]);
else for(i=1;i<=3;i++)
{press[i][1]=sgmar;
press[i][2]=tau;
}
/*The coordinate of the load node*/
for(i=1;i<=3;i++)
{ /*input load node*/
printf("input node load number\n");
scanf("%d",&noprs[i]);
lnode=noprs[i];
for(j=1;j<=2;j++)
coord[j][lnode]=node[lnode].cor[j];
elcod[j][i]=coord[j][lnode];
}
t=-1.0;
for(igaus=1;igaus<=3;igaus++)
{ s=posgp[igaus];
sfr(s,t);
for(j=1;j<=2;j++)
{ pgash[j]=0.0;
dgash[j]=0.0;
/*current point q,t and the value of deriv*/
{ pgash[j]=pgash[j]+press[i][j]*shape[i];
dgash[j]=dgash[j]+elcod[j][i]*deriv[1][i];
}
}
dvolu=weigp[igaus];
pxcom=dgash[1]*pgash[2]-dgash[2]*pgash[1];
pycom=dgash[1]*pgash[1]+dgash[2]*pgash[2];
for(i=1;i<=8;i++)
{ nloca=lnods[i][ielem];
if(nloca==noprs[1])
{ j=i+2;
break;
}
}
j=i+2;
kount=0;
for(k=i;k<=j;k++)
{ kount=kount+1;
n=(k-1)*2+1;
m=n+1;
/*if the local node numner >8,then it is 1*/
if(k>8)
{ n=1;
m=2;
}
/*sum to get the equal node load*/
eload[n]=eload[n]+shape[kount]*pxcom*dvolu; eload[m]=eload[m]+shape[kount]*pycom*dvolu;
}
}
}
print("The element load matrx is/n");
for(i=1;i<=16;i++)
printf("%f\n",eload[i]);
}
/*To form global stiffness matrix and load matrix*/
void asem()
{float v[1],a[1];
float lnods[8][1],ifpre[1],nload[1],maxa[1];
float ncodf[2],estif[136],eload[16];
float dlarge,x;
int ipoin,kmin,lnode,khigh,kdofn,nn,nnm,nwk,iwk,in;
int inodi,inode,icodf,idofn,ievab,icoln,jnode,lnodj,jdofn,jevab,jrow,ldis,lnodi; maxa[1]=1;
for(ipoin=1;ipoin<=npoin;ipoin++)
{ kmin=npoin+1;
for(ielem=1;ielem<=nelem;ielem++)
for(i=1;i<=8;i++)
{ lnode=lnods[i][ielem];
if(lnode==ipoin)
break;
}
for(i=1;i<=8;i++)
{ lnode=lnods[i][ielem];
if(lnode>=kmin)
break;
}
kmin=lnode;
khigh=(ipoin-1)*2+j+1;
for(j=1;j<=2;j++)
{ kdofn=(ipoin-1)*2+j+1;
maxa[kdofn]=maxa[kdofn-1]+khigh+j;
}
}
nn=npoin*2;
nnm=nn+1;
nwk=maxa[nnm]-1;
printf("The sum is %d\n",nwk);
for(iwk=1;iwk<=nwk;iwk++)
a[iwk]=0.0;
for(in=1;in<=nn;nn++)
v[in]=0.0;
dlarge=1.0e+15;
for(ielem=1;ielem<=nelem;ielem++)
{ printf("The number of element is %d\n",ielem); for(inode=1;inode<=8;inode++)
{ inodi=lnods[inode][ielem];
icodf=ifpre[lnodi];
ncodf[1]=icodf/10;
ncodf[2]=icodf-ncodf[1]*10;
for(idofn=1;idofn<=2;idofn++)
{ ievab=(inode-1)*2+idofn;
icoln=(lnodi-1)*2+idofn;
for(jnode=1;jnode<=8;jnode++)
{ lnodj=lnods[jnode][ielem];
for(jdofn=1;jdofn<=2;jdofn++)
{jevab=(jnode-1)*2+jdofn;
jrow=(lnodj-1)*2+jnode;
if(jrow>icoln)
break;
if(jevab>ievab)
kevab=jevab*(jevab-1)/2+ievab;
else kevab=ievab*(ievab-1)/2+jevab;
ldis=maxa[icoln]+(icoln-jrow);
a[ldis]=a[ldis]+estif[kevab];
}
}
if(nload[ielem]>0)
v[icoln]=v[icoln]+eload[ievab];
if(ncodf[idofn]==0)
break;
kevab=ievab*(ievab+1)/2;
ldis=maxa[icoln];
a[ldis]=a[ldis]+dlarge*estif[kevab];
}
}
}
printf("Enter gived displacement\n");
for(i=1;i<=npoin;i++)
{ icodf=ifpre[i];
ncodf[1]=icodf/10;
ncodf[2]=icodf-ncodf[1]*10;
for(j=1;j<=2;j++)
{ if(ncodf[j]==2)
scanf("%f",&x);
icoln=(i-1)*2+j;
v[icoln]=a[ldis]*x;
}
}
}
/*To solve the equation*/
void solve( )
{ float v[1],a[1],maxa[1];
int npoin,nelem,ntype,nmats;
int l,k,nn,nnm,nwk,n,ku,kl,kh,kn;
float ic,b,c,klt,ki,nd,kk,m1,m2,kul;
nn=npoin*2;
nnm=nn+1;
for(n=1;n<=nn;n++)
{ kn=maxa[n];
kl=kn+1;
ku=maxa[n+1]-1;
kh=ku-kl;
if(kh<0)
if(a[kn]<=0)
{printf("*****Stop run! Coefficient matrix is not illegal!*****Non+positive pivot for equation %d,pivot=%f\n",n,a[kn]);
break;
}
else
if(kh==0)
{ k=n;
b=0.0;
for(kk=kl;kk<=ku;kk++)
{ k=k-1;
ki=maxa[k];
c=a[kk]/a[ki];
b=b+c*a[kk];
a[kk]=c;
a[kn]=a[kn]-b;
}
if(kh>0)
{ k=n-kh;
ic=0;
klt=ku;
for(j=1;j<=kh;j++)
{ ic=ic+1;
klt=klt-1;
ki=maxa[k];
nd=maxa[k+1]-ki-1;
if(nd<=0)
k=k+1;
c=0;
for(l=1;l<=kk;l++)
{ m1=ki+l;
m2=klt+l;
c=c+a[m1]*a[m2];
}
}
printf("Reduce right--hand--side load vector\n"); for(n=1;n<=nn;n++)
{ kl=maxa[n]+1;
ku=maxa[n+1]-1;
kul=ku-kl;
if(kul>=0)
{ k=n;
c=0.0;
for(kk=kl;kk<=ku;kk++)
{ k=k-1;
c=c+a[kk]*v[k];
v[n]=v[n]-c;
}
}
}
printf("Back--substitute\n");
for(n=1;n<=nn;n++)
{ k=maxa[n];
v[n]=v[n]/a[k];
}
if(nn!=1)
{ n=nn;
for(l=2;l<=nn;l++)
{ kl=maxa[n]+1;
ku=maxa[n+1]-1;
kul=ku-kl;
if(kul>=0)
{k=n;
for(kk=kl;kk<=ku;kk++)
{ k=k-1;
v[k]=v[k]-a[kk]*v[n];
}
}
n=n-1;
}
printf("Output displacement\n");
printf("x direction,y direction\n");
m2=0;
for(i=1;i<=npoin;i++)
{m1=m2+1;
m2=m1+1;
printf("The number of gauss point is %d,%16.5e%16.5e\n",i,v[m1],v[m2]);
}
} } } }
/*To get element stress*/
/* void stre() */
{ float v[1],lnods[8][500];
float posgp[3],elcod[2][8],eldis[16],be[3],s[3],sp[2];
int ievab,mdofn,ldofn,l,lnode;
float bmatx[3][16],dmatx[3][3],gpcod[2][9],lprop;
float xa,xi,xe,xp,xo,exisp,iguas,etasp;
posgp[1]=-sqrt(0.6);
posgp[2]=0.0;
posgp[3]=sqrt(0.6);
printf("Output the stress of gauss point.\n");
for(ielem=1;ielem<=nelem;ielem++)
{ printf("The number of element is %d\n",ielem);
for(i=1;i<=8;i++)
{ lnode=lnods[i][ielem];
ldofn=lnode*2-2;
for(j=1;j<=2;j++)
{ ievab=i*2-2+j;
mdofn=ldofn+j;
eldis[ielem]=v[mdofn];
elcod[j][i]=coord[j][lnode];
}
}
young=props[1][lprop];
poiss=props[2][lprop];
thick=props[3][lprop];
modps(young,poiss);
kgasp=0;
for(igaus=1;igaus<=3;igaus++)
for(jgaus=1;jgaus<=3;jgaus++)
{ kgasp=kgasp+1;
exisp=posgp[iguas];
etasp=posgp[jgaus];
sfr2(exisp,etasp);
jacob2(ielem,djacb,kgasp,elcod);
bmatps();
for(i=1;i<=3;i++)
{be[i]=0.0;
for(j=1;j<=16;j++)
be[i]=be[i]+bmatx[i][j]*eldis[j];
}
for(l=1;l<=3;l++)
{ s[l]=0.0;
for(j=1;j<=3;j++)
s[l]=s[l]+dmatx[l][j]*be[j];
}
printf("The number of gauss point is %d\n",kgasp);
printf("The coordinate of gauss point is %9.3f%9.3f\n", gpcod[1][kgasp],gpcod[2][kgasp]);
xa=(s[1]+s[2])*0.5;
xi=(s[1]-s[2])*0.5;
xe=s[3];
xo=sqrt(xi*xi+xe*xe);
sp[1]=xa+xo;
sp[2]=xa-xo;
printf("****** stress σx*****stress σy******stress τ******\n"); for(i=1;i<=3;i++)
printf("******%5.3f",s[i]);
printf("******stress q1******stress q2******\n");
for(i=1;i<=2;i++)
printf("******%5.3f",sp[i]);
}
}
}
}。

相关文档
最新文档