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

📄 radarfdtd.cpp

📁 fdtd3 C++.rar 3维电磁散射通用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    lowerY = hz[i][j-1][k];
	  else
	    lowerY = pmlHZXBottomXZ[i][pmlWidth-1][k] + pmlHZYBottomXZ[i][pmlWidth-1][k];
	  
	  if (k > 0)
	    lowerZ = hy[i][j][k-1];
	  else
	    lowerZ = pmlHYXBottomXY[i][j+pmlWidth][pmlWidth-1] + pmlHYZBottomXY[i][j+pmlWidth][pmlWidth-1];
	  
	  switch(material[i][j][k])
	    {
	    case 0: 
	      ex[i][j][k] = ex[i][j][k] + materialConstants[0][DTEPSDY] * (hz[i][j][k] - lowerY) - materialConstants[0][DTEPSDZ] * (hy[i][j][k] - lowerZ);
	      break;
	    case 1:
	      ex[i][j][k] = 0;
	      break;
	    default:
	      ex[i][j][k] = materialConstants[material[i][j][k]][DTSIGEPS]*ex[i][j][k] + materialConstants[material[i][j][k]][DTEPSDY]*(hz[i][j][k] - lowerY) - materialConstants[material[i][j][k]][DTEPSDZ]*(hy[i][j][k] - lowerZ);
	    }
	}
}

/* Update the ey values: */
  
void CradarFDTD::UpdateInnerEy(void)
{
  int i,j,k;
  PRECISION lowerX, lowerZ;
  
  for(i=0; i<(nx); i++) 
    for(j=0; j<(ny); j++)
      for(k=0; k<(nz); k++) 
	{
	  if (i > 0)
	    lowerX = hz[i-1][j][k];
	  else
	    lowerX = pmlHZXBottomYZ[pmlWidth-1][j+pmlWidth][k+pmlWidth] + pmlHZYBottomYZ[pmlWidth-1][j+pmlWidth][k+pmlWidth];
	  
	  if (k > 0)
	    lowerZ = hx[i][j][k-1]; 
	  else
	    lowerZ = pmlHXYBottomXY[i][j+pmlWidth][pmlWidth-1] +  pmlHXZBottomXY[i][j+pmlWidth][pmlWidth-1];
	  
	  switch(material[i][j][k])
	    {
	    case 0: 
	      ey[i][j][k] = ey[i][j][k] + materialConstants[0][DTEPSDZ] * (hx[i][j][k] - lowerZ) - materialConstants[0][DTEPSDX] * (hz[i][j][k] - lowerX);
	      break;
	    case 1:
	      ey[i][j][k] = 0;
	      break;
	    default:
	      ey[i][j][k] = materialConstants[material[i][j][k]][DTSIGEPS]*ey[i][j][k] + materialConstants[material[i][j][k]][DTEPSDZ]*(hx[i][j][k] - lowerZ) - materialConstants[material[i][j][k]][DTEPSDX]*(hz[i][j][k] - lowerX);
	    }
	}
}
 
/* Update the ez values: */
void CradarFDTD::UpdateInnerEz(void)
{
  int i,j,k;
  PRECISION lowerX, lowerY;

  for(i=0; i<(nx); i++) 
    for(j=0; j<(ny); j++)
      for(k=0; k<(nz); k++)
	{
	  if (i > 0)
	    lowerX = hy[i-1][j][k];
	  else
	    lowerX = pmlHYXBottomYZ[pmlWidth-1][j+pmlWidth][k+pmlWidth] + pmlHYZBottomYZ[pmlWidth-1][j+pmlWidth][k+pmlWidth];
	  
	  if (j > 0)
	    lowerY = hx[i][j-1][k];
	  else
	    lowerY = pmlHXYBottomXZ[i][pmlWidth-1][k] + pmlHXZBottomXZ[i][pmlWidth-1][k];

	  switch(material[i][j][k])
	    {
	    case 0: 
	      ez[i][j][k] = ez[i][j][k] + materialConstants[0][DTEPSDX] * (hy[i][j][k] - lowerX) - materialConstants[0][DTEPSDY] * (hx[i][j][k] - lowerY);
	      break;
	    case 1:
	      ez[i][j][k] = 0;
	      break;
	    default:
	      ez[i][j][k] = materialConstants[material[i][j][k]][DTSIGEPS]*ez[i][j][k] + materialConstants[material[i][j][k]][DTEPSDX]*(hy[i][j][k] - lowerX) - materialConstants[material[i][j][k]][DTEPSDY]*(hx[i][j][k] - lowerY);
	    }
	}
}

void CradarFDTD::UpdateInnerHx(void)
{
  int i,j,k;
  PRECISION nextY, nextZ; /* the upper neighbour-values in y and z direction */
  
  for(i=0; i<(nx); i++) 
    for(j=0; j<(ny); j++)
      for(k=0; k<(nz); k++)
	{
	 
	  if (j < ny-1)
	    nextY = ez[i][j+1][k];
	  else
	    nextY = pmlEZXTopXZ[i][0][k] + pmlEZYTopXZ[i][0][k];
	  
	  if (k < nz-1)
	    nextZ = ey[i][j][k+1];
	  else
	    nextZ = pmlEYXTopXY[i][j+pmlWidth][0] + pmlEYZTopXY[i][j+pmlWidth][0];
	  hx[i][j][k] = hx[i][j][k] + (materialConstants[material[i][j][k]][DTMUDZ]*(nextZ - ey[i][j][k]) - materialConstants[material[i][j][k]][DTMUDY]*(nextY - ez[i][j][k]));
	}
}


 /* Update the hy values: */
void CradarFDTD::UpdateInnerHy(void)
{
  int i,j,k;
  PRECISION nextX, nextZ; /*  the upper neighbour-values in y and z direction */

  for(i=0; i<(nx); i++)
    for(j=0; j<(ny); j++)
      for(k=0; k<(nz); k++)
	{
	  if (i < nx-1)
	    nextX = ez[i+1][j][k];
	  else
	    nextX = pmlEZXTopYZ[0][j+pmlWidth][k+pmlWidth] + pmlEZYTopYZ[0][j+pmlWidth][k+pmlWidth];
	  
	  if (k < nz-1)
	    nextZ = ex[i][j][k+1];
	  else
	    nextZ = pmlEXYTopXY[i][j+pmlWidth][0] + pmlEXZTopXY[i][j+pmlWidth][0];
	  
	  hy[i][j][k] = hy[i][j][k] + (materialConstants[material[i][j][k]][DTMUDX]*(nextX - ez[i][j][k]) - materialConstants[material[i][j][k]][DTMUDZ]*(nextZ - ex[i][j][k]));
	}
}

/* Update the hz values: */
void CradarFDTD::UpdateInnerHz(void)
{
  int i,j,k;
  PRECISION nextX, nextY;
  
  for(i=0; i<(nx); i++)
    for(j=0; j<(ny); j++)
      for(k=0; k<(nz); k++)
	{
	  if (i < nx-1)
	    nextX = ey[i+1][j][k];
	  else
	    nextX = pmlEYXTopYZ[0][j+pmlWidth][k+pmlWidth] +  pmlEYZTopYZ[0][j+pmlWidth][k+pmlWidth];
	  
	  if (j < ny-1)
	    nextY = ex[i][j+1][k];
	  else
	    nextY = pmlEXYTopXZ[i][0][k] + pmlEXZTopXZ[i][0][k];
	  
	  hz[i][j][k] = hz[i][j][k] + (materialConstants[material[i][j][k]][DTMUDY]*(nextY - ex[i][j][k]) - materialConstants[material[i][j][k]][DTMUDX]*(nextX - ey[i][j][k]));
	}
}


void CradarFDTD::UpdatePMLComplexE(void)
{
   /* speed up variables */
  int ny_plus_2pmlWidth = ny + 2*pmlWidth;
  int nz_plus_2pmlWidth = nz + 2*pmlWidth;
 
  /* Bottom YZ */
  
  for(i=0; i<pmlWidth; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<nz_plus_2pmlWidth; k++)
	{
	  pmlComplexEXYBottomYZ[i][j][k] += dt * pmlEXYBottomYZ[i][j][k];
	  pmlComplexEXZBottomYZ[i][j][k] += dt * pmlEXZBottomYZ[i][j][k];
	  pmlComplexEYXBottomYZ[i][j][k] += dt * pmlEYXBottomYZ[i][j][k];
	  pmlComplexEYZBottomYZ[i][j][k] += dt * pmlEYZBottomYZ[i][j][k];
	  pmlComplexEZXBottomYZ[i][j][k] += dt * pmlEZXBottomYZ[i][j][k];
	  pmlComplexEZYBottomYZ[i][j][k] += dt * pmlEZYBottomYZ[i][j][k];
	}

  /* Top YZ */

  for(i=0; i<pmlWidth; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<nz_plus_2pmlWidth; k++)
	{
	  pmlComplexEXYTopYZ[i][j][k] += dt * pmlEXYTopYZ[i][j][k];
	  pmlComplexEXZTopYZ[i][j][k] += dt * pmlEXZTopYZ[i][j][k];
	  pmlComplexEYXTopYZ[i][j][k] += dt * pmlEYXTopYZ[i][j][k];
	  pmlComplexEYZTopYZ[i][j][k] += dt * pmlEYZTopYZ[i][j][k];
	  pmlComplexEZXTopYZ[i][j][k] += dt * pmlEZXTopYZ[i][j][k];
	  pmlComplexEZYTopYZ[i][j][k] += dt * pmlEZYTopYZ[i][j][k];
	}

  /* Bottom XY */

  for(i=0; i<nx; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<pmlWidth; k++)
	{
	  pmlComplexEXYBottomXY[i][j][k] += dt * pmlEXYBottomXY[i][j][k];
	  pmlComplexEXZBottomXY[i][j][k] += dt * pmlEXZBottomXY[i][j][k];
	  pmlComplexEYXBottomXY[i][j][k] += dt * pmlEYXBottomXY[i][j][k];
	  pmlComplexEYZBottomXY[i][j][k] += dt * pmlEYZBottomXY[i][j][k];
	  pmlComplexEZXBottomXY[i][j][k] += dt * pmlEZXBottomXY[i][j][k];
	  pmlComplexEZYBottomXY[i][j][k] += dt * pmlEZYBottomXY[i][j][k];
	}

  /* Top XY */

  for(i=0; i<nx; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<pmlWidth; k++)
	{
	  pmlComplexEXYTopXY[i][j][k] += dt * pmlEXYTopXY[i][j][k];
	  pmlComplexEXZTopXY[i][j][k] += dt * pmlEXZTopXY[i][j][k];
	  pmlComplexEYXTopXY[i][j][k] += dt * pmlEYXTopXY[i][j][k];
	  pmlComplexEYZTopXY[i][j][k] += dt * pmlEYZTopXY[i][j][k];
	  pmlComplexEZXTopXY[i][j][k] += dt * pmlEZXTopXY[i][j][k];
	  pmlComplexEZYTopXY[i][j][k] += dt * pmlEZYTopXY[i][j][k];
	}

  /* BottomXZ */

  for(i=0; i<nx; i++)
    for(j=0; j<pmlWidth; j++)
      for(k=0; k<nz; k++)
	{
	  pmlComplexEXYBottomXZ[i][j][k] += dt * pmlEXYBottomXZ[i][j][k];
	  pmlComplexEXZBottomXZ[i][j][k] += dt * pmlEXZBottomXZ[i][j][k];
	  pmlComplexEYXBottomXZ[i][j][k] += dt * pmlEYXBottomXZ[i][j][k];
	  pmlComplexEYZBottomXZ[i][j][k] += dt * pmlEYZBottomXZ[i][j][k];
	  pmlComplexEZXBottomXZ[i][j][k] += dt * pmlEZXBottomXZ[i][j][k];
	  pmlComplexEZYBottomXZ[i][j][k] += dt * pmlEZYBottomXZ[i][j][k];
	}
  
  /* TopXZ */

  for(i=0; i<nx; i++)
    for(j=0; j<pmlWidth; j++)
      for(k=0; k<nz; k++)
	{
	  pmlComplexEXYTopXZ[i][j][k] += dt * pmlEXYTopXZ[i][j][k];
	  pmlComplexEXZTopXZ[i][j][k] += dt * pmlEXZTopXZ[i][j][k];
	  pmlComplexEYXTopXZ[i][j][k] += dt * pmlEYXTopXZ[i][j][k];
	  pmlComplexEYZTopXZ[i][j][k] += dt * pmlEYZTopXZ[i][j][k];
	  pmlComplexEZXTopXZ[i][j][k] += dt * pmlEZXTopXZ[i][j][k];
	  pmlComplexEZYTopXZ[i][j][k] += dt * pmlEZYTopXZ[i][j][k];
	}
 }

void CradarFDTD::UpdatePMLHx(void)
{
  int i,j,k;
  PRECISION mudt = MU_0 / dt;
  PRECISION topY1, topY2, topZ1, topZ2; /* components which may be in different memory blocks than the one worked on */
  PRECISION commonFactor;
  
  /* speed up variables */
  int ny_plus_2pmlWidth = ny + 2*pmlWidth;
  int nz_plus_2pmlWidth = nz + 2*pmlWidth;

  int ny_plus_pmlWidth  = ny + pmlWidth;

  int pmlWidth_minus_1  = pmlWidth-1;

  int nz_minus_1        = nz-1;
  
  /* start with the YZ planes */

  /* there are no problems at any boundary ! */
  for(i=0; i<pmlWidth; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<nz_plus_2pmlWidth; k++)
	{ /* bottom */
	    
	    commonFactor =  mudt + 0.5 * pmlSigmaYStarBottomYZ[i][j][k];
	    pmlHXYBottomYZ[i][j][k] = pmlHXYBottomYZ[i][j][k] * 
	       (mudt - 0.5 * pmlSigmaYStarBottomYZ[i][j][k]) / commonFactor -
	      (pmlEZXBottomYZ[i][j+1][k] - pmlEZXBottomYZ[i][j][k] + 
	       pmlEZYBottomYZ[i][j+1][k] - pmlEZYBottomYZ[i][j][k]) / 
	      (dy * pmlSYBottomYZ[i][j][k] * commonFactor);
	    
	    commonFactor = mudt + 0.5 * pmlSigmaZStarBottomYZ[i][j][k];
	    pmlHXZBottomYZ[i][j][k] = pmlHXZBottomYZ[i][j][k] * 
	       (mudt - 0.5 * pmlSigmaZStarBottomYZ[i][j][k]) / commonFactor +
	      (pmlEYZBottomYZ[i][j][k+1] - pmlEYZBottomYZ[i][j][k] + 
	       pmlEYXBottomYZ[i][j][k+1] - pmlEYXBottomYZ[i][j][k]) /
	      (dz * pmlSZBottomYZ[i][j][k] * commonFactor);
	}
  /* top, there are no problems at any boundary */
  for(i=0; i<pmlWidth; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<nz_plus_2pmlWidth; k++)
	{
	    commonFactor =  mudt + 0.5 * pmlSigmaYStarBottomYZ[i][j][k];
	    pmlHXYTopYZ[i][j][k] = pmlHXYTopYZ[i][j][k] * 
	       (mudt - 0.5 * pmlSigmaYStarTopYZ[i][j][k]) / commonFactor -
	      (pmlEZXTopYZ[i][j+1][k] - pmlEZXTopYZ[i][j][k] + 
	       pmlEZYTopYZ[i][j+1][k] - pmlEZYTopYZ[i][j][k]) / 
	      (dy * pmlSYTopYZ[i][j][k] * commonFactor);
	    
	    commonFactor = mudt + 0.5 * pmlSigmaZStarTopYZ[i][j][k];
	    pmlHXZTopYZ[i][j][k] = pmlHXZTopYZ[i][j][k] * 
	       (mudt - 0.5 * pmlSigmaZStarTopYZ[i][j][k]) / commonFactor +
	      (pmlEYZTopYZ[i][j][k+1] - pmlEYZTopYZ[i][j][k] + 
	       pmlEYXTopYZ[i][j][k+1] - pmlEYXTopYZ[i][j][k]) /
	      (dz * pmlSZTopYZ[i][j][k] * commonFactor);

	}

  /* now the XY planes */

  for(i=0; i<nx; i++)
    for(j=0; j<ny_plus_2pmlWidth; j++)
      for(k=0; k<pmlWidth; k++)
	{ /* bottom */
	  /* there are three boundary-problems:
	     0           <= y < pmlWidth:     XZ - plane (bottom)
	     pmlWid

⌨️ 快捷键说明

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