⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exam10.c

📁 数值传热学NHT C语言源代码及解释 陶文铨院士 的经典例题中3个题目的解答
💻 C
字号:
#include "engine.h"
#include "matrix.h"

#include "global_var.h" 

void user_could_reset_some_setting_here()
{
 int i;
 char *string1="  temprature ";
 char *string2="  vel u ";	
 char *string3="  str fn ";
 char *string4="  vel v ";	
 char *string5="  pressure ";
 char *string6="  density ";
 char *string7=" k.energy ";
 char *string8=" disipat ";
 char *string9=" turbulent visc ";
 
 title[1]=strdup(string2);
 title[2]=strdup(string4);
 title[3]=strdup(string3);
 title[4]=strdup(string1);
 title[5]=strdup(string7);
 title[6]=strdup(string8);
 title[7]=strdup(string9);
 title[11]=strdup(string5);
 title[12]=strdup(string6);	
 relax[1]=0.5;
 relax[2]=0.5;
 relax[11]=0.8;
 relax[5]=0.4;
 relax[6]=0.4;
 relax[13]=0.5;
 for (i=1;i<=6;i++)
 {
	lsolve[i]=1;
    lprint[i]=1;
 }
 lprint[11]=1;
 lprint[7]=1;
 lprintdebuginfo=0;
 mode=1;
 last=1;
 dt=1e30;
 xl=1.0;       
 yl=4.0;       
 l1=59;    
 m1=59;

 amu=1.e-6;
 cmu=.09;
 c1=1.44;
 c2=1.92;
 prt=.9;
 prk=1.;
 prd=1.3;
 pr=.7;
 prprt=pr/prt;
 pfn=9.*(prprt-1.)/pow(prprt,0.25);
 cmu4=pow(cmu,0.25);
 for (i=1;i<=nfmax;i++)  ntimes[i]=30;
}

void user_generate_velocity_grid()  //速度u v的控制网格
{  int i,j;
   double dx,dy;  
   xu[2]=0;       //  第二个主控制容积在x方向的w界面位置,即速度u(i,j)所在位置的x坐标=0   
                  //  难道说,第一个控制容积留给了虚拟的边壁?   ??? 
   dx=xl/(double)(l1-2);  // x方向上的网格宽度
   for (i=3;i<=l1;i++)  // l1-1就是最后一个控制体(虚拟边界控制体)的i坐标了。
	                   //计数的习惯与C的数组的序列号保持一致,从0开始。
   {
	   xu[i]=xu[i-1]+dx; //网格在x方向是均匀,所以第三列~第七列控制容积的w面简单以dx递增
   }
   // NOTE : xu[1] 没有被赋值
   yv[2]=0;
   dy=yl/(double)(m1-2);
   for (j=3;j<=m1;j++) 
   {
	   yv[j]=yv[j-1]+dy;
   }
   // NOTE :xu[1] yv[1] 没有被赋值
}

void user_initial_grid_value()
{   
	int i,j;
	for (j=1;j<=m1;j++)
  	  for (i=1;i<=l1;i++)
	  {  
		  u(i,j)=0;
		  v(i,j)=5;
		  v(1,j)=0;
		  v(i,2)=5;
		  if (i>(l1/2)) v(i,2)=10;
		  t(i,j)=100;
		  t(1,j)=0;
		  if (i>(l1/2)) t(i,1)=400;
		  ake(i,j)=0.005*v(i,2)*v(i,2);
		  dis(i,j)=0.1*ake(i,j)*ake(i,j);

     }
}

void user_correct_density()
{
}


void user_bound_condition_setup()
{
	static double flowin;
	double factor,fl,afl,vmin;
	int i,j;
   	if (iter1==0) //每一个时间片开始后,重新计算入口流量。因为入口条件可能会变
	{   
		flowin=0;
	    for (i=2;i<=l2;i++) flowin+=rho(i,1)*v(i,2)*xcv[i];
	}
	
	fl=0;
	afl=0.;
	vmin=0.;
    for (i=2;i<=l2;i++) 	
	{
		if(v(i,m2)<0) vmin=__max(vmin,-v(i,m2));
        afl=afl+rho(i,m1)*xcv[i];
		fl=fl+rho(i,m1)*v(i,m2)*xcv[i];
	}
    factor=flowin/fl;
    for (i=2;i<=l2;i++)  v(i,m1)=(v(i,m2)+vmin)*factor;
    for (j=2;j<=m2;j++) dis(l1,j)=dis(l2,j);	  	

}

	void user_gamsor()
{   
    double rel,amt,factor,xplus[MAXGRIDSIZE],gamp,gamm,dudx,dvdy,dudy,dvdx,diss;
	int i,j;
	if(nf==3) return;
	if(nf==1)
	{
	  rel=1.-relax[ngam]; //relax[13]=0.5
	  for (j=1;j<=m1;j++)
		  for (i=1;i<=l1;i++)
		    {
				amt=cmu*rho(i,j)*ake(i,j)*ake(i,j)/(dis(i,j)+1.e-30);
            	if(iter1==0&&iter==0) amut(i,j)=amt;
                amut(i,j)=relax[ngam]*amt+rel*amut(i,j);
			}
	}
	factor=1.;
	if(nf==4) factor=1./prt;
	if(nf==5) factor=1./prk;
	if(nf==6) factor=1./prd;
	for (j=1;j<=m1;j++)
		  for (i=1;i<=l1;i++)
		   {
		        gam(i,j)=amut(i,j)*factor; //amut在nf==1时计算后一直保留
	            if (nf!=1) gam(l1,j)=0.;
				gam(i,m1)=0;
		   }

for (j=2;j<=m2;j++)
  {
	switch(nf)
	{
	case 1:                        //u方程
		gam(1,j)=0;
		break;
	case 2:                        //v方程
		xplus[j]=rho(2,j)*sqrt(ake(2,j))*cmu4*xdif[2]/amu;
	    gam(1,j)=amu;
	    if(xplus[j]>11.5) gam(1,j)=amu*xplus[j]/(log(9.*xplus[j])*2.5);
		break;
	case 3:                       //压力校正
		gam(1,j)=0;
		break;
	case 4:                      //温度
		gam(1,j)=amu/pr;
        if(xplus[j]>11.5) gam(1,j)=amu/prt*xplus[j]/(2.5*log(9.*xplus[j])+pfn);
		break; 
	case 5:                     //k
		gam(1,j)=0;
		break;
	case 6:                    //diss
		gam(1,j)=0;
		break;
	}
  }

switch(nf)
 {
  case 1:
    	{
			for (j=2;j<=m2;j++)
		        for (i=3;i<=l2;i++)
				{
  	 	 	 	 	con[i][j]=(gam(i,j)*(u(i+1,j)-u(i,j))/xcv[i]-gam(i-1,j)*(u(i,j)-u(i-1,j))/xcv[i-1])/xdif[i];
					gamp=gam(i,j+1)*gam(i-1,j+1)/(gam(i,j+1)+gam(i-1,j+1)+1.e-30);
					gamp=gamp+gam(i,j)*gam(i-1,j)/(gam(i,j)+gam(i-1,j)+1.e-30);
					gamm=gam(i,j-1)*gam(i-1,j-1)/(gam(i,j-1)+gam(i-1,j-1)+1.e-30);
					gamm=gamm+gam(i,j)*gam(i-1,j)/(gam(i,j)+gam(i-1,j)+1.e-30);
					con[i][j]=con[i][j]+(gamp*(v(i,j+1)-v(i-1,j+1))-gamm*(v(i,j)-v(i-1,j)))/(ycv[j]*xdif[i]);
					ap[i][j]=0;
				}
		break;
		}
  
  case 2:
        {
			for (j=3;j<=m2;j++)
		        for (i=2;i<=l2;i++)
				{
     	 	 	 	con[i][j]=(gam(i,j)*(v(i,j+1)-v(i,j))/ycv[j]-gam(i,j-1)*(v(i,j)-v(i,j-1))/ycv[j-1])/ydif[j];
					gamp=gam(i+1,j)*gam(i+1,j-1)/(gam(i+1,j)+gam(i+1,j-1)+1.e-30);
					gamp=gamp+gam(i,j)*gam(i,j-1)/(gam(i,j)+gam(i,j-1)+1.e-30);
					gamm=gam(i-1,j)*gam(i-1,j-1)/(gam(i-1,j)+gam(i-1,j-1)+1.e-30);
					gamm=gamm+gam(i,j)*gam(i,j-1)/(gam(i,j)+gam(i,j-1)+1.e-30);
					con[i][j]=con[i][j]+(gamp*(u(i+1,j)-u(i+1,j-1))-gamm*(u(i,j)-u(i,j-1)))/(xcv[i]*ydif[j]);
					ap[i][j]=0.;
				}
				break;
		}
  
  case 4:
	  {
		  for (j=2;j<=m2;j++)
		        for (i=2;i<=l2;i++)
				{
					con[i][j]=0.;  
   					ap[i][j]=0.;
				}
	    	break;
	  }

  case 5:
	  {
		  for (j=2;j<=m2;j++)
		        for (i=2;i<=l2;i++)
				{
					dudx=(u(i+1,j)-u(i,j))/xcv[i];
					dvdy=(v(i,j+1)-v(i,j))/ycv[j];
					if(j==2) dudy=(0.5*(u(i,j+1)-u(i,j))+0.5*(u(i+1,j+1)-u(i+1,j)))/(ydif[j+1]);
					else if(j==m2) dudy=(0.5*(u(i,j)-u(i,j-1))+0.5*(u(i+1,j)-u(i+1,j-1)))/ydif[j];
					else dudy=(0.5*(u(i,j+1)-u(i,j-1))+0.5*(u(i+1,j+1)-u(i+1,j-1)))/(ydif[j]+ydif[j+1]);

					if(i==2) dvdx=(0.5*(v(i+1,j)-v(i,j))+0.5*(v(i+1,j+1)-v(i,j+1)))/xdif[i+1];
					else if(i==l2) dvdx=(0.5*(v(i,j)-v(i-1,j))+0.5*(v(i,j+1)-v(i-1,j+1)))/xdif[i];
					else dvdx=(0.5*(v(i+1,j)-v(i-1,j))+0.5*(v(i+1,j+1)-v(i-1,j+1)))/(xdif[i]+xdif[i+1]);
                    gen(i,j)=2.*(dudx*dudx+dvdy*dvdy)+(dudy+dvdx)*(dudy+dvdx);
	 	 	 	 	con[i][j]=gen(i,j)*amut(i,j);
					ap[i][j]=-rho(i,j)*dis(i,j)/(ake(i,j)+1.e-30);
                  }
		  break;
	  }
  case 6:
	  {
	  for (j=2;j<=m2;j++)
	    for (i=2;i<=l2;i++)
				{
		 	 	 	con[i][j]=c1*gen(i,j)*cmu*rho(i,j)*ake(i,j);
					ap[i][j]=-c2*rho(i,j)*dis(i,j)/(ake(i,j)+1.e-30);
				}
      for (j=2;j<m2;j++)
	           {
		           diss=cmu*pow(ake(2,j),1.5)/(0.4*cmu4*xdif[2]);
				   con[2][j]=1.e+30*diss;
				   ap[2][j]=0.-1.e+30;
			   }

	  break;
	  }
 }  //switch nf

 
}					

void user_output()
{   
	//fprintf(filehandle8,"\niter=%3d  SMAX=%7.3f  SSUM=%9.4f  v(4,7)=%9.4f   T(4,7)=%9.4f   F(4,7,3)=%9.4f\n",iter,smax,ssum,v(4,7),t(4,7),f[4][7][3]);
	fprintf(filehandle8,"\niter==%3d time=%7.3f\n",iter,time);	
	printinfo();
    user_plot();
}					

void give_matlab_a_double_matrix(Engine* ep, char * matrix_name, int matrix_x_dimension, int matrix_y_dimension, double * databuffer) 
{   mxArray *T;
	T=mxCreateDoubleMatrix(matrix_x_dimension,matrix_y_dimension,mxREAL);
	mxSetName(T, matrix_name);
	memcpy((void*)mxGetPr(T),(void*)databuffer,matrix_x_dimension*matrix_y_dimension*sizeof(double));
	engPutArray(ep, T);
    mxDestroyArray(T);
}

void give_matlab_a_interger(Engine* ep, char * matrix_name, int data)
{ char matlabsentence[255];
  sprintf(matlabsentence,"%s=%d;",matrix_name,data);
  engEvalString(ep,matlabsentence);
}
	
void user_plot() //MATLAB画图
{  
   
       int i,j,matrixcount,velocv_ibeg,velocv_iend,velocv_jbeg,velocv_jend,maincv_ibeg,maincv_iend,maincv_jbeg,maincv_jend;
       double matrixX[MAXGRIDSIZE*MAXGRIDSIZE],matrixY[MAXGRIDSIZE*MAXGRIDSIZE],matrixU[MAXGRIDSIZE*MAXGRIDSIZE];
	   double matrixV[MAXGRIDSIZE*MAXGRIDSIZE],matrixP[MAXGRIDSIZE*MAXGRIDSIZE],matrixT[MAXGRIDSIZE*MAXGRIDSIZE],matrixGAM[MAXGRIDSIZE*MAXGRIDSIZE];
      static Engine *ep;
      velocv_ibeg=2;                                     
      velocv_iend=l1-1;
      velocv_jbeg=2;
      velocv_jend=m1-1;
      
	  maincv_ibeg=1;
      maincv_iend=l1-1;
      maincv_jbeg=1;
      maincv_jend=m1-1;   

   if (iter==0)
	  {
		  ep = engOpen(NULL);
          give_matlab_a_interger(ep,"last",last);
		  give_matlab_a_interger(ep,"iter",iter);
          engEvalString(ep,"M=moviein(last+1);iter=1");
	  
	  }
	 
	  matrixcount=0;  
	   for (j=velocv_jbeg;j<=velocv_jend;j++)
		   for (i=velocv_ibeg;i<=velocv_iend;i++)
		     {
			   matrixX[matrixcount]=xu[i];
	           matrixY[matrixcount]=yv[j];
			   matrixU[matrixcount]=u(i,j);
			   matrixV[matrixcount]=v(i,j);
			   matrixcount++;
             }
           give_matlab_a_double_matrix(ep,"VELOX",velocv_iend-velocv_ibeg+1,velocv_jend-velocv_jbeg+1,matrixX);
           give_matlab_a_double_matrix(ep,"VELOY",velocv_iend-velocv_ibeg+1,velocv_jend-velocv_jbeg+1,matrixY);
		   give_matlab_a_double_matrix(ep,"U",velocv_iend-velocv_ibeg+1,velocv_jend-velocv_jbeg+1,matrixU);
		   give_matlab_a_double_matrix(ep,"V",velocv_iend-velocv_ibeg+1,velocv_jend-velocv_jbeg+1,matrixV);
           
        
		matrixcount=0;
		for (j=maincv_jbeg;j<=maincv_jend;j++)
		   for (i=maincv_ibeg;i<=maincv_iend;i++)
		     {
			   matrixX[matrixcount]=x[i];
	           matrixY[matrixcount]=y[j];
			   matrixT[matrixcount]=t(i,j);
			   matrixP[matrixcount]=p(i,j);
			   matrixGAM[matrixcount]=gam(i,j);
			   matrixcount++;
             }
		   give_matlab_a_double_matrix(ep,"X",maincv_iend-maincv_ibeg+1,maincv_jend-maincv_jbeg+1,matrixX);
           give_matlab_a_double_matrix(ep,"Y",maincv_iend-maincv_ibeg+1,maincv_jend-maincv_jbeg+1,matrixY);
		   give_matlab_a_double_matrix(ep,"T",maincv_iend-maincv_ibeg+1,maincv_jend-maincv_jbeg+1,matrixT);
		   give_matlab_a_double_matrix(ep,"P",maincv_iend-maincv_ibeg+1,maincv_jend-maincv_jbeg+1,matrixP);
           give_matlab_a_double_matrix(ep,"GAM",maincv_iend-maincv_ibeg+1,maincv_jend-maincv_jbeg+1,matrixGAM);
		 
	
    if (iter==last-1)
	  {
    	  engEvalString(ep,"hold off;pcolor(X,Y,T);shading interp;caxis([100 400]);colorbar;axis equal;hold on;quiver(VELOX,VELOY,U,V);");

	  }
       
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -