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

📄 fdtd.cpp

📁 应用FDTD方法计算微带传输结构的C++程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          if (k > HEIGHT)
            Ey(i,j,k) = Ey(i,j,k) + 
              coefE0*((Hx(i,j,k)-Hx(i,j,k-1)) - (Hz(i,j,k)-Hz(i-1,j,k)));
          else if (k == HEIGHT)
            Ey(i,j,k) = Ey(i,j,k) + 
              coefE01*((Hx(i,j,k)-Hx(i,j,k-1)) - (Hz(i,j,k)-Hz(i-1,j,k)));
          else
            Ey(i,j,k) = Ey(i,j,k) + 
              coefE1*((Hx(i,j,k)-Hx(i,j,k-1)) - (Hz(i,j,k)-Hz(i-1,j,k)));
    
#ifdef PATCH
    /* Zero Ey on metal. */
    k=HEIGHT;
    /* First the feed strip. */
    for (i=LINE_X_START; i<=LINE_X_END; i++)
      for (j=0; j<LIMY/2-10; j++)
        Ey(i,j,k) = 0.0;
    /* Next the patch. */
    for (i=PATCH_X_START; i<=PATCH_X_END; i++)
      for (j=PATCH_Y_START; j<PATCH_Y_END; j++)
        Ey(i,j,k) = 0.0;
#else
    /* Zero Ey on metal microstrip. */
    k=HEIGHT;
    for (i=LINE_X_START; i<=LINE_X_END; i++)
      for (j=0; j<LIMY; j++)
        Ey(i,j,k) = 0.0;
#endif

#ifdef ABC1
    /* ABC on left wall */
    /* Ey above substrate */
    i = 0;
    for (j=0; j<LIMY-1; j++) {
      for (k=HEIGHT+1; k<LIMZ; k++) {
        Ey(i,j,k) = c10*(Ey(i+2,j,k)+Eyleft(i,j,k,1))
          + c20*(Eyleft(i,j,k,0) + Eyleft(i+2,j,k,0) - Ey(i+1,j,k)
          - Eyleft(i+1,j,k,1))  + c30*Eyleft(i+1,j,k,0) - Eyleft(i+2,j,k,1);
      
        for(ii=0; ii<3; ii++) {
          Eyleft(ii,j,k,1) = Eyleft(ii,j,k,0);
          Eyleft(ii,j,k,0) = Ey(ii,j,k);
        }
      }
    }
    /* Ey at substrate */
    i=0;
    for (j=0; j<LIMY-1; j++) {
      k=HEIGHT;
      Ey(i,j,k) = c101*(Ey(i+2,j,k)+Eyleft(i,j,k,1))
        + c201*(Eyleft(i,j,k,0) + Eyleft(i+2,j,k,0) - Ey(i+1,j,k)
        - Eyleft(i+1,j,k,1))  + c301*Eyleft(i+1,j,k,0) - Eyleft(i+2,j,k,1);
      
      for(ii=0; ii<3; ii++) {
        Eyleft(ii,j,k,1) = Eyleft(ii,j,k,0);
        Eyleft(ii,j,k,0) = Ey(ii,j,k);
      }
    }
    /* Ey below substrate */
    i=0;
    for (j=0; j<LIMY-1; j++) {
      for (k=1; k<HEIGHT; k++) {
        Ey(i,j,k) = c11*(Ey(i+2,j,k)+Eyleft(i,j,k,1))
          + c21*(Eyleft(i,j,k,0) + Eyleft(i+2,j,k,0) - Ey(i+1,j,k)
          - Eyleft(i+1,j,k,1))  + c31*Eyleft(i+1,j,k,0) - Eyleft(i+2,j,k,1);
      
        for(ii=0; ii<3; ii++) {
          Eyleft(ii,j,k,1) = Eyleft(ii,j,k,0);
          Eyleft(ii,j,k,0) = Ey(ii,j,k);
        }
      }
    }
#endif

#ifdef ABC3
    /* ABC on right wall */
    /* Ey above substrate */
    i = LIMX-1;
    for (j=0; j<LIMY-1; j++) {
      for (k=HEIGHT+1; k<LIMZ; k++) {
        Ey(i,j,k) = c10*(Ey(i-2,j,k)+Eyright(i,j,k,1))
          + c20*(Eyright(i,j,k,0) + Eyright(i-2,j,k,0) - Ey(i-1,j,k)
          - Eyright(i-1,j,k,1))  + c30*Eyright(i-1,j,k,0) - Eyright(i-2,j,k,1);
      
        for(ii=LIMX-3; ii<LIMX; ii++) {
          Eyright(ii,j,k,1) = Eyright(ii,j,k,0);
          Eyright(ii,j,k,0) = Ey(ii,j,k);
        }
      }
    }
    /* Ey at substrate */
    i=LIMX-1;
    for (j=0; j<LIMY-1; j++) {
      k=HEIGHT;
      Ey(i,j,k) = c101*(Ey(i-2,j,k)+Eyright(i,j,k,1))
        + c201*(Eyright(i,j,k,0) + Eyright(i-2,j,k,0) - Ey(i-1,j,k)
        - Eyright(i-1,j,k,1))  + c301*Eyright(i-1,j,k,0) - Eyright(i-2,j,k,1);
      
      for(ii=LIMX-3; ii<LIMX; ii++) {
        Eyright(ii,j,k,1) = Eyright(ii,j,k,0);
        Eyright(ii,j,k,0) = Ey(ii,j,k);
      }
    }
    /* Ey below substrate */
    i=LIMX-1;
    for (j=0; j<LIMY-1; j++) {
      for (k=1; k<HEIGHT; k++) {
        Ey(i,j,k) = c11*(Ey(i-2,j,k)+Eyright(i,j,k,1))
          + c21*(Eyright(i,j,k,0) + Eyright(i-2,j,k,0) - Ey(i-1,j,k)
          - Eyright(i-1,j,k,1))  + c31*Eyright(i-1,j,k,0) - Eyright(i-2,j,k,1);
      
        for(ii=LIMX-3; ii<LIMX; ii++) {
          Eyright(ii,j,k,1) = Eyright(ii,j,k,0);
          Eyright(ii,j,k,0) = Ey(ii,j,k);
        }
      }
    }
#endif

#ifdef ABC5
    /* ABC at top */
    for (i=0; i<LIMX; i++)
      for (j=0; j<LIMY-1; j++) {
        k=LIMZ-1;
        Ey(i,j,k) = c10*(Ey(i,j,k-2)+Eytop(i,j,k,1))
          + c20*(Eytop(i,j,k,0) + Eytop(i,j,k-2,0) - Ey(i,j,k-1)
          - Eytop(i,j,k-1,1))  + c30*Eytop(i,j,k-1,0) - Eytop(i,j,k-2,1);
      
        for(kk=LIMZ-3; kk<LIMZ; kk++) {
          Eytop(i,j,kk,1) = Eytop(i,j,kk,0);
          Eytop(i,j,kk,0) = Ey(i,j,kk);
        }
      }
#endif

    /************ Ez update. *************/
    for (i=1; i<LIMX-1; i++)
      for (j=1; j<LIMY-1; j++)
        for (k=0; k<LIMZ-1; k++)
          if (k > HEIGHT)
            Ez(i,j,k) = Ez(i,j,k)
              + coefE0*((Hy(i,j,k)-Hy(i-1,j,k)) - (Hx(i,j,k)-Hx(i,j-1,k)));
          else
            Ez(i,j,k) = Ez(i,j,k)
              + coefE1*((Hy(i,j,k)-Hy(i-1,j,k))        - (Hx(i,j,k)-Hx(i,j-1,k)));
    
#ifdef ABC4
    if (ntime<SWITCH_SRC) {
#endif
    /* Ez update on "near" wall. */
    j = 0;
    for (i=1; i<LIMX; i++)
      for (k=0; k<LIMZ; k++)
        if (k > HEIGHT)
          Ez(i,j,k) = Ez(i,j,k)
            + coefE0*((Hy(i,j,k)-Hy(i-1,j,k)) - 2.0*Hx(i,j,k));
        else
          Ez(i,j,k) = Ez(i,j,k)
            + coefE1*((Hy(i,j,k)-Hy(i-1,j,k)) - 2.0*Hx(i,j,k));
    
    /* source at y=0 wall of computational domain */
    holdez = gaussian(ntime, cdtds,  PPW)/3.0;
    j=0;
    for (i=LINE_X_START; i<=LINE_X_END; i++)
      for (k=0; k<HEIGHT; k++)
        Ez(i,j,k) = holdez;
    /* Ez(i,j,k) = Ez(i,j,k) + holdez; */
#ifdef ABC4
    }
#endif

#ifdef ABC1
    /* ABC on left wall */
    /* Ez above substrate */
    i = 0;
    for (j=0; j<LIMY-1; j++) {
      for (k=HEIGHT; k<LIMZ; k++) {
        Ez(i,j,k) = c10*(Ez(i+2,j,k)+Ezleft(i,j,k,1))
          + c20*(Ezleft(i,j,k,0) + Ezleft(i+2,j,k,0) - Ez(i+1,j,k)
          - Ezleft(i+1,j,k,1))  + c30*Ezleft(i+1,j,k,0) - Ezleft(i+2,j,k,1);
      
      for(ii=0; ii<3; ii++) {
          Ezleft(ii,j,k,1) = Ezleft(ii,j,k,0);
          Ezleft(ii,j,k,0) = Ez(ii,j,k);
        }
      }
    }
    /* Ez below substrate */
    i=0;
    for (j=0; j<LIMY-1; j++) {
      for (k=0; k<HEIGHT; k++) {
        Ez(i,j,k) = c11*(Ez(i+2,j,k)+Ezleft(i,j,k,1))
          + c21*(Ezleft(i,j,k,0) + Ezleft(i+2,j,k,0) - Ez(i+1,j,k)
          - Ezleft(i+1,j,k,1))  + c31*Ezleft(i+1,j,k,0) - Ezleft(i+2,j,k,1);
      
        for(ii=0; ii<3; ii++) {
          Ezleft(ii,j,k,1) = Ezleft(ii,j,k,0);
          Ezleft(ii,j,k,0) = Ez(ii,j,k);
        }
      }
    }
#endif

#ifdef ABC2
    /* ABC at far wall */
    /* Ez above substrate */
    for (i=0; i<LIMX-1; i++) {
      j=LIMY-1;
      for (k=HEIGHT; k<LIMZ; k++) {
        Ez(i,j,k) = c10*(Ez(i,j-2,k)+Ezfar(i,j,k,1))
          + c20*(Ezfar(i,j,k,0) + Ezfar(i,j-2,k,0) - Ez(i,j-1,k)
          - Ezfar(i,j-1,k,1))  + c30*Ezfar(i,j-1,k,0) - Ezfar(i,j-2,k,1);
      
        for(jj=LIMY-3; jj<LIMY; jj++) {
          Ezfar(i,jj,k,1) = Ezfar(i,jj,k,0);
          Ezfar(i,jj,k,0) = Ez(i,jj,k);
        }
      }
    }
    /* Ez below substrate */
    for (i=0; i<LIMX-1; i++) {
      j=LIMY-1;
      for (k=0; k<HEIGHT; k++) {
        Ez(i,j,k) = c11*(Ez(i,j-2,k)+Ezfar(i,j,k,1))
          + c21*(Ezfar(i,j,k,0) + Ezfar(i,j-2,k,0) - Ez(i,j-1,k)
          - Ezfar(i,j-1,k,1))  + c31*Ezfar(i,j-1,k,0) - Ezfar(i,j-2,k,1);
      
        for(jj=LIMY-3; jj<LIMY; jj++) {
          Ezfar(i,jj,k,1) = Ezfar(i,jj,k,0);
          Ezfar(i,jj,k,0) = Ez(i,jj,k);
        }
      }
    }
#endif

#ifdef ABC4
    /* ABC at near wall -- only apply after source introduced */
    if (ntime >= SWITCH_SRC) {
      /* Ez above substrate */
      for (i=0; i<LIMX-1; i++) {
        j=0;
        for (k=HEIGHT; k<LIMZ; k++) {
          Ez(i,j,k) = Eznear(i,j+1,k,0) + c40*(Ez(i,j+1,k) - Ez(i,j,k));
          /* Ez(i,j,k) = c10*(Ez(i,j+2,k)+Eznear(i,j,k,1))
            + c20*(Eznear(i,j,k,0) + Eznear(i,j+2,k,0) - Ez(i,j+1,k)
            - Eznear(i,j+1,k,1))  + c30*Eznear(i,j+1,k,0) - Eznear(i,j+2,k,1);
          */

          for(jj=2; jj>=0; jj--) {
            Eznear(i,jj,k,1) = Eznear(i,jj,k,0);
            Eznear(i,jj,k,0) = Ez(i,jj,k);
          }
        }
      }
      /* Ez below substrate */
      for (i=0; i<LIMX-1; i++) {
        j=0;
        for (k=0; k<HEIGHT; k++) {
          Ez(i,j,k) = Eznear(i,j+1,k,0) + c41*(Ez(i,j+1,k) - Ez(i,j,k));
          /* 
          Ez(i,j,k) = c11*(Ez(i,j+2,k)+Eznear(i,j,k,1))
            + c21*(Eznear(i,j,k,0) + Eznear(i,j+2,k,0) - Ez(i,j+1,k)
            - Eznear(i,j+1,k,1))  + c31*Eznear(i,j+1,k,0) - Eznear(i,j+2,k,1);
          */

          for(jj=2; jj>=0; jj--) {
            Eznear(i,jj,k,1) = Eznear(i,jj,k,0);
            Eznear(i,jj,k,0) = Ez(i,jj,k);
          }
        }
      }
    }
#endif

#ifdef ABC3
    /* ABC on right wall */
    /* Ez above substrate */
    i = LIMX-1;
    for (j=0; j<LIMY-1; j++) {
      for (k=HEIGHT; k<LIMZ; k++) {
        Ez(i,j,k) = c10*(Ez(i-2,j,k)+Ezright(i,j,k,1))
          + c20*(Ezright(i,j,k,0) + Ezright(i-2,j,k,0) - Ez(i-1,j,k)
          - Ezright(i-1,j,k,1))  + c30*Ezright(i-1,j,k,0) - Ezright(i-2,j,k,1);
      
        for(ii=LIMX-3; ii<LIMX; ii++) {
          Ezright(ii,j,k,1) = Ezright(ii,j,k,0);
          Ezright(ii,j,k,0) = Ez(ii,j,k);
        }
      }
    }
    /* Ez below substrate */
    i=LIMX-1;
    for (j=0; j<LIMY-1; j++) {
      for (k=0; k<HEIGHT; k++) {
        Ez(i,j,k) = c11*(Ez(i-2,j,k)+Ezright(i,j,k,1))
          + c21*(Ezright(i,j,k,0) + Ezright(i-2,j,k,0) - Ez(i-1,j,k)
          - Ezright(i-1,j,k,1))  + c31*Ezright(i-1,j,k,0) - Ezright(i-2,j,k,1);
      
        for(ii=LIMX-3; ii<LIMX; ii++) {
          Ezright(ii,j,k,1) = Ezright(ii,j,k,0);
          Ezright(ii,j,k,0) = Ez(ii,j,k);
        }
      }
    }
#endif


    /************ Hx update. ************/
    for (i=0; i<LIMX; i++)
      for (j=0; j<LIMY-1; j++)
        for (k=0; k<LIMZ-1; k++)
          Hx(i,j,k) = Hx(i,j,k) 
            + coefH*((Ey(i,j,k+1)-Ey(i,j,k)) - (Ez(i,j+1,k)-Ez(i,j,k)));
    
    /************ Hy update. ************/
    for (i=0; i<LIMX-1; i++)
      for (j=0; j<LIMY; j++)
        for (k=0; k<LIMZ-1; k++)
          Hy(i,j,k) = Hy(i,j,k) 
            + coefH*((Ez(i+1,j,k)-Ez(i,j,k)) - (Ex(i,j,k+1)-Ex(i,j,k)));
    
    /************ Hz update. ************/
    for (i=0; i<LIMX-1; i++)
      for (j=0; j<LIMY-1; j++)
        for (k=0; k<LIMZ; k++)
          Hz(i,j,k) = Hz(i,j,k) 
            + coefH*((Ex(i,j+1,k)-Ex(i,j,k)) - (Ey(i+1,j,k)-Ey(i,j,k)));
    
    fprintf(obs,"%f\n",Ez((LINE_X_START+LINE_X_END)/2,PATCH_Y_START-10,2));

  }

  fclose(obs);
  return 0;

}
/* ------------------------- end of main ------------------------- */

/* ########################## gaussian ########################### */
/* Gaussian pulse.
*/
double gaussian(int ntime, double cdtds, int ippw) {
  double arg, time;
  time = (double)(ntime);
  arg = pow(M_PI*(cdtds*time/(double)(ippw)-1.),2);
  /* If the argument is greater than 70.0, the result is so small we
     may as well skip calculating the exponential and return zero. */
  if (arg > 70.0) {
    return 0.0;
  } else {
    return exp(-arg);
  }
}
/* ------------------------ end of gaussian ------------------------ */

/* ########################### init ############################# */
void init() {

  int i, j, k;

  /* Initialize all fields. */
  /* Ex. */
  for (k=0;k<LIMZ;k++)
    for (j=0;j<LIMY;j++)
      for (i=0;i<LIMX;i++)
        Ex(i,j,k) = 0.;

  /* Ey. */
  for (k=0;k<LIMZ;k++)
    for (j=0;j<LIMY;j++)
      for (i=0;i<LIMX;i++)
        Ey(i,j,k) = 0.;

  /* Ez. */
  for (k=0;k<LIMZ;k++)
    for (j=0;j<LIMY;j++)
      for (i=0;i<LIMX;i++)
        Ez(i,j,k) = 0.;

  /* Hx. */
  for (k=0;k<LIMZ;k++)
    for (j=0;j<LIMY;j++)
      for (i=0;i<LIMX;i++)
        Hx(i,j,k) = 0.;

  /* Hy. */
  for (i=0;i<LIMX;i++)
    for (j=0;j<LIMY; j++)
      for (k=0; k<LIMZ; k++)
        Hy(i,j,k) = 0.;

  /* Hz. */
  for (i=0; i<LIMX; i++)
    for (j=0; j<LIMY; j++)
      for (k=0; k<LIMZ; k++)
        Hz(i,j,k) = 0.;

  /* ABC arrays */
  for (i=0; i<LIMX; i++)
    for(j=LIMY-3; j<LIMY; j++)
      for(k=0; k<LIMZ; k++) {
        Exfar(i,j,k,0) = 0.0;
        Exfar(i,j,k,1) = 0.0;
        Ezfar(i,j,k,0) = 0.0;
        Ezfar(i,j,k,1) = 0.0;
        Exnear(i,j,k,0) = 0.0;
        Exnear(i,j,k,1) = 0.0;
        Eznear(i,j,k,0) = 0.0;
        Eznear(i,j,k,1) = 0.0;
      }

  for (i=0; i<3; i++)
    for(j=0; j<LIMY; j++)
      for(k=0; k<LIMZ; k++) {
        Eyleft(i,j,k,0) = 0.0;
        Eyleft(i,j,k,1) = 0.0;
        Ezleft(i,j,k,0) = 0.0;
        Ezleft(i,j,k,1) = 0.0;
      }

  for (i=0; i<LIMX; i++)
    for(j=0; j<LIMY; j++)
      for(k=0; k<3; k++) {
        Extop(i,j,k,0) = 0.0;
        Extop(i,j,k,1) = 0.0;
        Eytop(i,j,k,0) = 0.0;
        Eytop(i,j,k,1) = 0.0;
      }

  for (i=LIMX-3; i<LIMX; i++)
    for(j=0; j<LIMY; j++)
      for(k=0; k<LIMZ; k++) {
        Eyright(i,j,k,0) = 0.0;
        Eyright(i,j,k,1) = 0.0;
        Ezright(i,j,k,0) = 0.0;
        Ezright(i,j,k,1) = 0.0;
      }

}
/* ------------------------- end of init ------------------------ */

⌨️ 快捷键说明

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