有限元C++编程实践
有限元算例二维传热c++程序源代码4

//please turn to page 158 for more detailsprintf("计算基函数系数值...\n");for(id=0;id<nx*ny*2;id++){for(i=0;i<3;i++){if(i==0) j=1,k=2;else if(i==1) j=2,k=0;else if(i==2) j=0,k=1;pE[id].A=( (pE[id].nd[j].x-pE[id].nd[i].x)*(pE[id].nd[k].y-pE[id].nd[i].y)-(pE[id].nd[j].y-pE[id].nd[i].y)*(pE[id].nd[k].x-pE[id].nd[i].x) )/2.0;D=2.0*pE[id].A;pE[id].a[i]=( pE[id].nd[j].x*pE[id].nd[k].y- pE[id].nd[k].x*pE[id].nd[j].y )/D;pE[id].b[i]=( pE[id].nd[j].y-pE[id].nd[k].y )/D;pE[id].c[i]=( pE[id].nd[k].x-pE[id].nd[j].x )/D;}}printf("OK!\n");printf("计算单元有限元特征式系数矩阵...\n");int l,m;for(i=0;i<nx;i++) //计算单元有限元特征式系数矩阵for(j=0;j<ny;j++){for(l=0;l<3;l++) //for the first triangle in the rectanglefor(m=0;m<3;m++){pE[i*2+j*ny*2].Aij[l][m]=( pE[i*2+j*ny*2].b[l]*pE[i*2+j*ny*2].b[m] +pE[i*2+j*ny*2].c[l]*pE[i*2+j*ny*2].c[m] ) * pE[i*2+j*ny*2].A;}for(l=0;l<3;l++) //for the second triangle in the rectangle for(m=0;m<3;m++){pE[i*2+j*ny*2+1].Aij[l][m]=( pE[i*2+j*ny*2+1].b[l]*pE[i*2+j*ny*2+1].b[m] + pE[i*2+j*ny*2+1].c[l]*pE[i*2+j*ny*2+1].c[m] ) * pE[i*2+j*ny*2+1].A;}}printf("OK!\n");printf("计算积分值,填充到f函数向量数组...\n");static int js[2]={4,4}; //每一层积分区间均分为4个子区间int idx=0;for(i=0;i<nx;i++) //计算积分值,填充到f函数向量数组for(j=0;j<ny;j++){for(idx=0;idx<3;idx++) //for the first triangle in the rectangle。
三结点三角形有限单元程序设计C 语言

fclose(fp) ;
int NN2=NN*2; int NBW=NN2;
//半带宽 NBW
float GK[50][50];
float DU[50];
int *count=new int [NN];
float (*strain)[3]=new float [NN][3];
float (*stress)[3]=new float [NN][3];
int ngn[3]; for(i=0;i<3;i++)ngn[i]=NGN[NOE-1][i];
float cn[3][2]; for(i=0;i<3;i++) for(j=0;j<2;j++) cn[i][j]=CN[ngn[i]-1][j];
float a[3]={0,0,0}; float b[3]={0,0,0}; float c[3]={0,0,0};
void elestrain_stress(
intNOE,intNGN[][3],floatCN[][2],
floatDU[50],floatE0,floatU0,floatt,
intNE,intNN,floatelestrain[3],floatelestress[3]);
#endif
Ⅴ.节点应力-应变头文件 NodeStrainStress.h
fscanf(fp,"%s",&newlin); for(i=0;i<NN;i++)
for(j=0;j<2;j++) fscanf(fp, "%f", &CN[s",&newlin); int NRE=0; fscanf(fp, "%d", &NRE) ; int *restrict=new int [NRE]; for(i=0;i<NRE;i++)
有限单元法 cad cam实验报告

CAD/CAM 技术实验报告有限单元法一、实验目的1、通过上机练习,学习3D实体建模的基本知识。
2、了解有限元法作为一种数值计算方法解决工程实际问题的全过程。
3、知道如何进行有限元离散、单元分析和整体分析,并得出相应的分析结果。
二、实验原理I-DEAS软件是当今国内、外应用最为广泛的几种大型CAD/CAM/CAE一体化软件之一,具有较强的有限元分析功能。
在航空航天、核工业、铁路运输业、石油化工、机械制造、能源、汽车、电子、造船和水利等领域得到广泛的应用,为各领域内的产品设计和科学研究做出了很大贡献。
用I-DEAS软件进行结构偶有限元分析的步骤:(1)前处理程序:前处理程序的功能是根据一个实际问题的物理模型,用尽可能接近自然语言的方式,向计算机输入尽可能少的定义有限元模型和控制分析过程的数据,自动生成有限元分析主体程序所需要的全部输入文件。
几何造型:几何造型是指在选定的坐标(常用的是直角坐标系、圆柱坐标系和球坐标系)内通过几何元素(点、线、面、体)的生成和对他们的编辑,生成有限元分析对象的几何构造和图形。
网格生成:1、转换生成法:这是直接将几何元素的点、线、面和体直接转化成有限元的结点、线单元、面单元和体单元。
2、自动生成法:这是在商业软件中常被采用的方法。
他在任意形状的平面或空间裁剪曲面上可生成三角形或四边形单元;对单元几何实体或由曲面围成的封闭空间,可生成四面体或六面体实体单元。
(2)后处理程序:后处理程序的功能是对用户在前处理程序中指明需要输出的计算结果进一步处理和图形显示。
主要计算结果中通常需要处理的物理量是位移(矢量或各个分量)、应力(等效应力或各个分量)和温度等。
为了清晰地观察变形图和未变形图对比的显示结果,变形图可以由用户给出放大倍数。
三、使用仪器、材料计算机、I-DEAS软件四、实验步骤(一)初步熟悉I-DEAS软件1、了解软件界面的不同分区,包含图形区、执行命令输出信息区、提示区和功能按钮区。
有限元分析中《结构力学》矩阵位移法C语言程序(附例题)

程序:#include "stdafx.h"#include "stdio.h"#include "math.h"#include "stdlib.h"void main(){int loc[3][2]={0},ifix[6]={0};float area[3]={0.0},fint[3]={0.0},cx[4]={0.0},cy[4]={0.0},f[12]={0.0},fr[12]= {0.0},fe[3][6]={0.0};int nn,ne,nd,nfix;float ea;int i,j,k;FILE *shuru,*shuchu;shuru=fopen("shuru.dat","r");shuchu=fopen("shuchu.dat","w");fscanf(shuru,"%d%d%d%d%f",&nn,&ne,&nd,&nfix,&ea);fprintf(shuchu,"nn ne nd nfix e\n%d %d %d %d %f\n",nn,ne,nd,nfix,ea);i=0;while(i<=ne-1){fscanf(shuru,"%d%d%f%f",&loc[i][0],&loc[i][1],&area[i],&fint[i]);i++;}fprintf(shuchu,"element node1 node2 area fint\n");i=0;while(i<=ne-1){fprintf(shuchu,"%d %d %d %f %f\n",i+1,loc[i][0],loc[i][1],area[i],fint[i]);i++;}j=0;while(j<=nn-1){fscanf(shuru,"%f%f",&cx[j],&cy[j]);j++;}fprintf(shuchu,"node x-coord y-coord\n");j=0;while(j<=nn-1){fprintf(shuchu,"%d %f %f\n",j+1,cx[j],cy[j]);j++;}k=0;while(k<=nfix-1){fscanf(shuru,"%d",&ifix[k]);k++;}fprintf(shuchu,"ifix=");k=0;while(k<=nfix-1){fprintf(shuchu,"%d ",ifix[k]);k++;}fprintf(shuchu,"\n");void cst(int (*loc)[2],int *ifix,float *area,float *fint,float *cx,float *cy,float*f,float *fr,float (*fe)[6],FILE *shuru,FILE *shuchu,float ea);cst(loc,ifix,area,fint,cx,cy,f,fr,fe,shuru,shuchu,ea);fprintf(shuchu,"node x-disp y-disp thita\n");i=0;while(i<=3){fprintf(shuchu,"%d %f %f %f\n",i+1,f[3*i],f[3*i+1],f[3*i+2]);i++;}fprintf(shuchu,"reaction nodal forces from the equations\n");fprintf(shuchu,"node x-load y-load moment\n");i=0;while(i<=3){fprintf(shuchu,"%d %f %f %f\n",i+1,fr[3*i],fr[3*i+1],fr[3*i+2]);i++;}fprintf(shuchu,"element axi-f shear-q moment-m\n");i=0;while(i<=ne-1){fprintf(shuchu,"%d %f %f %f %f %f %f\n",i+1,fe[i][0],fe[i][1],fe[i][2],fe[i][3],fe [i][4],fe[i][5]);i++;}fclose(shuru);fclose(shuchu);}void cst(int (*loc)[2],int *ifix,float *area,float *fint,float *cx,float *cy,float*f,float *fr,float (*fe)[6],FILE *shuru,FILE *shuchu,float ea){int np,nvd;float p1[3][6]={0.0},p2[3][6]={0.0},gk[12][12]={0.0},gk1[12][12]={0.0},al[3]= {0.0},tt[3][6][6]={0.0},bkl[3][6][6]={0.0};float t[6][6]={0.0},css[3]={0.0},snn[3]={0.0},ek[6][6]={0.0},ekl[6][6]={0.0},ekk[3] [6][6]={0.0},xx[6]={0.0},ba[6][6]={0.0};int nn=4,ne=3,nd=12,nfix=6;int ii,jj,i,j,k,l,inode,nodei,idofn,nrows,nrowe,jnode,nodej,jdofn,ncols,ncole;int i1,i2,ie,ix;float x12,y12,q,eal,eil1,eil2,eil3;i=0;{for(;i<=ne-1;i++){i1=loc[i][0];i2=loc[i][1];x12=cx[i2-1]-cx[i1-1];y12=cy[i2-1]-cy[i1-1];al[i]=sqrt(pow(x12,2)+pow(y12,2));css[i]=x12/al[i];snn[i]=y12/al[i];}}fscanf(shuru,"%d%d",&np,&nvd);if(np!=0)i=0;for(;i<=np-1;i++){fscanf(shuru,"%d%f%f%f",&i,&f[3*i],&f[3*i+1],&f[3*i+2]); }if(nvd!=0)i=0;for(;i<=nvd-1;i++){fscanf(shuru,"%d%f",&ie,&q);i1=loc[ie-1][0];i2=loc[ie-1][1];p1[ie-1][1]=q*al[ie-1]/2;p1[ie-1][2]=q*al[ie-1]*al[ie-1]/12;p1[ie-1][4]=q*al[ie-1]/2;p1[ie-1][5]=-q*al[ie-1]*al[ie-1]/12;}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){gk[i][j]=0.0;}}for(i=0;i<=ne-1;i++){j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){ekl[j][k]=0.0;ek[j][k]=0.0;t[j][k]=0.0;}}eal=ea*area[i]/al[i];eil1=ea*fint[i]/al[i];eil2=ea*fint[i]/(al[i]*al[i]);eil3=ea*fint[i]/(al[i]*al[i]*al[i]);ekl[0][0]=eal;ekl[1][1]=12.0*eil3;ekl[2][2]=4.0*eil1;ekl[3][3]=eal;ekl[4][4]=12.0*eil3;ekl[5][5]=4.0*eil1;ekl[2][1]=6.0*eil2;ekl[3][0]=-eal;ekl[4][1]=-12.0*eil3;ekl[4][2]=-6.0*eil2;ekl[5][1]=6.0*eil2;ekl[5][2]=2.0*eil1;ekl[5][4]=-6.0*eil2;ii=0;for(;ii<=4;ii++){jj=ii+1;for(;jj<=5;jj++){ekl[ii][jj]=ekl[jj][ii];}}k=0;for(;k<=5;k++){l=0;for(;l<=5;l++){{ekk[i][k][l]=ekl[k][l];fprintf(shuchu,"%d %d %d %f %f\n",i+1,k+1,l+1,ekl[k][l],ekk[i][k][l]);} }}t[0][0]=css[i];t[0][1]=-snn[i];t[1][0]=snn[i];t[1][1]=css[i];t[2][2]=1.0;t[3][3]=css[i];t[3][4]=-snn[i];t[4][3]=snn[i];t[4][4]=css[i];t[5][5]=1.0;j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){tt[i][j][k]=t[j][k];p2[i][j]=p2[i][j]+t[j][k]*p1[i][k];}}ii=0;for(;ii<=5;ii++){j=0;for(;j<=5;j++){ba[ii][j]=0.0;k=0;for(;k<=5;k++){ba[ii][j]=ba[ii][j]+tt[i][ii][k]*ekl[k][j];}}}ek[ii][j]=0.0;ii=0;for(;ii<=5;ii++){j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){ek[ii][j]=ek[ii][j]+ba[ii][k]*tt[i][j][k];}}}j=0;for(;j<=5;j++){ii=0;for(;ii<=5;ii++){fprintf(shuchu,"i,ii,j,ek,tt=%d %d %d %f %f\n",i+1,ii+1,j+1,ek[ii][j],tt[i][ii][j]); }}inode=0;while(inode<=1){nodei=loc[i][inode];idofn=0;while(idofn<=2){nrows=(nodei-1)*3+idofn;nrowe=inode*3+idofn;f[nrows]=f[nrows]+p2[i][nrowe];jnode=0;while(jnode<=1){nodej=loc[i][jnode];jdofn=0;while(jdofn<=2){ncols=(nodej-1)*3+jdofn;ncole=jnode*3+jdofn;gk[nrows][ncols]=gk[nrows][ncols]+ek[nrowe][ncole];jdofn++;}jnode++;}idofn++;}inode++;}}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){gk1[i][j]=gk[i][j];}}fprintf(shuchu,"nodal forces from applied loads\node x-load y-load moment\n"); i=0;for(;i<=nn-1;i++){fprintf(shuchu,"%d %f %f %f\n",i+1,f[3*i],f[3*i+1],f[3*i+2]);}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){fprintf(shuchu,"i,j,gk1 %d %d %f\n",i+1,j+1,gk[i][j]);}}i=0;for(;i<=nfix-1;i++){ix=ifix[i];gk[ix-1][ix-1]=gk[ix-1][ix-1]*1.0e20;}void gauss(float (*a)[12],float *b,int n);gauss(gk,f,nd);i=0;for(;i<=nd-1;i++){fr[i]=0.0;j=0;for(;j<=nd-1;j++){fr[i]=fr[i]+gk1[i][j]*f[j];fr[i]=fr[i]-f[i];}}for(i=0;i<=ne-1;i++){i1=loc[i][0];i2=loc[i][1];xx[0]=f[3*i1-3];xx[1]=f[3*i1-2];xx[2]=f[3*i1-1];xx[3]=f[3*i2-3];xx[4]=f[3*i2-2];xx[5]=f[3*i2-1];j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){bkl[i][j][k]=0.0;l=0;for(;l<=5;l++){bkl[i][j][k]=bkl[i][j][k]+ekk[i][j][l]*tt[i][k][l];}}}j=0;for(;j<=5;j++){fe[i][j]=0.0;k=0;for(;k<=5;k++){fe[i][j]=fe[i][j]+bkl[i][j][k]*xx[k];}}j=0;for(;j<=5;j++){fe[i][j]=fe[i][j]-p1[i][j];}}}void gauss(float (*a)[12],float *b,int n){int i,i1,j,m;i=0;for(;i<=n-1;i++){i1=i+1;for(j=i1;j<=n-1;j++)a[i][j]=a[i][j]/a[i][i];b[i]=b[i]/a[i][i];a[i][i]=1.0;for(j=i1;j<=n-1;j++){for(m=i1;m<=n-1;m++)a[j][m]=a[j][m]-a[j][i]*a[i][m];b[j]=b[j]-a[j][i]*b[i];}}i=n-2;for(;i>=0;i--){j=i+1;for(;j<=n-1;j++){b[i]=b[i]-a[i][j]*b[j];}}}一、如图所示平面刚架的内力,各杆面积A=76.3cm2,惯性矩I=15760cm4,弹性模量E=2×105MPa程序:#include "stdafx.h"#include "stdio.h"#include "math.h"#include "stdlib.h"void main(){int loc[3][2]={0},ifix[6]={0};float area[3]={0.0},fint[3]={0.0},cx[4]={0.0},cy[4]={0.0},f[12]={0.0},fr[12]={0.0},fe[3][6]={0.0};int nn,ne,nd,nfix;float ea;int i,j,k;FILE *shuru,*shuchu;shuru=fopen("shuru.dat","r");shuchu=fopen("shuchu.dat","w");fscanf(shuru,"%d%d%d%d%f",&nn,&ne,&nd,&nfix,&ea);fprintf(shuchu,"nn ne nd nfix e\n%d %d %d %d %f\n",nn,ne,nd,nfix,ea);i=0;while(i<=ne-1){fscanf(shuru,"%d%d%f%f",&loc[i][0],&loc[i][1],&area[i],&fint[i]);fprintf(shuchu,"element node1 node2 area fint\n");i=0;while(i<=ne-1){fprintf(shuchu,"%d %d %d %f %f\n",i+1,loc[i][0],loc[i][1],area[i],fint[i]);i++;}j=0;while(j<=nn-1){fscanf(shuru,"%f%f",&cx[j],&cy[j]);j++;}fprintf(shuchu,"node x-coord y-coord\n");j=0;while(j<=nn-1){fprintf(shuchu,"%d %f %f\n",j+1,cx[j],cy[j]);j++;}k=0;while(k<=nfix-1){fscanf(shuru,"%d",&ifix[k]);k++;}fprintf(shuchu,"ifix=");k=0;while(k<=nfix-1){fprintf(shuchu,"%d ",ifix[k]);k++;}fprintf(shuchu,"\n");void cst(int (*loc)[2],int *ifix,float *area,float *fint,float *cx,float *cy,float*f,float *fr,float (*fe)[6],FILE *shuru,FILE *shuchu,float ea);cst(loc,ifix,area,fint,cx,cy,f,fr,fe,shuru,shuchu,ea);fprintf(shuchu,"node x-disp y-disp thita\n");i=0;while(i<=3){fprintf(shuchu,"%d %f %f %f\n",i+1,f[3*i],f[3*i+1],f[3*i+2]);i++;}fprintf(shuchu,"reaction nodal forces from the equations\n");fprintf(shuchu,"node x-load y-load moment\n");i=0;while(i<=3){fprintf(shuchu,"%d %f %f %f\n",i+1,fr[3*i],fr[3*i+1],fr[3*i+2]);i++;}fprintf(shuchu,"element axi-f shear-q moment-m\n");i=0;while(i<=ne-1){fprintf(shuchu,"%d %f %f %f %f %f %f\n",i+1,fe[i][0],fe[i][1],fe[i][2],fe[i][3],fe [i][4],fe[i][5]);fclose(shuru);fclose(shuchu);}void cst(int (*loc)[2],int *ifix,float *area,float *fint,float *cx,float *cy,float*f,float *fr,float (*fe)[6],FILE *shuru,FILE *shuchu,float ea){int np,nvd;float p1[3][6]={0.0},p2[3][6]={0.0},gk[12][12]={0.0},gk1[12][12]={0.0},al[3]= {0.0},tt[3][6][6]={0.0},bkl[3][6][6]={0.0};float t[6][6]={0.0},css[3]={0.0},snn[3]={0.0},ek[6][6]={0.0},ekl[6][6]={0.0},ekk[3] [6][6]={0.0},xx[6]={0.0},ba[6][6]={0.0};int nn=4,ne=3,nd=12,nfix=6;int ii,jj,i,j,k,l,inode,nodei,idofn,nrows,nrowe,jnode,nodej,jdofn,ncols,ncole;int i1,i2,ie,ix;float x12,y12,q,eal,eil1,eil2,eil3;i=0;{for(;i<=ne-1;i++){i1=loc[i][0];i2=loc[i][1];x12=cx[i2-1]-cx[i1-1];y12=cy[i2-1]-cy[i1-1];al[i]=sqrt(pow(x12,2)+pow(y12,2));css[i]=x12/al[i];snn[i]=y12/al[i];}}fscanf(shuru,"%d%d",&np,&nvd);if(np!=0)i=0;for(;i<=np-1;i++){fscanf(shuru,"%d%f%f%f",&i,&f[3*i],&f[3*i+1],&f[3*i+2]);}if(nvd!=0)i=0;for(;i<=nvd-1;i++){fscanf(shuru,"%d%f",&ie,&q);i1=loc[ie-1][0];i2=loc[ie-1][1];p1[ie-1][1]=q*al[ie-1]/2;p1[ie-1][2]=q*al[ie-1]*al[ie-1]/12;p1[ie-1][4]=q*al[ie-1]/2;p1[ie-1][5]=-q*al[ie-1]*al[ie-1]/12;}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){gk[i][j]=0.0;}}for(i=0;i<=ne-1;i++){j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){ekl[j][k]=0.0;ek[j][k]=0.0;t[j][k]=0.0;}}eal=ea*area[i]/al[i];eil1=ea*fint[i]/al[i];eil2=ea*fint[i]/(al[i]*al[i]);eil3=ea*fint[i]/(al[i]*al[i]*al[i]); ekl[0][0]=eal;ekl[1][1]=12.0*eil3;ekl[2][2]=4.0*eil1;ekl[3][3]=eal;ekl[4][4]=12.0*eil3;ekl[5][5]=4.0*eil1;ekl[2][1]=6.0*eil2;ekl[3][0]=-eal;ekl[4][1]=-12.0*eil3;ekl[4][2]=-6.0*eil2;ekl[5][1]=6.0*eil2;ekl[5][2]=2.0*eil1;ekl[5][4]=-6.0*eil2;ii=0;for(;ii<=4;ii++){jj=ii+1;for(;jj<=5;jj++){ekl[ii][jj]=ekl[jj][ii];}}k=0;for(;k<=5;k++){l=0;for(;l<=5;l++){{ekk[i][k][l]=ekl[k][l];fprintf(shuchu,"%d %d %d %f %f\n",i+1,k+1,l+1,ekl[k][l],ekk[i][k][l]);} }}t[0][0]=css[i];t[0][1]=-snn[i];t[1][0]=snn[i];t[1][1]=css[i];t[2][2]=1.0;t[3][3]=css[i];t[3][4]=-snn[i];t[4][3]=snn[i];t[4][4]=css[i];t[5][5]=1.0;j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){tt[i][j][k]=t[j][k];p2[i][j]=p2[i][j]+t[j][k]*p1[i][k];}}ii=0;for(;ii<=5;ii++){j=0;for(;j<=5;j++){ba[ii][j]=0.0;k=0;for(;k<=5;k++){ba[ii][j]=ba[ii][j]+tt[i][ii][k]*ekl[k][j];}}}ek[ii][j]=0.0;ii=0;for(;ii<=5;ii++){j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){ek[ii][j]=ek[ii][j]+ba[ii][k]*tt[i][j][k];}}}j=0;for(;j<=5;j++){ii=0;for(;ii<=5;ii++){fprintf(shuchu,"i,ii,j,ek,tt=%d %d %d %f %f\n",i+1,ii+1,j+1,ek[ii][j],tt[i][ii][j]); }}inode=0;while(inode<=1){nodei=loc[i][inode];idofn=0;while(idofn<=2){nrows=(nodei-1)*3+idofn;nrowe=inode*3+idofn;f[nrows]=f[nrows]+p2[i][nrowe];jnode=0;while(jnode<=1){nodej=loc[i][jnode];jdofn=0;while(jdofn<=2){ncols=(nodej-1)*3+jdofn;ncole=jnode*3+jdofn;gk[nrows][ncols]=gk[nrows][ncols]+ek[nrowe][ncole];jdofn++;}jnode++;}idofn++;}inode++;}}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){gk1[i][j]=gk[i][j];}}fprintf(shuchu,"nodal forces from applied loads\node x-load y-load moment\n"); i=0;for(;i<=nn-1;i++){fprintf(shuchu,"%d %f %f %f\n",i+1,f[3*i],f[3*i+1],f[3*i+2]);}i=0;for(;i<=nd-1;i++){j=0;for(;j<=nd-1;j++){fprintf(shuchu,"i,j,gk1 %d %d %f\n",i+1,j+1,gk[i][j]); }}i=0;for(;i<=nfix-1;i++){ix=ifix[i];gk[ix-1][ix-1]=gk[ix-1][ix-1]*1.0e20;}void gauss(float (*a)[12],float *b,int n);gauss(gk,f,nd);i=0;for(;i<=nd-1;i++){fr[i]=0.0;j=0;for(;j<=nd-1;j++){fr[i]=fr[i]+gk1[i][j]*f[j];fr[i]=fr[i]-f[i];}}for(i=0;i<=ne-1;i++){i1=loc[i][0];i2=loc[i][1];xx[0]=f[3*i1-3];xx[1]=f[3*i1-2];xx[2]=f[3*i1-1];xx[3]=f[3*i2-3];xx[4]=f[3*i2-2];xx[5]=f[3*i2-1];j=0;for(;j<=5;j++){k=0;for(;k<=5;k++){bkl[i][j][k]=0.0;l=0;for(;l<=5;l++){bkl[i][j][k]=bkl[i][j][k]+ekk[i][j][l]*tt[i][k][l];}}}j=0;for(;j<=5;j++){fe[i][j]=0.0;k=0;for(;k<=5;k++){fe[i][j]=fe[i][j]+bkl[i][j][k]*xx[k]; }}j=0;for(;j<=5;j++){fe[i][j]=fe[i][j]-p1[i][j];}}}void gauss(float (*a)[12],float *b,int n) {int i,i1,j,m;i=0;for(;i<=n-1;i++){i1=i+1;for(j=i1;j<=n-1;j++)a[i][j]=a[i][j]/a[i][i];b[i]=b[i]/a[i][i];a[i][i]=1.0;for(j=i1;j<=n-1;j++){for(m=i1;m<=n-1;m++)a[j][m]=a[j][m]-a[j][i]*a[i][m];b[j]=b[j]-a[j][i]*b[i];}}i=n-2;for(;i>=0;i--){j=i+1;for(;j<=n-1;j++){b[i]=b[i]-a[i][j]*b[j];}}}程序输出:nn ne nd nfix e4 3 12 6 200000000.000000element node1 node2 area fint1 12 0.007630 0.0001582 3 1 0.007630 0.0001583 24 0.007630 0.000158node x-coord y-coord1 0.000000 5.0000002 6.400000 5.0000003 0.000000 0.0000004 9.600000 0.000000ifix=7 8 9 10 11 121 1 1 238437.500000 238437.5000001 12 0.000000 0.0000001 1 3 0.000000 0.0000001 1 4 -238437.500000 -238437.5000001 1 5 0.000000 0.0000001 1 6 0.000000 0.0000001 2 1 0.000000 0.0000001 2 2 1442.871094 1442.8710941 2 3 4617.187500 4617.1875001 2 4 0.000000 0.0000001 2 5 -1442.871094 -1442.8710941 2 6 4617.187500 4617.1875001 3 1 0.000000 0.0000001 32 4617.187500 4617.1875001 3 3 19700.000000 19700.0000001 3 4 0.000000 0.0000001 3 5 -4617.187500 -4617.1875001 3 6 9850.000000 9850.0000001 4 1 -238437.500000 -238437.5000001 42 0.000000 0.0000001 4 3 0.000000 0.0000001 4 4 238437.500000 238437.5000001 4 5 0.000000 0.0000001 4 6 0.000000 0.0000001 5 1 0.000000 0.0000001 52 -1442.871094 -1442.8710941 5 3 -4617.187500 -4617.1875001 5 4 0.000000 0.0000001 5 5 1442.871094 1442.8710941 5 6 -4617.187500 -4617.1875001 6 1 0.000000 0.0000001 62 4617.187500 4617.1875001 6 3 9850.000000 9850.0000001 6 4 0.000000 0.0000001 6 5 -4617.187500 -4617.1875001 6 6 19700.000000 19700.000000i,ii,j,ek,tt=1 1 1 238437.500000 1.000000 i,ii,j,ek,tt=1 2 1 0.000000 0.000000i,ii,j,ek,tt=1 3 1 0.000000 0.000000i,ii,j,ek,tt=1 4 1 -238437.500000 0.000000 i,ii,j,ek,tt=1 5 1 0.000000 0.000000i,ii,j,ek,tt=1 6 1 0.000000 0.000000i,ii,j,ek,tt=1 1 2 0.000000 0.000000i,ii,j,ek,tt=1 2 2 1442.871094 1.000000i,ii,j,ek,tt=1 3 2 4617.187500 0.000000 i,ii,j,ek,tt=1 4 2 0.000000 0.000000i,ii,j,ek,tt=1 5 2 -1442.871094 0.000000 i,ii,j,ek,tt=1 6 2 4617.187500 0.000000 i,ii,j,ek,tt=1 1 3 0.000000 0.000000i,ii,j,ek,tt=1 2 3 4617.187500 0.000000 i,ii,j,ek,tt=1 3 3 19700.000000 1.000000 i,ii,j,ek,tt=1 4 3 0.000000 0.000000i,ii,j,ek,tt=1 5 3 -4617.187500 0.000000 i,ii,j,ek,tt=1 6 3 9850.000000 0.000000 i,ii,j,ek,tt=1 1 4 -238437.500000 0.000000 i,ii,j,ek,tt=1 2 4 0.000000 0.000000i,ii,j,ek,tt=1 3 4 0.000000 0.000000i,ii,j,ek,tt=1 4 4 238437.500000 1.000000 i,ii,j,ek,tt=1 5 4 0.000000 0.000000i,ii,j,ek,tt=1 6 4 0.000000 0.000000i,ii,j,ek,tt=1 1 5 0.000000 0.000000i,ii,j,ek,tt=1 2 5 -1442.871094 0.000000 i,ii,j,ek,tt=1 3 5 -4617.187500 0.000000 i,ii,j,ek,tt=1 4 5 0.000000 0.000000i,ii,j,ek,tt=1 5 5 1442.871094 1.000000 i,ii,j,ek,tt=1 6 5 -4617.187500 0.000000 i,ii,j,ek,tt=1 1 6 0.000000 0.000000i,ii,j,ek,tt=1 2 6 4617.187500 0.000000 i,ii,j,ek,tt=1 3 6 9850.000000 0.000000 i,ii,j,ek,tt=1 4 6 0.000000 0.000000i,ii,j,ek,tt=1 5 6 -4617.187500 0.000000 i,ii,j,ek,tt=1 6 6 19700.000000 1.000000 2 1 1 305200.000000 305200.0000002 1 2 0.000000 0.0000002 13 0.000000 0.0000002 1 4 -305200.000000 -305200.0000002 1 5 0.000000 0.0000002 1 6 0.000000 0.0000002 2 1 0.000000 0.0000002 2 2 3025.919922 3025.9199222 23 7564.800293 7564.8002932 2 4 0.000000 0.0000002 2 5 -3025.919922 -3025.9199222 2 6 7564.800293 7564.8002932 3 1 0.000000 0.0000002 3 2 7564.800293 7564.8002932 3 3 25216.001953 25216.0019532 3 4 0.000000 0.0000002 3 5 -7564.800293 -7564.8002932 3 6 12608.000977 12608.0009772 4 1 -305200.000000 -305200.0000002 4 2 0.000000 0.0000002 43 0.000000 0.0000002 4 4 305200.000000 305200.0000002 4 5 0.000000 0.0000002 4 6 0.000000 0.0000002 5 1 0.000000 0.0000002 5 2 -3025.919922 -3025.9199222 53 -7564.800293 -7564.8002932 5 4 0.000000 0.0000002 5 5 3025.919922 3025.9199222 5 6 -7564.800293 -7564.8002932 6 1 0.000000 0.0000002 6 2 7564.800293 7564.8002932 63 12608.000977 12608.0009772 6 4 0.000000 0.0000002 6 5 -7564.800293 -7564.8002932 6 6 25216.001953 25216.001953i,ii,j,ek,tt=2 1 1 3025.919922 0.000000 i,ii,j,ek,tt=2 2 1 0.000000 1.000000i,ii,j,ek,tt=2 3 1 -7564.800293 0.000000 i,ii,j,ek,tt=2 4 1 -3025.919922 0.000000 i,ii,j,ek,tt=2 5 1 0.000000 0.000000i,ii,j,ek,tt=2 6 1 -7564.800293 0.000000 i,ii,j,ek,tt=2 1 2 0.000000 -1.000000i,ii,j,ek,tt=2 2 2 305200.000000 0.000000 i,ii,j,ek,tt=2 3 2 0.000000 0.000000i,ii,j,ek,tt=2 4 2 0.000000 0.000000i,ii,j,ek,tt=2 5 2 -305200.000000 0.000000 i,ii,j,ek,tt=2 6 2 0.000000 0.000000i,ii,j,ek,tt=2 1 3 -7564.800293 0.000000 i,ii,j,ek,tt=2 2 3 0.000000 0.000000i,ii,j,ek,tt=2 3 3 25216.001953 1.000000 i,ii,j,ek,tt=2 4 3 7564.800293 0.000000 i,ii,j,ek,tt=2 5 3 0.000000 0.000000i,ii,j,ek,tt=2 6 3 12608.000977 0.000000 i,ii,j,ek,tt=2 1 4 -3025.919922 0.000000 i,ii,j,ek,tt=2 2 4 0.000000 0.000000i,ii,j,ek,tt=2 3 4 7564.800293 0.000000 i,ii,j,ek,tt=2 4 4 3025.919922 0.000000 i,ii,j,ek,tt=2 5 4 0.000000 1.000000i,ii,j,ek,tt=2 6 4 7564.800293 0.000000i,ii,j,ek,tt=2 1 5 0.000000 0.000000i,ii,j,ek,tt=2 2 5 -305200.000000 0.000000 i,ii,j,ek,tt=2 3 5 0.000000 0.000000i,ii,j,ek,tt=2 4 5 0.000000 -1.000000i,ii,j,ek,tt=2 5 5 305200.000000 0.000000 i,ii,j,ek,tt=2 6 5 0.000000 0.000000i,ii,j,ek,tt=2 1 6 -7564.800293 0.000000 i,ii,j,ek,tt=2 2 6 0.000000 0.000000i,ii,j,ek,tt=2 3 6 12608.000977 0.000000 i,ii,j,ek,tt=2 4 6 7564.800293 0.000000 i,ii,j,ek,tt=2 5 6 0.000000 0.000000i,ii,j,ek,tt=2 6 6 25216.001953 1.000000 3 1 1 257061.218750 257061.2187503 1 2 0.000000 0.0000003 1 3 0.000000 0.0000003 14 -257061.218750 -257061.2187503 1 5 0.000000 0.0000003 1 6 0.000000 0.0000003 2 1 0.000000 0.0000003 2 2 1808.063232 1808.0632323 2 3 5366.628906 5366.6289063 24 0.000000 0.0000003 2 5 -1808.063232 -1808.0632323 2 6 5366.628906 5366.6289063 3 1 0.000000 0.0000003 3 2 5366.628906 5366.6289063 3 3 21238.716797 21238.7167973 34 0.000000 0.0000003 3 5 -5366.628906 -5366.6289063 3 6 10619.358398 10619.3583983 4 1 -257061.218750 -257061.2187503 4 2 0.000000 0.0000003 4 3 0.000000 0.0000003 4 4 257061.218750 257061.2187503 4 5 0.000000 0.0000003 4 6 0.000000 0.0000003 5 1 0.000000 0.0000003 5 2 -1808.063232 -1808.0632323 5 3 -5366.628906 -5366.6289063 54 0.000000 0.0000003 5 5 1808.063232 1808.0632323 5 6 -5366.628906 -5366.6289063 6 1 0.000000 0.0000003 6 2 5366.628906 5366.6289063 6 3 10619.358398 10619.3583983 64 0.000000 0.0000003 6 5 -5366.628906 -5366.6289063 6 6 21238.716797 21238.716797i,ii,j,ek,tt=3 1 1 75979.257813 0.539054 i,ii,j,ek,tt=3 2 1 -115892.476563 -0.842271 i,ii,j,ek,tt=3 3 1 4520.158203 0.000000i,ii,j,ek,tt=3 4 1 -75979.257813 0.000000 i,ii,j,ek,tt=3 5 1 115892.476563 0.000000 i,ii,j,ek,tt=3 6 1 4520.158203 0.000000i,ii,j,ek,tt=3 1 2 -115892.476563 0.842271 i,ii,j,ek,tt=3 2 2 182890.046875 0.539054 i,ii,j,ek,tt=3 3 2 2892.901367 0.000000i,ii,j,ek,tt=3 4 2 115892.476563 0.000000 i,ii,j,ek,tt=3 5 2 -182890.046875 0.000000 i,ii,j,ek,tt=3 6 2 2892.901367 0.000000i,ii,j,ek,tt=3 1 3 4520.158203 0.000000i,ii,j,ek,tt=3 2 3 2892.901367 0.000000i,ii,j,ek,tt=3 3 3 21238.716797 1.000000 i,ii,j,ek,tt=3 4 3 -4520.158203 0.000000 i,ii,j,ek,tt=3 5 3 -2892.901367 0.000000 i,ii,j,ek,tt=3 6 3 10619.358398 0.000000 i,ii,j,ek,tt=3 1 4 -75979.257813 0.000000 i,ii,j,ek,tt=3 2 4 115892.476563 0.000000 i,ii,j,ek,tt=3 3 4 -4520.158203 0.000000 i,ii,j,ek,tt=3 4 4 75979.257813 0.539054 i,ii,j,ek,tt=3 5 4 -115892.476563 -0.842271 i,ii,j,ek,tt=3 6 4 -4520.158203 0.000000 i,ii,j,ek,tt=3 1 5 115892.476563 0.000000 i,ii,j,ek,tt=3 2 5 -182890.046875 0.000000 i,ii,j,ek,tt=3 3 5 -2892.901367 0.000000 i,ii,j,ek,tt=3 4 5 -115892.476563 0.842271 i,ii,j,ek,tt=3 5 5 182890.046875 0.539054 i,ii,j,ek,tt=3 6 5 -2892.901367 0.000000 i,ii,j,ek,tt=3 1 6 4520.158203 0.000000i,ii,j,ek,tt=3 2 6 2892.901367 0.000000i,ii,j,ek,tt=3 3 6 10619.358398 0.000000 i,ii,j,ek,tt=3 4 6 -4520.158203 0.000000 i,ii,j,ek,tt=3 5 6 -2892.901367 0.000000 i,ii,j,ek,tt=3 6 6 21238.716797 1.000000 nodal forces from applied loadsode x-load y-load moment1 0.000000 -192.000000 -204.8000032 0.000000 -192.000000 204.8000033 0.000000 0.000000 0.0000004 0.000000 0.000000 0.000000 i,j,gk1 1 1 241463.421875i,j,gk1 1 2 0.000000i,j,gk1 1 3 7564.800293i,j,gk1 1 4 -238437.500000i,j,gk1 1 5 0.000000i,j,gk1 1 6 0.000000i,j,gk1 1 7 -3025.919922i,j,gk1 1 8 0.000000i,j,gk1 1 9 7564.800293i,j,gk1 1 10 0.000000i,j,gk1 1 11 0.000000i,j,gk1 1 12 0.000000i,j,gk1 2 1 0.000000i,j,gk1 2 2 306642.875000i,j,gk1 2 3 4617.187500i,j,gk1 2 4 0.000000i,j,gk1 2 5 -1442.871094i,j,gk1 2 6 4617.187500i,j,gk1 2 7 0.000000i,j,gk1 2 8 -305200.000000i,j,gk1 2 9 0.000000i,j,gk1 2 10 0.000000i,j,gk1 2 11 0.000000i,j,gk1 2 12 0.000000i,j,gk1 3 1 7564.800293i,j,gk1 3 2 4617.187500i,j,gk1 3 3 44916.000000i,j,gk1 3 4 0.000000i,j,gk1 3 5 -4617.187500i,j,gk1 3 6 9850.000000i,j,gk1 3 7 -7564.800293i,j,gk1 3 8 0.000000i,j,gk1 3 9 12608.000977i,j,gk1 3 10 0.000000i,j,gk1 3 11 0.000000i,j,gk1 3 12 0.000000i,j,gk1 4 1 -238437.500000i,j,gk1 4 2 0.000000i,j,gk1 4 3 0.000000i,j,gk1 4 4 314416.750000i,j,gk1 4 5 -115892.476563i,j,gk1 4 6 4520.158203i,j,gk1 4 8 0.000000i,j,gk1 4 9 0.000000i,j,gk1 4 10 -75979.257813 i,j,gk1 4 11 115892.476563 i,j,gk1 4 12 4520.158203 i,j,gk1 5 1 0.000000i,j,gk1 5 2 -1442.871094 i,j,gk1 5 3 -4617.187500 i,j,gk1 5 4 -115892.476563 i,j,gk1 5 5 184332.921875 i,j,gk1 5 6 -1724.286133 i,j,gk1 5 7 0.000000i,j,gk1 5 8 0.000000i,j,gk1 5 9 0.000000i,j,gk1 5 10 115892.476563 i,j,gk1 5 11 -182890.046875 i,j,gk1 5 12 2892.901367 i,j,gk1 6 1 0.000000i,j,gk1 6 2 4617.187500i,j,gk1 6 3 9850.000000i,j,gk1 6 4 4520.158203i,j,gk1 6 5 -1724.286133 i,j,gk1 6 6 40938.718750 i,j,gk1 6 7 0.000000i,j,gk1 6 8 0.000000i,j,gk1 6 9 0.000000i,j,gk1 6 10 -4520.158203 i,j,gk1 6 11 -2892.901367 i,j,gk1 6 12 10619.358398 i,j,gk1 7 1 -3025.919922 i,j,gk1 7 2 0.000000i,j,gk1 7 3 -7564.800293 i,j,gk1 7 4 0.000000i,j,gk1 7 5 0.000000i,j,gk1 7 6 0.000000i,j,gk1 7 7 3025.919922i,j,gk1 7 8 0.000000i,j,gk1 7 9 -7564.800293 i,j,gk1 7 10 0.000000i,j,gk1 7 11 0.000000i,j,gk1 7 12 0.000000i,j,gk1 8 1 0.000000i,j,gk1 8 2 -305200.000000i,j,gk1 8 4 0.000000i,j,gk1 8 5 0.000000i,j,gk1 8 6 0.000000i,j,gk1 8 7 0.000000i,j,gk1 8 8 305200.000000 i,j,gk1 8 9 0.000000i,j,gk1 8 10 0.000000i,j,gk1 8 11 0.000000i,j,gk1 8 12 0.000000i,j,gk1 9 1 7564.800293i,j,gk1 9 2 0.000000i,j,gk1 9 3 12608.000977i,j,gk1 9 4 0.000000i,j,gk1 9 5 0.000000i,j,gk1 9 6 0.000000i,j,gk1 9 7 -7564.800293i,j,gk1 9 8 0.000000i,j,gk1 9 9 25216.001953i,j,gk1 9 10 0.000000i,j,gk1 9 11 0.000000i,j,gk1 9 12 0.000000i,j,gk1 10 1 0.000000i,j,gk1 10 2 0.000000i,j,gk1 10 3 0.000000i,j,gk1 10 4 -75979.257813 i,j,gk1 10 5 115892.476563 i,j,gk1 10 6 -4520.158203 i,j,gk1 10 7 0.000000i,j,gk1 10 8 0.000000i,j,gk1 10 9 0.000000i,j,gk1 10 10 75979.257813 i,j,gk1 10 11 -115892.476563 i,j,gk1 10 12 -4520.158203 i,j,gk1 11 1 0.000000i,j,gk1 11 2 0.000000i,j,gk1 11 3 0.000000i,j,gk1 11 4 115892.476563 i,j,gk1 11 5 -182890.046875 i,j,gk1 11 6 -2892.901367 i,j,gk1 11 7 0.000000i,j,gk1 11 8 0.000000i,j,gk1 11 9 0.000000i,j,gk1 11 10 -115892.476563i,j,gk1 11 11 182890.046875i,j,gk1 11 12 -2892.901367i,j,gk1 12 1 0.000000i,j,gk1 12 2 0.000000i,j,gk1 12 3 0.000000i,j,gk1 12 4 4520.158203i,j,gk1 12 5 2892.901367i,j,gk1 12 6 10619.358398i,j,gk1 12 7 0.000000i,j,gk1 12 8 0.000000i,j,gk1 12 9 0.000000i,j,gk1 12 10 -4520.158203i,j,gk1 12 11 -2892.901367i,j,gk1 12 12 21238.716797node x-disp y-disp thita1 -0.020768 -0.000749 -0.0041792 -0.021164 -0.014385 0.0078233 -0.000000 -0.000000 0.0000004 0.000000 -0.000000 0.000000reaction nodal forces from the equationsnode x-load y-load moment1 0.249791 -191.991058 -204.7498172 0.253289 -191.827469 204.7061163 94.456879 228.500870 -209.7956244 -94.456657 155.499146 -54.196941element axi-f shear-q moment-m1 94.456924 228.500854 262.488831 -94.456924 155.499146 -28.8833622 228.500870 -94.456879 -209.795624 -228.500870 94.456879 -262.4888313 181.889847 -4.264181 28.883371 -181.889847 4.264181 -54.196941。
有限元方法编程范文

有限元方法编程范文有限元方法(Finite Element Method,简称FEM)是一种数值分析方法,用于求解连续介质的强度、振动、流体、热传导等问题。
它是一种将物理问题转化为代数方程组的方法,通过将解域(问题的空间范围)离散化为许多小单元,再对这些小单元进行处理,最终得到整个解域的近似解。
1.离散化:首先将解域进行离散化,将其分割为许多小单元,称为有限元单元。
这些单元可以是一维线段、二维三角形或四边形、三维四面体等形状。
通过适当的划分精度和方法,确定离散化的步长,使得在每个单元上的近似解足够接近精确解。
2.定义变量:根据问题的性质和假设,定义相应的物理量和变量。
例如,对于强度分析问题,可以定义位移、应力、应变等变量。
将这些变量表示为一个向量,并对其进行数值处理。
3.得到局部方程:根据物理方程和边界条件,利用数学方法得到每个单元上的局部方程。
这些局部方程可以表示为刚度矩阵和载荷向量的形式。
刚度矩阵描述了每个单元上的物理性质和相互作用关系。
4.组装全局方程:将所有单元上的局部方程组装成全局方程。
这需要将单元之间的连续性纳入考虑,以确保解域的连续性。
这样可以得到一个大规模的代数方程组,以求解未知变量。
5.施加边界条件:根据问题的边界条件,将其施加到全局方程中。
常见的边界条件有位移边界条件、力边界条件和自然边界条件等。
6.求解代数方程组:使用适当的数值求解方法,例如高斯消元法、迭代法或者直接法,对代数方程组进行求解。
由于求解的规模很大,可能需要采用优化算法和并行计算技术来提高效率。
7.后处理结果:将求解得到的数值结果转化为工程可分析的形式,例如绘制等值线、曲线或进行一些定量的计算。
这些结果可以用来评估结构的强度、振动特性等。
有限元方法的编程实现可以使用不同的编程语言和软件工具。
常用的编程语言包括C、C++、Fortran和Python等。
一些流行的软件包,如ANSYS和ABAQUS,提供了用户友好的界面和功能强大的求解器,可以方便地进行有限元分析。
c++面向对象的有限元程序设计

《C++面向对象的有限元程序设计》一、引言在计算机科学和工程中,有限元方法是一种数值分析技术,广泛应用于工程设计和科学研究领域。
C++作为一种流行的编程语言,在有限元程序设计中也扮演了重要角色。
本文将从深度和广度两个方面对C++面向对象的有限元程序设计进行全面评估,并撰写一篇有价值的文章,以帮助读者更全面、深刻地理解这一主题。
二、C++面向对象的有限元程序设计的基本概念1. 有限元方法的基本原理有限元方法是一种数值计算方法,用于求解偏微分方程和积分方程。
通过将求解区域分割为有限个单元,建立单元之间的联系,将连续的问题转化为离散的代数问题,从而得到数值解。
在有限元程序设计中,需要考虑如何有效地表示和处理单元、节点、边界条件等信息。
2. 面向对象的程序设计思想面向对象的程序设计思想强调将现实世界中的问题抽象成对象,通过封装、继承和多态等机制构建模块化、可复用的代码结构。
在C++中,类和对象是面向对象程序设计的核心概念,有限元程序设计可以通过抽象出单元、节点、网格等对象来实现。
三、深入探讨C++面向对象的有限元程序设计1. C++语言特性在有限元程序设计中的应用在C++语言中,有丰富的特性可以用于实现面向对象的有限元程序设计。
类的封装可以用于表示单元和节点对象的属性和行为,继承可以用于构建具体单元类型的层次结构,多态可以实现对不同单元类型的统一处理。
2. 优化设计思路下的C++面向对象有限元程序设计针对大规模的有限元计算,优化的设计思路是必不可少的。
C++中提供了丰富的性能优化手段,如模板元编程、内联函数、移动语义等,可以在面向对象的有限元程序设计中发挥重要作用。
四、总结和回顾在本文中,我们对C++面向对象的有限元程序设计进行了全面评估,并撰写了一篇有价值的文章。
通过深入探讨原理、语言特性和优化设计思路,帮助读者更全面地理解了这一主题。
从我的个人观点看,C++面向对象的有限元程序设计是一个值得深入研究的领域,它不仅涉及到程序设计技术,还涉及到数值计算和工程应用等多个领域的知识。
《有限元与程序设计》课程的实践和思考

中国科教创新导刊I 中国科教创新导刊2008N O .35C hi na Educa t i on I nnov at i on H er al d 科教研究自70年代有限元法诞生起,由于能够解决许多手工无法分析的复杂工程问题而得到了极大发展,限元法成功应用于机械、航天、建筑、水利工程等许多科学领域当中。
《有限元与程序设计》是三峡大学为水利水电工程专业的本科生开设的一门重要的选修课程。
课程性质为公共选修课,学时32。
虽然是选修课,但开设这门课的意义重大。
这主要表现在以下几个方面。
(1)实现水利工程领域的计算技术的现代化是时代发展的必然趋势,不学习有限元法,不掌握先进的结构程序设计方法,今后很难胜任工作。
利用专门的有限元分析软件,可使设计工作中的大量的繁重的计算由电脑完成,实现设计工作自动化。
(2)有利于巩固和深化算法语言课程,有利于提高学生的计算机应用和程序编程能力。
(3)毕业设计阶段有的课题要用到有限元法,如果在之前选修了就会带来很大的方便。
有限元法还是攻读硕士后进一步深化的主干课程,做数值计算方向的研究生,几乎都要采用有限元方法。
因此,本科阶段对有限元进行初步学习并掌握有限元的基本概念,培养初步的编程能力就显得极为必要和十分迫切。
1使用教材和软件结合本科生的特点,并且照顾一些领悟能力以及动手能力略差的学生,因此,决定了课程目的是培养学生有限元的基本知识及思路,并初步掌握一门大型有限元软件的操作。
课程内容包括:学习有限元的基本原理、公式、上机学习本专业大型有限元软件。
考核方式为平时考勤及作业占30%,期末采取闭卷或上机大作业的形式,占70%。
有限元原理部分的教材采用《工程中的有限元方法》第三版,是翻译的美国的经典教程材。
该书将复杂的原理和公式写得通俗易懂,适应本科生阅读,因此可以满足教学要求。
有限元上机用软件采用ANSYS 教育版,这是ANSY S 公司对各个高校有限元法教学推出的教学软件,清华大学的有限元课程就采用了该软件。
有限元编程的c++实现算例

有限元编程的c++实现算例1. #include<>2. #include<>3.4.5. #define ne 3 #define nj 4 #define nz6 #define npj 0 #define npf1 #define nj3 12 #define dd6 #define e0 #definea0 #define i0 #define pi16.17.18. int jm[ne+1][3]={{0,0,0},{0,1,2},{0,2,3},{0,4,3}}; /*gghjghg*/19. double gc[ne+1]={,,,};20. double gj[ne+1]={,,,};21. double mj[ne+1]={,a0,a0,a0};22. double gx[ne+1]={,i0,i0,i0};23. int zc[nz+1]={0,1,2,3,10,11,12};24. double pj[npj+1][3]={{,,}};25. double pf[npf+1][5]={{0,0,0,0,0},{0,-20,,,}};26. double kz[nj3+1][dd+1],p[nj3+1];27. double pe[7],f[7],f0[7],t[7][7];28. double ke[7][7],kd[7][7];29.30.31.36. void jdugd(int);38. void zb(int);39. void gdnl(int);40. void dugd(int);41.42.43. void main()46. int i,j,k,e,dh,h,ii,jj,hz,al,bl,m,l,dl,zl,z,j0;47. double cl,wy[7];48. int im,in,jn;49.50.54. if(npj>0)55. {56. for(i=1;i<=npj;i++)57. { j=pj[i][2];59. p[j]=pj[i][1];60. }61. }62. if(npf>0)63. {64. for(i=1;i<=npf;i++)65. { hz=i;67. gdnl(hz);68. e=(int)pf[hz][3];69. zb(e); for(j=1;j<=6;j++) {72. pe[j]=;73. for(k=1;k<=6;k++) {75. pe[j]=pe[j]-t[k][j]*f0[k];76. }77. }78. al=jm[e][1];79. bl=jm[e][2];80. p[3*al-2]=p[3*al-2]+pe[1]; p[3*al-1]=p[3*al-1]+pe[2];82. p[3*al]=p[3*al]+pe[3];83. p[3*bl-2]=p[3*bl-2]+pe[4];84. p[3*bl-1]=p[3*bl-1]+pe[5];85. p[3*bl]=p[3*bl]+pe[6];86. }87. }89.90. for(e=1;e<=ne;e++) {94. dugd(e); for(i=1;i<=2;i++) {97. for(ii=1;ii<=3;ii++)98. {99. h=3*(i-1)+ii; dh=3*(jm[e][i]-1)+ii; for(j=1;j<=2 ;j++)102. {103. for(jj=1;jj<=3;jj++) {105. l=3*(j-1)+jj; zl=3*(jm[e][j]-1)+jj; dl=zl-dh+ 1; if(dl>0)109. kz[dh][dl]=kz[dh][dl]+ke[h][l]; }111. }112. }113. }114. }115.116. for(i=1;i<=nz;i++) {119. z=zc[i]; kz[z][l]=; for(j=2;j<=dd;j++)122. {123. kz[z][j]=; }125. if((z!=1))126. {127. if(z>dd)128. j0=dd;129. else if(z<=dd)130. j0=z; for(j=2;j<=j0;j++)132. kz[z-j+1][j]=;133. }134. p[z]=; }136.137.138.140. for(k=1;k<=nj3-1;k++)141. {142. if(nj3>k+dd-1) im=k+dd-1;144. else if(nj3<=k+dd-1)145. im=nj3;146. in=k+1;147. for(i=in;i<=im;i++)148. {149. l=i-k+1;150. cl=kz[k][l]/kz[k][1]; jn=dd-l+1;152. for(j=1;j<=jn;j++)153. {154. m=j+i-k;155. kz[i][j]=kz[i][j]-cl*kz[k][m];156. }157. p[i]=p[i]-cl*p[k]; }159. }160.161.162.163.164. p[nj3]=p[nj3]/kz[nj3][1]; for(i=nj3-1;i>=1;i--)166. {167. if(dd>nj3-i+1)168. j0=nj3-i+1;169. else j0=dd; for(j=2;j<=j0;j++)171. {172. h=j+i-1;173. p[i]=p[i]-kz[i][j]*p[h];174. }175. p[i]=p[i]/kz[i][1]; }177. printf("\n");178. printf("_____________________________________________________________\n");179. printf("NJ U V CETA \n"); for(i=1;i<=nj;i++)181. {182. printf(" %-5d % % %\n",i,p[3*i-2],p[3*i-1],p[3*i]);183. }184. printf("_____________________________________________________________\n");185. printf("E N Q M \n");187. for(e=1;e<=ne;e++) {190. jdugd(e); zb(e); for(i=1;i<=2;i++) 193. {194. for(ii=1;ii<=3;ii++)195. {196. h=3*(i-1)+ii;197. dh=3*(jm[e][i]-1)+ii; wy[h]=p[dh];199. }200. }201. for(i=1;i<=6;i++)202. {203. f[i]=;204. for(j=1;j<=6;j++)205. {206. for(k=1;k<=6;k++) {208. f[i]=f[i]+kd[i][j]*t[j][k]*wy[k];209. }210. }211. }212. if(npf>0)213. {214. for(i=1;i<=npf;i++) if(pf[i][3]==e) {217. hz=i;218. gdnl(hz); for(j=1;j<=6;j++) {221. f[j]=f[j]+f0[j];222. }223. }224. }225. printf("%-3d(A) % % %\n",e,f[1],f[2],f[3]); printf(" (B) % % %\n",f[4],f[5],f[6]); }228. return;229. }230.232.236. void gdnl(int hz)237. {238. int ind,e;239. double g,c,l0,d;240.241.242. g=pf[hz][1]; c=pf[hz][2]; e=(int)pf[hz][3];ind=(int)pf[hz][4]; l0=gc[e]; d=l0-c;248. if(ind==1)249. {250. f0[1]=;251. f0[2]=-(g*c*(2-2*c*c/(l0*l0)+(c*c*c)/(l0*l0*l0)))/2; f0[3]=-(g*c*c)*(6-8*c/l0+3*c*c/(l0 *l0))/12;253. f0[4]=;254. f0[5]=-g*c-f0[2];255. f0[6]=(g*c*c*c)*(4-3*c/l0)/(12*l0);256. }257. else258. {259. if(ind==2) {261. f0[1]=;262. f0[2]=(-(g*d*d)*(l0+2*c))/(l0*l0*l0);263. f0[3]=-(g*c*d*d)/(l0*l0);264. f0[4]=;265. f0[5]=(-g*c*c*(l0+2*d))/(l0*l0*l0);266. f0[6]=(g*c*c*d)/(l0*l0);267. }268. else270. f0[1]=-(g*d/l0); f0[2]=;272. f0[3]=;273. f0[4]=-g*c/l0;274. f0[5]=;275. f0[6]=;276. }277. }278. }279.280. void zb(int e)284. {285. double ceta,co,si;286. int i,j;287. ceta=(gj[e]*pi)/180; co=cos(ceta); 289. si=sin(ceta);290. t[1][1]=co; t[1][2]=si;292. t[2][1]=-si;293. t[2][2]=co;294. t[3][3]=;295. for(i=1;i<=3;i++)296. {297. for(j=1;j<=3;j++) {299. t[i+3][j+3]=t[i][j];300. }301. }302. }303.304.305.306. void jdugd(int e)310. {311. double A0,l0,j0;312. int i;314.315.316. A0=mj[e]; l0=gc[e]; j0=gx[e];320.321. for(i=0;i<=6;i++)322. for(j=0;j<=6;j++) kd[i][j]=;324.325. kd[1][1]=e0*A0/l0;326. kd[2][2]=12*e0*j0/pow(l0,3);327. kd[3][2]=6*e0*j0/pow(l0,2);328. kd[3][3]=4*e0*j0/l0;329. kd[4][1]=-kd[1][1];330. kd[4][4]=kd[1][1];331. kd[5][2]=-kd[2][2]; kd[5][3]=-kd[3][2];333. kd[5][5]=kd[2][2];334. kd[6][2]=kd[3][2];335. kd[6][3]=2*e0*j0/l0;336. kd[6][5]=-kd[3][2];337. kd[6][6]=kd[3][3];338.339. for(i=1;i<=6;i++)340. for(j=1;j<=i;j++) kd[j][i]=kd[i][j];342. }343.344.345. void dugd(int e)349. {350. int i,k,j,m;351. jdugd(e); zb(e); for(i=1;i<=6;i++)354. {355. for(j=1;j<=6;j++)356. {357. ke[i][j]=;358. for(k=1;k<=6;k++)359. {360. for(m=1;m<=6;m++)361. {362. ke[i][j]=ke[i][j]+t[k][i]*kd[k][m]*t[m][j]; } 364. }365. }366. }367. }368.369.370.372.373.374. </></>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于有限元算法的编程实践学号:2011043010031姓名:廖校毅电子科技大学物理电子学院【摘要】本文就有限元算法在电磁场分析中的应用展开研究与实践,从电磁场的Maxwell方程出发,根据电磁场的边值问题及变分公式建立了有限元方程组。
具体在实践中,将这些知识运用到C++语言和Matlab中,并将这两种语言有机结合,编程并实现二维FEM。
程序最后通过计算含两种介质的电位槽电位分布来验证其正确性。
关键词: 有限元变分法C++ MatlabThe Programming Practice Based on The Finite Element Algorithm Student ID:2011043010031Name:Liao Xiaoyi University of Electronic Science and technology &School of PhysicalElectronicsAbstract In this paper, we take the application of finite element method in electromagnetic field analysis into research and practice. Starting from Maxwell equations of electromagnetic field, the electromagnetic field boundary value problems and variational formula established the finite element equations. In specific practice, this knowledge will be applied to the C++ language and Matlab, and the organic combination of two languages, programming and implementation of two-dimensional FEM. Finally, through the program to verify the validity of the calculation of potential distribution in channel potential containing two kinds of medium.Key words The finite element method The variational method C++ Matlab一、前言在数学中,有限元法(FEM,Finite Element Method)是一种为求得偏微分方程边值问题近似解的数值技术。
它通过变分方法[1],使得误差函数达到最小值并产生稳定解。
类比于连接多段微小直线逼近圆的思想,有限元法包含了一切可能的方法,这些方法将许多被称为有限元的小区域上的简单方程联系起来,并用其去估计更大区域上的复杂方程。
它将求解域看成是由许多称为有限元的小的互连子域组成,对每一单元假定一个合适的(较简单的)近似解,然后推导求解这个域总的满足条件(如结构的平衡条件),从而得到问题的解。
这个解不是准确解,而是近似解,因为实际问题被较简单的问题所代替。
由于大多数实际问题难以得到准确解,而有限元不仅计算精度高,而且能适应各种复杂形状,因而成为行之有效的工程分析手段。
因其理论依据的普遍性,作为一种声誉很高的数值分析方法,,已被普遍推广并成功地用来解决各种结构工程、热传导、渗流、流体力学、空气动力学、土壤力学、机械零件强度分析、电磁工程问题等,并且大量可靠的基于有限元算法的软件如ANSYS 被开发和使用。
有限元法有以下特点:一,离散化过程保持了明显的物理意义。
因为变分原理描述了支配物理现象的物理学中的最小作用原理(如力学中的最小势能原理、静电学中的汤姆逊定理等),基于问题固有的物理特性而予以离散化处理,列出计算公式,是保证方法的正确性、数值解的存在与稳定性等前提要素。
二,优异的解题能力。
与其他数值方法相比较,有限元法在适应场域边界几何形状及媒质物理性质变异情况的复杂问题求解上,有突出优点:不受几何形状和媒质分布的复杂程度限制;不同媒质分界面上的边界条件是自动满足的;不必单独处理第二、三类边界条件;离散点配置比较随意,通过控制有限单元剖分密度和单元插值函数的选取,可以充分保证所需的数值计算精度。
二、 算法原理2.1 变分基本原理: 对于一般的问题,可以给出下列对应于一个自变量x 的简单形式的泛函21[](,,')x x J y F x y y dx =⎰函数y 稍有变化时:21[](,,'')x x J y y F x y y y y dx δδδ+=++⎰21[][][(,,)(,,)]d x x J J y y J y F x y y y y F x y y xδδδ∆=+-'''=++-⎰上式用多元函数的泰勒公式加以展开:2222222231{[][()2d 2()]}FF F F y y y y y yJ xFy y y y y y J J J Jδδδδδδδδδδ∂∂∂'++'∂∂∂∆=∂∂''+++''∂∂∂=+++≈⎰称为泛函的一阶变分。
泛函同一般函数的极值特性相似,泛函的取极值的条件是泛函的一阶变分为零,泛函值为拐点的条件是二阶变分为零。
所以,根据一阶变分为零,有下式成立:2211-0'[](,,')0'x x x x F d F y dx y J y F x y y dx F e h y ⎧⎛⎫∂∂=⎪ ⎪∂∂⎝⎭⎪=⇔⎨⎡⎤∂⎪=⎢⎥⎪∂⎣⎦⎩⎰2.2 有限元算法基本原理[2]:2.2.1 有限元网格划分的基本原则鉴于实际应用中三角形的网格剖分方式比较常见,下面以三角形网格剖分为例,介绍有限元网格划分基本原则:1.不同媒质的分界线,不容许跨越分界线的三角元2.三角元的边逼近边界3.三角形要求不要太尖或太钝4.顶点编号相差不能太悬殊,对多区域的编号,按区域连续编号,5.三角形节点编号按逆时针顺序编号图 2 网格划分示意图J δ2.2.1 有限元分片差值取任意一个网格如图,在有限单元(三角形)上进行分片线性插值,基函数为:123(,)e x y x y ϕααα=++123123123i i ij j j m m mx y x y x y ϕαααϕαααϕααα⎧=++⎪=++⎨⎪=++⎩由线性代数知识从而有:()()()123/2/2/2i i j j m m i i j j m m i i j j m m a a a b b b c c c αϕϕϕαϕϕϕαϕϕϕ⎧=++∆⎪⎪=++∆⎨⎪=++∆⎪⎩ 其中()12i j m m ji j m i m ji j j i a x y x y b y y c x x b c b c =-=-=-∆=- 把 代入三角元上的线性插值函数,[],,1(,)()2()() =(,)e i i i i j j j j m m m m e s s i j mx y a b x c y a b x c y a b x c y N x y ϕϕϕϕϕ=++∆++++++∑1(,)() 2 (,,)e s s s s N x y a b x c y s i j m =++∆=其中: {}{}(,), , i e e e e i j m j e e m x y N N N N ϕϕϕϕϕ⎡⎤⎢⎥⎡⎤==⎢⎥⎣⎦⎢⎥⎣⎦下面进行单元的泛函分析[][]222ee e e e D J J dxdy x y εϕϕϕϕ⎡⎤⎛⎫⎛⎫∂∂≈=+⎢⎥ ⎪ ⎪∂∂⎢⎥⎝⎭⎝⎭⎣⎦⎰⎰()2/2ei i j j m m b b b xϕαϕϕϕ∂==++∆∂()224ee i i j j m m D dxdy b b b x ϕεεϕϕϕ⎛⎫∂=++ ⎪∂∆⎝⎭⎰⎰{}{}{}{}1 ,, 4 i i i j i m i T i j m j i j j j m j e e e m i m j m m m bb bb bb b b b b b b K b b b b b b ϕεϕϕϕϕϕϕϕ⎧⎫⎧⎫⎪⎪⎪⎪=⎨⎬⎨⎬∆⎪⎪⎪⎪⎩⎭⎩⎭= {}1 4 i i i j i m j i j j j m e m i m j m m b b b b b b where K b b b b b b b b b b b b ε⎧⎫⎪⎪=⎨⎬∆⎪⎪⎩⎭ 同理:{}{}{}22e e Te e e D dxdy K y ϕεϕϕ⎛⎫∂= ⎪∂⎝⎭⎰⎰ {}2 4 i i i j i m j i j j j m em i m j m m c c c c c c where K c c c c c c c c c c c c ε⎧⎫⎪⎪=⎨⎬∆⎪⎪⎩⎭单元上总的泛函:[]222ee e eD J dxdyx y εϕϕϕ⎡⎤⎛⎫⎛⎫∂∂=+⎢⎥ ⎪⎪∂∂⎢⎥⎝⎭⎝⎭⎣⎦⎰⎰{}{}{}{}{}{}{}{}{}12112212T Te e e e e e Te e eK K K ϕϕϕϕϕϕ=+=图 2 插值示意图 123,,ααα{}{}{}12 e e ee e e ii ij im e e eji jj jm e e e mi mj mm K K K K K K K K K K K K =+⎧⎫⎪⎪⎪⎪=⎨⎬⎪⎪⎪⎪⎩⎭其中() 4e e rs sr r s r s where K K b b c c ε==+∆总体合成:改写扩充单位阵 到所有单位,即把扩充部分添零,为方便总体矩阵的处理。
[][]{}{}{}{}{}{}111212NNT e e e e TJ J K K ϕϕϕϕϕϕ==⎛⎫≈= ⎪⎝⎭=∑∑()1,1,2,Neij ij e where K K i j N ===∑变分问题被离散化的多元二次函数的极值问题:[](){}{}{}12,11,,,21min 2TN Nij i j i j J J K K ϕϕϕϕϕϕϕϕ=≈===∑ 根据函数极值理论:0 (1,2,,)iJi N ϕ∂==∂ 所以有下式成立:,10 (1,2,,)Nijji j K j N ϕ===∑{}{}{}0K ϕ=三、 仿真实现[4][5]3.1 仿真实例采用有限元法仿真并求解如图的含有介质体的静场电位分布。