📄 abc3dfirst.c
字号:
#include "fdtd-alloc.h"
#include "fdtd-macro.h"
/* Macros to access stored "old" value */
#define Eyx0(N,P) eyx0[(N)*(SizeZ)+(P)]
#define Ezx0(N,P) ezx0[(N)*(SizeZ-1)+(P)]
#define Eyx1(N,P) eyx1[(N)*(SizeZ)+(P)]
#define Ezx1(N,P) ezx1[(N)*(SizeZ-1)+(P)]
#define Exy0(M,P) exy0[(M)*(SizeZ)+(P)]
#define Ezy0(M,P) ezy0[(M)*(SizeZ-1)+(P)]
#define Exy1(M,P) exy1[(M)*(SizeZ)+(P)]
#define Ezy1(M,P) ezy1[(M)*(SizeZ-1)+(P)]
#define Exz0(M,N) exz0[(M)*(SizeY)+(N)]
#define Eyz0(M,N) eyz0[(M)*(SizeY-1)+(N)]
#define Exz1(M,N) exz1[(M)*(SizeY)+(N)]
#define Eyz1(M,N) eyz1[(M)*(SizeY-1)+(N)]
/* global variables not visible outside of this package */
static double abccoef=0.0;
static double *exy0, *exy1, *exz0, *exz1,
*eyx0, *eyx1, *eyz0, *eyz1,
*ezx0, *ezx1, *ezy0, *ezy1;
/* initialization function */
void abcInit(Grid *g)
{
abccoef = (Cdtds-1.0)/(Cdtds+1.0);
/* allocate memory for ABC arrays */
ALLOC_2D(eyx0,SizeY-1,SizeZ,double);
ALLOC_2D(ezx0,SizeY,SizeZ-1,double);
ALLOC_2D(eyx1,SizeY-1,SizeZ,double);
ALLOC_2D(ezx1,SizeY,SizeZ-1,double);
ALLOC_2D(exy0,SizeX-1,SizeZ,double);
ALLOC_2D(ezy0,SizeX,SizeZ-1,double);
ALLOC_2D(exy1,SizeX-1,SizeZ,double);
ALLOC_2D(ezy1,SizeX,SizeZ-1,double);
ALLOC_2D(exz0,SizeX-1,SizeY,double);
ALLOC_2D(eyz0,SizeX,SizeY-1,double);
ALLOC_2D(exz1,SizeX-1,SizeY,double);
ALLOC_2D(eyz1,SizeX,SizeY-1,double);
return;
} /* end abcInit() */
/* function that applies ABC -- called once per time step */
void abc(Grid *g)
{
int mm, nn, pp;
if (abccoef==0.0) {
fprintf(stderr,
"abc: abcInit must be called before abc. Terminating...\n");
exit(-1);
}
/* ABC at "x0" */
mm=0;
for (nn=0; nn<SizeY-1; nn++)
for (pp=0; pp<SizeZ; pp++) {
Ey(mm,nn,pp) = Eyx0(nn,pp) + abccoef*(Ey(mm+1,nn,pp)-Ey(mm,nn,pp));
Eyx0(nn,pp) = Ey(mm+1,nn,pp);
}
for (nn=0; nn<SizeY; nn++)
for (pp=0; pp<SizeZ-1; pp++) {
Ez(mm,nn,pp) = Ezx0(nn,pp) + abccoef*(Ez(mm+1,nn,pp)-Ez(mm,nn,pp));
Ezx0(nn,pp) = Ez(mm+1,nn,pp);
}
/* ABC at "x1" */
mm=SizeX-1;
for (nn=0; nn<SizeY-1; nn++)
for (pp=0; pp<SizeZ; pp++) {
Ey(mm,nn,pp) = Eyx1(nn,pp) + abccoef*(Ey(mm-1,nn,pp)-Ey(mm,nn,pp));
Eyx1(nn,pp) = Ey(mm-1,nn,pp);
}
for (nn=0; nn<SizeY; nn++)
for (pp=0; pp<SizeZ-1; pp++) {
Ez(mm,nn,pp) = Ezx1(nn,pp) + abccoef*(Ez(mm-1,nn,pp)-Ez(mm,nn,pp));
Ezx1(nn,pp) = Ez(mm-1,nn,pp);
}
/* ABC at "y0" */
nn=0;
for (mm=0; mm<SizeX-1; mm++)
for (pp=0; pp<SizeZ; pp++) {
Ex(mm,nn,pp) = Exy0(mm,pp) + abccoef*(Ex(mm,nn+1,pp)-Ex(mm,nn,pp));
Exy0(mm,pp) = Ex(mm,nn+1,pp);
}
for (mm=0; mm<SizeX; mm++)
for (pp=0; pp<SizeZ-1; pp++) {
Ez(mm,nn,pp) = Ezy0(mm,pp) + abccoef*(Ez(mm,nn+1,pp)-Ez(mm,nn,pp));
Ezy0(mm,pp) = Ez(mm,nn+1,pp);
}
/* ABC at "y1" */
nn=SizeY-1;
for (mm=0; mm<SizeX-1; mm++)
for (pp=0; pp<SizeZ; pp++) {
Ex(mm,nn,pp) = Exy1(mm,pp) + abccoef*(Ex(mm,nn-1,pp)-Ex(mm,nn,pp));
Exy1(mm,pp) = Ex(mm,nn-1,pp);
}
for (mm=0; mm<SizeX; mm++)
for (pp=0; pp<SizeZ-1; pp++) {
Ez(mm,nn,pp) = Ezy1(mm,pp) + abccoef*(Ez(mm,nn-1,pp)-Ez(mm,nn,pp));
Ezy1(mm,pp) = Ez(mm,nn-1,pp);
}
/* ABC at "z0" (bottom) */
pp=0;
for (mm=0; mm<SizeX-1; mm++)
for (nn=0; nn<SizeY; nn++) {
Ex(mm,nn,pp) = Exz0(mm,nn) + abccoef*(Ex(mm,nn,pp+1)-Ex(mm,nn,pp));
Exz0(mm,nn) = Ex(mm,nn,pp+1);
}
for (mm=0; mm<SizeX; mm++)
for (nn=0; nn<SizeY-1; nn++) {
Ey(mm,nn,pp) = Eyz0(mm,nn) + abccoef*(Ey(mm,nn,pp+1)-Ey(mm,nn,pp));
Eyz0(mm,nn) = Ey(mm,nn,pp+1);
}
/* ABC at "z1" (top) */
pp=SizeZ-1;
for (mm=0; mm<SizeX-1; mm++)
for (nn=0; nn<SizeY; nn++) {
Ex(mm,nn,pp) = Exz1(mm,nn) + abccoef*(Ex(mm,nn,pp-1)-Ex(mm,nn,pp));
Exz1(mm,nn) = Ex(mm,nn,pp-1);
}
for (mm=0; mm<SizeX; mm++)
for (nn=0; nn<SizeY-1; nn++) {
Ey(mm,nn,pp) = Eyz1(mm,nn) + abccoef*(Ey(mm,nn,pp-1)-Ey(mm,nn,pp));
Eyz1(mm,nn) = Ey(mm,nn,pp-1);
}
return;
} /* end abc() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -