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

📄 sph.cpp

📁 用SPH方法编写的激波管程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include "SPH.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SPH::SPH(int dim1,int maxn1)
{	  
      dim=dim1;
      maxn=maxn1;
      max_interaction = 100 * maxn;
      x_maxgeom =10.0;
	  x_mingeom = -10.0;
	  y_maxgeom =10.0;
	  y_mingeom = -10.0;
	  z_maxgeom =10.0;
	  z_mingeom = -10.0;
	  pa_sph = 2;
      nnps = 1;
      sle = 0;
      skf = 1;
      summation_density  = true;
      average_velocity  = false;
      config_input  = false;
      virtual_part  = false;
      vp_input  = false;
      visc  = false;
      ex_force  =false;
      visc_artificial  = true;
      heat_artificial  = false;
      self_gravity  = false;      
      nor_density  = false;    
      nsym = 0;
      int_stat = true;
      print_step = 100;
	  save_step = 500;
	  moni_particle = 1600;
      pi = 3.14159265358979323846;
      shocktube  = true;
      shearcavity  = false;
	  itimestep=0;//新添加
//----------------input--------------------
p=new double[maxn+1];
u=new double[maxn+1];
//----------------direct_find--------------------
countiac=new int [maxn+1];
//--------------kernel-----------------
	  dx=new double[dim+1]; 
//	  dw1dx=new double[dim+1];
//------art_heat----------------------
//    ntotal=   ;//?????????????有子程序定义,此处不必再定义
//	niac=   ;//??????????????有子程序定义,此处不必再定义
   pair_i=new int[max_interaction+1];
   pair_j=new int[max_interaction+1];
   hsml=new double[maxn+1];
   mass=new double[maxn+1];
	x=new double *[dim+1];
	for(int i=0;i<dim+1;i++)
	x[i]=new double[maxn+1];
	vx=new double *[dim+1];
	for(i=0;i<dim+1;i++)
	vx[i]=new double[maxn+1];
   rho=new double[maxn+1];
   u=new double[maxn+1];
   c=new double[maxn+1];
   w=new double[max_interaction+1];
	dwdx=new double *[dim+1];
	for(i=0;i<dim+1;i++)
	dwdx[i]=new double[max_interaction+1];
//    dedt=new double[maxn];
//---------------art_vsic------------------
//	dvxdt=new double *[dim+1];
//	for(i=0;i<dim+1;i++)
//	dvxdt[i]=new double[maxn+1];
//----------------av_vel---------------------
	av=new double *[dim+1];
	for(i=0;i<dim+1;i++)
	av[i]=new double[maxn+1];
//---------------------sum_density------------
	itype=new int[maxn+1];
//---------------------con_density------------
	drhodt=new double[maxn+1];
//-----------------------------------int_force--------------------------------------
//此程序中出现两个itype的定义,请查明原因
eta=new double[maxn+1];
t=new double[maxn+1];
tdsdt=new double[maxn+1];
//-----------------------------------single_step--------------------------------------
s=new double[maxn+1];//此变量本程序中没有使用
du=new double[maxn+1];
ds=new double[maxn+1];
drho=new double[maxn+1];
	dvx=new double *[dim+1];
	for(i=0;i<dim+1;i++)
	dvx[i]=new double[maxn+1];
//-----------------------------------time_integration--------------------------------------
//e=new double[maxn+1];
}
SPH::~SPH()
{
//-----------------------------------int_force--------------------------------------
delete []eta;
delete []t;
delete []tdsdt;
//------------------------------------------------------------------------------
//-----------------------------------single_step--------------------------------------
delete []s;//此变量本程序中没有使用
delete []du;
delete []ds;
delete []drho;
	for(int i=0;i<dim+1;i++)
		delete []dvx[i];
	delete []dvx;
//------------------------------------------------------------------------------
//-----------------------------------time_integration--------------------------------------
//delete []e;
	//--------------input-----------
		delete []p;
//		delete []u; //重复定义
	//--------------direct_find-----------
		delete []countiac;
	//---------------kernel---------------
	delete[]dx;
//	delete[]dw1dx;
	//------------------------------------
	//------art_heat----------------------
    delete []pair_i;
    delete []pair_j;
    delete []hsml;
    delete []mass;

	for( i=0;i<dim+1;i++)
		delete []x[i];
	delete []x;
	for( i=0;i<dim+1;i++)
		delete []vx[i];
	delete []vx;
	delete []rho;
	delete []u;
	delete []c;
	delete []w;

		for( i=0;i<dim+1;i++)
		delete []dwdx[i];
	delete []dwdx;
//	delete []dedt;
  //-------------------------------------
  //------------av_vel-------------------
 	for( i=0;i<dim+1;i++)
		delete []av[i];
	delete []av; 
//--------------------------------------
//--------------sum_density-------------
     delete []itype;
//------------------------------------
//--------------con_density-------------
     delete []drhodt;
//------------------------------------
//---------------art_vsic------------------
//	for(i=0;i<dim+1;i++)
//		delete []dvxdt[i];
//	delete []dvxdt;
//-------------------------------------------
}
void p_gas(double rho1,double u1,double &p1,double &c1)
{          
double gamma; 
      gamma=1.4;
      p1 = (gamma-1) * rho1 * u1;     
      c1 = sqrt((gamma-1) * u1);     
}
void p_art_water(double rho1,double &p1,double &c1)
{
//double  gamma=7;
//double rho0=1000;
     c1 = 0.01;
     p1 = pow(c1,2) * rho1;
}


void SPH::art_visc(int ntotal,double **(&dvx1dt),double *(&de1dt))
{
//	if (visc_artificial)art_visc(ntotal+nvirt,hsml,mass,x,vx,niac,rho,c,pair_i,pair_j,w,dwdx,ardvxdt,avdudt);//其中c表示温度还是声速,这里以声速计算
    
//c     Subroutine to calculate the artificial viscosity (Monaghan, 1992) 
//     ntotal : Number of particles (including virtual particles)    [in]
//     hsml   : Smoothing Length                                     [in]
//     mass   : Particle masses                                      [in]
//     x      : Coordinates of all particles                         [in]
//     vx     : Velocities of all particles                          [in]
//     niac   : Number of interaction pairs                          [in]
//     rho    : Density                                              [in]
//     c      : Temperature                                          [in]
//     pair_i : List of first partner of interaction pair            [in]
//     pair_j : List of second partner of interaction pair           [in]
//     w      : Kernel for all interaction pairs                     [in]
//     dwdx   : Derivative of kernel with respect to x, y and z      [in]
//     dvxdt  : Acceleration with respect to x, y and z             [out] 
//     dedt   : Change of specific internal energy                  [out]

      double dx1;//已定义*dx,故改名
	  double piv,muv, vr, rr, h, mc, mrho, mhsml;	
	  double *dvx1;// 构造函数dvx已定为二维数组,故改名,dvx1[dim]不能直接定义数组是因为数组的大小在构造函数并没有指明大小(也是动态的)
      dvx1=new double[dim+1];
	  //     Parameter for the artificial viscosity:
      double alpha = 1.0;//Shear viscosity查明这三个参数是不是在其他程序也引用,这是当作局部变量
      double beta  = 1.0; //     Bulk viscosity
      double etq   = 0.1;//     Parameter to avoid singularities
           
      for(int i=1;i<=ntotal;i++)
	  {
        for(int d=1;d<=dim;d++)
		{
          dvx1dt[d][i] = 0.0;
        }
        de1dt[i] = 0.0;
	  }   
     
//     Calculate SPH sum for artificial viscosity
      for(int k=1;k<=niac;k++)
	  {
           i = pair_i[k];
           int j = pair_j[k];
           mhsml= (hsml[i]+hsml[j])/2;
           vr = 0.0;
           rr = 0.0;
              for(int  d=1;d<=dim;d++)
			  {
                  dvx1[d]=vx[d][i]-vx[d][j];
                  dx1=x[d][i]-x[d][j];
                  vr=vr+dvx1[d]*dx1;
                  rr=rr+dx1*dx1;
			  }
//     Artificial viscous force only if v_ij * r_ij < 0
             if (vr<0.0)
			 {
                   //     Calculate muv_ij = hsml v_ij * r_ij / ( r_ij^2 + hsml^2 etq^2 )
                    muv = mhsml*vr/(rr + mhsml*mhsml*etq*etq);
                    //     Calculate PIv_ij = (-alpha muv_ij c_ij + beta muv_ij^2) / rho_ij
                    mc   = 0.5*(c[i] + c[j]);
                    mrho = 0.5*(rho[i] + rho[j]);
                    piv  = (beta*muv - alpha*mc)*muv/mrho;              
//     Calculate SPH sum for artificial viscous force
                    for(int d=1;d<=dim;d++)
					{
                       h = -piv*dwdx[d][k];
                       dvx1dt[d][i] = dvx1dt[d][i] + mass[j]*h;
                       dvx1dt[d][j] = dvx1dt[d][j] - mass[i]*h;
                       de1dt[i] = de1dt[i] - mass[j]*dvx1[d]*h;
                       de1dt[j] = de1dt[j] - mass[i]*dvx1[d]*h;
					}
			 }
	  }
//     Change of specific internal energy:
      for(i=1;i<=ntotal;i++)
         de1dt[i] = 0.5*de1dt[i];
//      for(i=1;i<=ntotal;i++)cout<<"de1dt[i]="<<de1dt[i]<<"dvx1dt[1][i]="<<dvx1dt[1][i]<<endl;

	  delete []dvx1;
}

void SPH::sum_density(int ntotal)
{
//	sum_density(ntotal+nvirt,hsml,mass,niac,pair_i,pair_j,w,itype,rho);
//	C   Subroutine to calculate the density with SPH summation algorithm.
//C     ntotal : Number of particles                                  [in]
//C     hsml   : Smoothing Length                                     [in]
//C     mass   : Particle masses                                      [in]
//C     niac   : Number of interaction pairs                          [in]
//C     pair_i : List of first partner of interaction pair            [in]
//C     pair_j : List of second partner of interaction pair           [in]
//C     w      : Kernel for all interaction pairs                     [in]
//c     itype   : type of particles                                   [in]
//c     x       : Coordinates of all particles                        [in]
//c     rho    : Density                                             [out]
      double selfdens,r; 
      double *hv, *wi; 
	  hv=new double[dim+1];
	  wi=new double[maxn+1];

//     wi[maxn]---integration of the kernel itself        
      for(int d=1;d<=dim;d++)
		   hv[d] = 0.0;//这个变量程序中好像并没有使用??????????
//     Self density of each particle: Wii (Kernel for distance 0)
//     and take contribution of particle itself:
      r=0;
//     Firstly calculate the integration of the kernel over the space
      double temp=0;
      for(int i=1;i<=ntotal;i++)
	  {
		  temp=hsml[i];
        kernel(r,hv,temp,selfdens,hv);//这是程序可能有问题的一个地方??????????????????????????????
        
		wi[i]=selfdens*mass[i]/rho[i];
	  }

      for(int k=1;k<=niac;k++)
	  {
        i = pair_i[k];
        int j = pair_j[k];
        wi[i] = wi[i] + mass[j]/rho[j]*w[k];
        wi[j] = wi[j] + mass[i]/rho[i]*w[k];
      }

//     Secondly calculate the rho integration over the space

      for( i=1;i<=ntotal;i++)
	  {
		  temp=hsml[i];
         kernel(r,hv,temp,selfdens,hv);//这是程序可能有问题的一个地方???????????????????
  		 rho[i] = selfdens*mass[i];//这里冲掉了原来的密度,对否??????/?
      }

//     Calculate SPH sum for rho:
      for( k=1;k<=niac;k++)
	  {
        i = pair_i[k];
        int j = pair_j[k];
        rho[i] = rho[i] + mass[j]*w[k];//这里冲掉了原来的密度,对否??????/?
        rho[j] = rho[j] + mass[i]*w[k];//这里冲掉了原来的密度,对否??????/?
      }

//     Thirdly, calculate the normalized rho, rho=sum(rho)/sum(w)
      if (nor_density) // nor_density已经定义为布尔变量;
	  {
		  for(int i=1;i<= ntotal;i++)
			  rho[i]=rho[i]/wi[i];//这里冲掉了原来的密度,对否??????/?
	  }
	  	  
	  delete []hv;
	  delete []wi;

}

void SPH::int_force(int ntotal,double **(&dvx1dt),double *tdsdt,double *(&de1dt))
{
//	int_force(ntotal+nvirt,indvxdt,tdsdt,du)
      double *dvx1, *txx, *tyy,*tzz, *txy, *txz, *tyz, *vcc;
	  dvx1=new double[dim+1];txx=new double[maxn+1];tyy=new double[maxn+1];
	  tzz=new double[maxn+1];txy=new double[maxn+1];txz=new double[maxn+1];
	  tyz=new double[maxn+1];vcc=new double[maxn+1];
	  
	  double hxx, hyy, hzz, hxy, hxz, hyz, h, hvcc, he, rhoij;
	  double temp1,temp2,temp3,temp4;
      for(int  i=1;i<=ntotal;i++)//     Initialization of shear tensor, velocity divergence,viscous energy, internal energy, acceleration 
	  {
        txx[i] = 0.0;tyy[i] = 0.0;tzz[i] = 0.0;txy[i] = 0.0;txz[i] = 0.0;
		tyz[i] = 0.0;vcc[i] = 0.0;tdsdt[i] = 0.0;de1dt[i] = 0.0;
		for(int d=1;d<=dim;d++)
			dvx1dt[d][i] = 0.0;
	  }
      if (visc) //     Calculate SPH sum for shear tensor Tab = va,b + vb,a - 2/3 delta_ab vc,c
	  { 
        for(int k=1;k<=niac;k++)
		{
          i = pair_i[k];int j = pair_j[k];
          for(int d=1;d<=dim;d++)
		  {
			  dvx1[d] = vx[d][j] - vx[d][i];
		  }
              if(dim==1)
			  {
				  hxx = 2.0*dvx1[1]*dwdx[1][k];
			  }
			  else if (dim==2)
			  {
				  hxx = 2.0*dvx1[1]*dwdx[1][k] -  dvx1[2]*dwdx[2][k];
				  hxy = dvx1[1]*dwdx[2][k] + dvx1[2]*dwdx[1][k];
				  hyy = 2.0*dvx1[2]*dwdx[2][k] - dvx1[1]*dwdx[1][k];
			  }
			  else if (dim==3)
			  {
				  hxx = 2.0*dvx1[1]*dwdx[1][k] - dvx1[2]*dwdx[2][k]- dvx1[3]*dwdx[3][k];
				  hxy = dvx1[1]*dwdx[2][k] + dvx1[2]*dwdx[1][k];
			      hxz = dvx1[1]*dwdx[3][k] + dvx1[3]*dwdx[1][k];
				  hyy = 2.0*dvx1[2]*dwdx[2][k] - dvx1[1]*dwdx[1][k]- dvx1[3]*dwdx[3][k];
                  hyz = dvx1[2]*dwdx[3][k] + dvx1[3]*dwdx[2][k];
				  hzz = 2.0*dvx1[3]*dwdx[3][k] - dvx1[1]*dwdx[1][k]- dvx1[2]*dwdx[2][k]; 
			  }
              hxx = 2.0/3.0*hxx;
			  hyy = 2.0/3.0*hyy;
			  hzz = 2.0/3.0*hzz;
              if (dim==1)
			  {
				  txx[i] = txx[i] + mass[j]*hxx/rho[j];
				  txx[j] = txx[j] + mass[i]*hxx/rho[i];
			  }
			  else if (dim==2)
			  {
				  txx[i] = txx[i] + mass[j]*hxx/rho[j];
				  txx[j] = txx[j] + mass[i]*hxx/rho[i];
				  txy[i] = txy[i] + mass[j]*hxy/rho[j];

⌨️ 快捷键说明

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