亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fem2.cpp

?? 有限元傳熱算例
?? CPP
字號:


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int Gauss(double a[],double b[],int n);	//全選主元高斯消去法

/*double GaussIntegral(int n,int js[],	//計算多重積分的高斯方法		
			 double(*fn)(int n,double x[]),
			 void(*fnGaussLimit)(int j, int n,double x[],double y[]));  */

struct ETNode{							//單元結點結構體
	double x,y;							//單元結點坐標
	int number;							//單元結點在總體區域劃分中的編號
};

struct ElementTriangle{					//三角形單元結構體	
	ETNode nd[3];						//存儲相對應的總體結點號
	double	a[3],b[3],c[3];				//基函數的系數
	double	A;							//單元面積
	double	Aij[3][3];					//單元有限元特征式系數矩陣
	double	fi[3];						//單元上的積分值
};

//--------------  全局變量  ---------------------------
	int	i,j,k,							//循環指標
		id;								//單元的循環指標
	const int nx=21,ny=21;				//x,y方向劃分網格數,三角形單元個數=nx*ny*2
	const double Lx=1,Ly=1;				//矩形區域的兩邊長
	double	D;							//單元矩陣行列式值
	const int iNode=(nx+1)*(nx+1);		//結點個數
	double* pMatrix;					//總體矩陣指針
	double* pMf;						//f向量指針
	ElementTriangle* pE;				//單元三角形結構體數組指針
	double ai,bi,ci;					//基函數的系數
//-----------------------------------------------------

double fn(int n,double x[2])				//被積函數,高斯積分函數的參數
{
	return(ai+bi*x[0]+ci*x[1]);
}

/*
void fnGaussLimit(int jFlag,int n,			//積分上下限函數,高斯積分函數的參數
				  double x[],double y[2])
{											//矩形中第一個三角形單元積分上下限計算
	switch(jFlag)
	{
	case 0:{
		y[0]=(Lx/nx)*i;
		y[1]=(Lx/nx)*(i+1);
		
		break;
		   }
	case 1:{
		y[0]=(Ly/ny)*j+ x[0]-(Lx/nx)*i;
		y[1]=(Ly/ny)*(j+1);
		
		break;
		   }
	default:
		break;
	}
}

void fnGaussLimit2(int jFlag,int n,			//積分上下限函數,高斯積分函數的參數
				  double x[],double y[2])
{											//矩形中第二個三角形單元積分上下限計算
	switch(jFlag)
	{
	case 0:{
		y[0]=(Lx/nx)*i;
		y[1]=(Lx/nx)*(i+1);
		break;
		   }
	case 1:{
		y[0]=(Ly/ny)*j;
		y[1]=(Ly/ny)*j+ x[0]-(Lx/nx)*i;
		break;
		   }
	default:
		break;
	}
} 
*/ 

//--------------------  主程序  -------------------------
//有限元理論請參考章本照先生編著的<<流體力學中的有限元方法>>, PP.156-165
//機械工業出版社出版,1986

void main(void)
{
	//為總體矩陣,三角形單元數組,f函數向量分配存儲內存
	pMatrix=(double*)malloc(iNode*iNode*sizeof(double));
	pE=(ElementTriangle*)malloc(nx*ny*2*sizeof(ElementTriangle));
	pMf=(double*)malloc(iNode*sizeof(double));
	//初始化值為0,因為下面要累加總體矩陣
	for(i=0;i<iNode*iNode;i++)
		pMatrix[i]=0;
	for(i=0;i<iNode;i++)
		pMf[i]=0;

try{
	//------	計算得到網格的信息	-----------
	for(j=0;j<nx;j++)
	for(i=0;i<ny;i++)
	{	
		//for the first triangle in the rectangle
		pE[i*2+j*ny*2].nd[0].x=(Lx/nx)*i;			
		pE[i*2+j*ny*2].nd[0].y=(Ly/ny)*j;
		pE[i*2+j*ny*2].nd[0].number=i+j*(nx+1);			//NO.0
		pE[i*2+j*ny*2].nd[1].x=(Lx/nx)*(i+1);
		pE[i*2+j*ny*2].nd[1].y=(Ly/ny)*(j+1);
		pE[i*2+j*ny*2].nd[1].number=i+1+(nx+1)*(j+1);	//NO.1
		pE[i*2+j*ny*2].nd[2].x=(Lx/nx)*i;
		pE[i*2+j*ny*2].nd[2].y=(Ly/ny)*(j+1);
		pE[i*2+j*ny*2].nd[2].number=i+(nx+1)*(j+1);		//NO.2
		//for the second triangle in the rectangle
		pE[i*2+j*ny*2+1].nd[0].x=(Lx/nx)*i;	
		pE[i*2+j*ny*2+1].nd[0].y=(Ly/ny)*j;
		pE[i*2+j*ny*2+1].nd[0].number=i+j*(nx+1);		//NO.0
		pE[i*2+j*ny*2+1].nd[1].x=(Lx/nx)*(i+1);
		pE[i*2+j*ny*2+1].nd[1].y=(Ly/ny)*j;
		pE[i*2+j*ny*2+1].nd[1].number=i+j*(nx+1)+1;		//NO.1
		pE[i*2+j*ny*2+1].nd[2].x=(Lx/nx)*(i+1);
		pE[i*2+j*ny*2+1].nd[2].y=(Ly/ny)*(j+1);
		pE[i*2+j*ny*2+1].nd[2].number=i+1+(nx+1)*(j+1);	//NO.2
	}
	//---------------------------------------------------------
	//please turn to page 158 for more details
	printf("計算基函數系數值...\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*ny*2;i++)
	{	for(l=0;l<3;l++)				                   
			for(m=0;m<3;m++)                                     // Respaired
			{	
				pE[i].Aij[l][m]=( pE[i].b[l]*pE[i].b[m] + 
					pE[i].c[l]*pE[i].c[m] ) * pE[i].A;
			}
	}
//------------------------------------------------------------------------------------------

/*	for(i=0;i<nx;i++)					//計算單元有限元特征式系數矩陣
	for(j=0;j<ny;j++)
	{
		for(l=0;l<3;l++)				//for the first triangle in the rectangle
			for(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");

//---------------------------計算三角形單元f函數向量不用多重積分公式,直接代用單元三角形面積的三分之一  
	int idx=0;                                    
    for(i=0;i<2*nx*ny;i++)
	{   for(idx=0;idx<3;idx++)
	   { 
         pE[i].fi[idx]=(1.0/3.0)*(0.5)*(Lx/nx)*(Ly/ny);         // Respaired
	}
	}
 /*   printf("pE[0].fi[0]=%f\n",pE[0].fi[0]);
    printf("pE[0].fi[1]=%f\n",pE[0].fi[1]);
    printf("pE[0].fi[2]=%f\n",pE[0].fi[2]); */

//------------------------------------------------------------------------------------------

/*	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
			{
				ai=pE[i*2+j*ny*2].a[idx];
				bi=pE[i*2+j*ny*2].b[idx];
				ci=pE[i*2+j*ny*2].c[idx];
				pE[i*2+j*ny*2].fi[idx]=GaussIntegral(2,js,fn,fnGaussLimit);
			}
			for(idx=0;idx<3;idx++)		//for the second triangle in the rectangle
			{
				ai=pE[i*2+j*ny*2+1].a[idx];
				bi=pE[i*2+j*ny*2+1].b[idx];
				ci=pE[i*2+j*ny*2+1].c[idx];
				pE[i*2+j*ny*2+1].fi[idx]=GaussIntegral(2,js,fn,fnGaussLimit2);
			}
		}  */
	
		printf("OK!\n");

	//單元矩陣元素累加到總體矩陣相應的位置上
	printf("單元矩陣元素累加到總體矩陣相應的位置上...\n");
	for(idx=0;idx<nx*ny*2;idx++)		
		for(i=0;i<3;i++)
		{
			for(j=0;j<3;j++)
				pMatrix[pE[idx].nd[i].number*iNode+pE[idx ].nd[j].number] +=pE[idx].Aij[i][j];

			pMf[ pE[idx].nd[i].number ]+=pE[idx].fi[i];
		}
	printf("OK!\n");

	double dBig=pow(10,20);				//邊界條件對角線擴大法處理所用的大數
	double Ur=0.0;						//邊界條件1(邊界條件2通過Calerkin弱解表達式自動滿足)
	for(i=0;i<nx+1;i++)
	{	j=nx+1;
		pMatrix[(j*nx+i)*iNode+(j*nx+i)]*=dBig;
		pMf[(j*nx+i)]=pMatrix[(j*nx+i)*iNode+(j*nx+i)]*Ur;
	}
	for(j=0;j<nx+1;j++)
	{	i=(nx+1)*(j+1)-1;
		pMatrix[i*iNode+i]*=dBig;
		pMf[i]=pMatrix[i*iNode+i]*Ur;
	}

	printf("調用全選主元高斯消去法函數解方程組...\n");
	Gauss(pMatrix,pMf,iNode);			//調用全選主元高斯消去法函數解方程組
	printf("OK!\n");
	printf("寫計算結果數據到文件...\n");
	FILE *wfp;							//文件操作
	if((wfp=fopen("dat.txt","w+"))==NULL)
		printf("Cann't open the file... ");
	//fprintf(wfp,"計算得各結點上的溫度值為:\n");
	for(i=0;i<iNode;i++)
		fprintf(wfp,"%f\n", pMf[i]);
		//fprintf(wfp,"%d   %f\n",i+1,pMf[i]);
	printf("OK!\n");

	fclose(wfp);
}
catch(...)
{	
	printf("Error occured...\n");
}
	//釋放總體矩陣和三角形單元數組占用內存
	free(pMf);	free(pE);	free(pMatrix);				

	printf("Please press Enter to exit...");
	getchar();
}

//----------  全選主元高斯消去法  ------------------------------	
//	a 體積為n*n的雙精度實型二維數組,方程組系數矩陣,返回時將被破壞
//	b 長度為n的雙精度實型一維數組,方程組右端的常數向量,返回方程組的解向量
//	n 整型變量,方程組的階數
//--------------------------------------------------------------
int Gauss(double a[],double b[],int n)
{ 
	int *js,l,k,i,j,is,p,q;
    double d,t;
    js=(int*)malloc(n*sizeof(int));
    l=1;
    for(k=0;k<=n-2;k++)
	{
		d=0.0;
        for(i=k;i<=n-1;i++)
			for(j=k;j<=n-1;j++)
            {
				t=fabs(a[i*n+j]);
				if(t>d) { d=t; js[k]=j; is=i;}
            }
			if(d+1.0==1.0) l=0;
			else
			{
				if(js[k]!=k)
					for(i=0;i<=n-1;i++)
					{
						p=i*n+k; q=i*n+js[k];
						t=a[p]; a[p]=a[q]; a[q]=t;
					}
					if(is!=k)
					{
						for(j=k;j<=n-1;j++)
						{ 
							p=k*n+j; q=is*n+j;
							t=a[p]; a[p]=a[q]; a[q]=t;
						}
						t=b[k]; b[k]=b[is]; b[is]=t;
					}
			}
			if(l==0)
			{ 
				free(js); 
				printf("Gauss funtion failed 1...\n");
				return(0);
			}
			d=a[k*n+k];
			for(j=k+1;j<=n-1;j++)
			{ 
				p=k*n+j; a[p]=a[p]/d;
			}
			b[k]=b[k]/d;
			for(i=k+1;i<=n-1;i++)
			{
				for(j=k+1;j<=n-1;j++)
				{ 
					p=i*n+j;
					a[p]=a[p]-a[i*n+k]*a[k*n+j];
				}
				b[i]=b[i]-a[i*n+k]*b[k];
			}
	}
    d=a[(n-1)*n+n-1];
    if(fabs(d)+1.0==1.0)
	{
		free(js); 
		printf("Gauss funtion failed 2...\n");
        return(0);
	}
    b[n-1]=b[n-1]/d;
    for(i=n-2;i>=0;i--)
	{ 
		t=0.0;
		for(j=i+1;j<=n-1;j++)
			t=t+a[i*n+j]*b[j];
		b[i]=b[i]-t;
	}
    js[n-1]=n-1;
    for(k=n-1;k>=0;k--)
		if(js[k]!=k)
        { 
			t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;
		}
	free(js);
	return(1);
}

/*
//------------  計算多重積分的高斯方法  ------------------------
//	n 整型變量,積分重數
//	js 整型一維數組,長度為n,
//		其js(i) (i=0,1,...,n-1)表示第i層積分區間所劃分的子區間個數
//	fn() 被積函數(函數指針)
//	fnGaussLimit() 函數(函數指針)計算各層積分上下限值(上限>下限)
//--------------------------------------------------------------
double GaussIntegral(int n,int js[],double (*fn)(int n,double x[]),
		void (*fnGaussLimit)(int j,int n,double x[],double y[]))
{ 
    int m,j,k,q,*is;
    double y[2],p,s,*x,*a,*b;
    static double t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    static double c[5]={0.2369268851,0.4786286705,0.5688888889,0.4786286705,0.2369268851};
    is=(int*)malloc(2*(n+1)*sizeof(int));
    x=(double*)malloc(n*sizeof(double));
    a=(double*)malloc(2*(n+1)*sizeof(double));
    b=(double*)malloc((n+1)*sizeof(double));
    m=1;a[n]=1.0; a[2*n+1]=1.0;
    while(true)
    { 
		for(j=m;j<=n;j++)
        { 
			fnGaussLimit(j-1,n,x,y);
            a[j-1]=0.5*(y[1]-y[0])/js[j-1];
            b[j-1]=a[j-1]+y[0];
            x[j-1]=a[j-1]*t[0]+b[j-1];
            a[n+j]=0.0;	is[j-1]=1;	is[n+j]=1;
		}
        j=n; q=1;
        while(q==1)
		{ 
			k=is[j-1];
            if(j==n) p=fn(n,x);
            else p=1.0;
            a[n+j]=a[n+j+1]*a[j]*p*c[k-1]+a[n+j];
            is[j-1]=is[j-1]+1;
            if(is[j-1]>5)
            {
				if(is[n+j]>=js[j-1])
				{ 
					j=j-1; q=1;
					if(j==0)
					{ 
						s=a[n+1]*a[0];
						free(is); free(x);free(a); free(b);
						return(s);
					}
				}
				else
				{ 
					is[n+j]=is[n+j]+1;
					b[j-1]=b[j-1]+a[j-1]*2.0;
					is[j-1]=1; k=is[j-1];
					x[j-1]=a[j-1]*t[k-1]+b[j-1];
					if(j==n)
						q=1;
					else
						q=0;
				}
			}
			else
            { 
				k=is[j-1];
                x[j-1]=a[j-1]*t[k-1]+b[j-1];
                if(j==n) 
					q=1;
                else 
					q=0;
			}
		}
        m=j+1;
     }
	return 0;
}
//-------------------------------------------------------------*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区视频精品免费| 国产做a爰片久久毛片| 六月丁香婷婷久久| 色94色欧美sute亚洲线路一久| 欧美日本精品一区二区三区| 亚洲国产精品99久久久久久久久 | 精品国产免费人成在线观看| 中文字幕中文字幕在线一区| 免费精品视频在线| 欧美体内she精高潮| 国产精品国产三级国产aⅴ无密码| 麻豆成人久久精品二区三区红 | 国产经典欧美精品| 欧美精品丝袜久久久中文字幕| 国产精品乱子久久久久| 激情另类小说区图片区视频区| 欧美无砖专区一中文字| 亚洲欧洲无码一区二区三区| 国产一区 二区 三区一级| 日韩一区二区三区视频在线| 午夜在线成人av| 91黄色免费看| 亚洲免费观看高清完整版在线观看熊| 国产精品性做久久久久久| 欧美成人精精品一区二区频| 美日韩一区二区| 日韩亚洲国产中文字幕欧美| 视频一区在线视频| 这里只有精品电影| 日韩av中文字幕一区二区三区| 欧美伊人久久久久久久久影院| 综合色天天鬼久久鬼色| 成人天堂资源www在线| 欧美激情一区二区三区四区| 麻豆高清免费国产一区| 日韩精品中午字幕| 免费观看一级欧美片| 日韩一区二区在线观看| 蜜臀av一区二区三区| 日韩一级成人av| 激情综合五月婷婷| 精品久久久久久久久久久久久久久 | 日韩视频免费观看高清完整版 | 国产精品五月天| 国产成人在线观看免费网站| 日韩精品一区在线观看| 日本强好片久久久久久aaa| 日韩欧美成人午夜| 国产91在线观看丝袜| 国产精品久久久久精k8| 色综合久久久久久久久久久| 亚洲不卡av一区二区三区| 精品视频1区2区3区| 蜜桃免费网站一区二区三区| 久久久午夜电影| 不卡的电影网站| 亚洲福利一区二区| 日韩欧美精品在线视频| 国产69精品久久777的优势| 亚洲品质自拍视频网站| 91麻豆精品国产| 国产精品亚洲成人| 亚洲一区二区不卡免费| 精品久久久久久综合日本欧美 | 欧美亚洲综合久久| 久久机这里只有精品| 中文字幕一区在线观看视频| 日本道色综合久久| 久久成人免费网| 亚洲裸体在线观看| 欧美成人精品高清在线播放| av午夜精品一区二区三区| 天天av天天翘天天综合网色鬼国产| 日韩欧美国产三级电影视频| 99久久777色| 蜜臀av一级做a爰片久久| 欧美激情一区二区三区| 欧美视频一区二区三区| 粉嫩高潮美女一区二区三区| 日韩av电影一区| 亚洲视频在线观看一区| 精品久久久久久久久久久久包黑料 | youjizz国产精品| 日韩av电影免费观看高清完整版| 国产精品久久久久影院| 日韩欧美在线不卡| 99精品视频在线免费观看| 久久av中文字幕片| 亚洲国产人成综合网站| 中文字幕中文字幕一区| 久久丝袜美腿综合| 欧美电影一区二区三区| 91毛片在线观看| 国产精品一区二区黑丝| 日韩va欧美va亚洲va久久| 一区二区三区四区国产精品| 中文字幕第一页久久| 精品国产一区二区在线观看| 欧美日韩一区小说| 色八戒一区二区三区| 欧美视频一区二区| 成人av在线播放网址| 国产一二精品视频| 久久99精品久久久| 日本aⅴ免费视频一区二区三区| 一区二区在线观看免费| 国产精品国产三级国产aⅴ无密码| 久久久久久黄色| xnxx国产精品| 精品免费日韩av| 精品成人在线观看| 日韩欧美高清dvd碟片| 日韩午夜在线播放| 欧美一区二区三区视频在线 | 亚洲国产美女搞黄色| 亚洲激情自拍偷拍| 亚洲欧洲99久久| 亚洲人xxxx| 亚洲黄色片在线观看| 一区二区三区在线免费播放| 亚洲欧美精品午睡沙发| 亚洲欧美国产毛片在线| 一区二区在线观看不卡| 亚洲精品久久久蜜桃| 亚洲视频免费在线观看| 亚洲激情男女视频| 亚洲午夜精品久久久久久久久| 亚洲国产中文字幕在线视频综合| 一级特黄大欧美久久久| 五月天视频一区| 日韩av中文字幕一区二区| 日韩中文欧美在线| 国产综合色视频| 99久久国产综合精品女不卡| 欧美自拍丝袜亚洲| 日韩一级欧美一级| 久久精品这里都是精品| 国产精品国产三级国产普通话蜜臀 | 国产精品伦理一区二区| 亚洲三级在线免费观看| 亚洲第四色夜色| 久久精品久久精品| 国产精品白丝av| 色综合久久综合网| 91精品午夜视频| 国产亚洲福利社区一区| 亚洲视频一区二区在线观看| 香蕉av福利精品导航 | 视频一区二区三区入口| 另类欧美日韩国产在线| 大白屁股一区二区视频| 欧美日韩美少妇| 国产欧美一区二区精品性色超碰 | 久久精品人人做| 亚洲精品乱码久久久久久久久 | 偷拍与自拍一区| 国产伦理精品不卡| 色94色欧美sute亚洲线路一久| 日韩一级片在线观看| 亚洲视频一区在线| 日本高清不卡在线观看| 欧美日韩免费在线视频| 欧美巨大另类极品videosbest| 亚洲国产精品99久久久久久久久| 国产精品入口麻豆九色| 五月天一区二区三区| 精品一区二区三区影院在线午夜 | 91麻豆精品91久久久久久清纯| 91一区二区三区在线播放| 国产色91在线| 欧美日本国产视频| 欧美日韩一级二级| 中日韩av电影| 蜜桃久久久久久| 欧美三级韩国三级日本一级| 国产日本欧美一区二区| 日本成人在线一区| 欧美中文字幕亚洲一区二区va在线| 久久免费看少妇高潮| 日韩国产欧美一区二区三区| 91同城在线观看| 国产丝袜美腿一区二区三区| 日韩电影网1区2区| 欧美色视频在线| 亚洲免费在线看| 国产不卡一区视频| 久久网站最新地址| 日本欧美在线看| 欧美丝袜第三区| 一区二区理论电影在线观看| 福利电影一区二区三区| 日韩欧美国产不卡| 免费观看久久久4p| 777久久久精品| 亚洲成va人在线观看| 在线精品视频一区二区| 一区免费观看视频| 成人黄色免费短视频| 国产精品美女久久久久av爽李琼 | 欧美日韩精品系列|