奇怪的 error/result 当 运行 代码... C fdtd 方法
Weird error/result when running code... C fdtd method
每当我启动一个 for 循环来给一个数组赋值时,它会在另一个循环中修改结果,尽管在那个循环中没有被调用...问题来自 epsR...不知何故 commenting/uncommenting 它更改时间步长循环的结果(计算 elec/mag 字段)。为什么?当带有 espR 的 for 循环和 if 语句被注释掉时,结果很好。如果没有注释掉,我会得到毫无意义的结果!
会不会是内存损坏?我看不出是什么导致了这个问题。
#include <stdio.h>
#include <math.h>
#define SIZE 200
int main()
{
double ez[SIZE]={0.}, hy[SIZE]={0.}, imp0=377.0;
double epsR[SIZE];
int qTime, maxTime=650, mm;
char basename[80]="sim", filename[100];
int frame=0;
FILE *snapshot;
/* Init */
for (mm=0;mm<SIZE;mm++){
ez[mm]=0.0;
}
for (mm=0;mm<SIZE-1;mm++){
hy[mm]=0.0;
}
/* Leaving this loop uncommented modifies the results
of the loop time stepping*/
for (mm=0;mm<SIZE;mm++){
if (mm<100){
epsR[mm]=1.0;
}
else {
epsR[mm]=9.0;
}
}
/* time stepping*/
for (qTime=0; qTime<maxTime;qTime++){
/*Mag field*/
hy[SIZE-1]=hy[SIZE-2];
for (mm=0;mm<SIZE-1;mm++){
hy[mm]=hy[mm]+(ez[mm+1]-ez[mm])/imp0;
}
hy[49]-=exp(-(qTime-30.)*(qTime-30.)/100.)/imp0;
/*Elec field*/
ez[0]=ez[1];
ez[SIZE-1]=ez[SIZE-2];
for (mm=0;mm<SIZE;mm++){
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
ez[50]+=exp(-(qTime+0.5-(-0.5)-30.)*(qTime+0.5-(-0.5)-30.0)/100.);
/*Write*/
if (qTime % 10==0){
sprintf(filename,"%s.%d", basename, frame++);
snapshot=fopen(filename,"w");
for (mm=0;mm<SIZE;mm++){
fprintf(snapshot,"%g\n",ez[mm]);
}
fclose(snapshot);
}
}
return 0;
}
在此循环中:
for (mm=0;mm<SIZE;mm++){
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
在第一次迭代中,mm == 0
所以 hy[mm-1]
是 hy[-1]
,这是越界未定义的行为。这意味着任何事情都可能发生,因为它正在访问随机数据。
如果您希望它访问最后一个元素,请像这样检查:
for (mm=0;mm<SIZE;mm++){
if(mm==0) {
ez[0]=ez[0]+(hy[0]-hy[SIZE - 1])*imp0/9.0;
} else {
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
}
每当我启动一个 for 循环来给一个数组赋值时,它会在另一个循环中修改结果,尽管在那个循环中没有被调用...问题来自 epsR...不知何故 commenting/uncommenting 它更改时间步长循环的结果(计算 elec/mag 字段)。为什么?当带有 espR 的 for 循环和 if 语句被注释掉时,结果很好。如果没有注释掉,我会得到毫无意义的结果!
会不会是内存损坏?我看不出是什么导致了这个问题。
#include <stdio.h>
#include <math.h>
#define SIZE 200
int main()
{
double ez[SIZE]={0.}, hy[SIZE]={0.}, imp0=377.0;
double epsR[SIZE];
int qTime, maxTime=650, mm;
char basename[80]="sim", filename[100];
int frame=0;
FILE *snapshot;
/* Init */
for (mm=0;mm<SIZE;mm++){
ez[mm]=0.0;
}
for (mm=0;mm<SIZE-1;mm++){
hy[mm]=0.0;
}
/* Leaving this loop uncommented modifies the results
of the loop time stepping*/
for (mm=0;mm<SIZE;mm++){
if (mm<100){
epsR[mm]=1.0;
}
else {
epsR[mm]=9.0;
}
}
/* time stepping*/
for (qTime=0; qTime<maxTime;qTime++){
/*Mag field*/
hy[SIZE-1]=hy[SIZE-2];
for (mm=0;mm<SIZE-1;mm++){
hy[mm]=hy[mm]+(ez[mm+1]-ez[mm])/imp0;
}
hy[49]-=exp(-(qTime-30.)*(qTime-30.)/100.)/imp0;
/*Elec field*/
ez[0]=ez[1];
ez[SIZE-1]=ez[SIZE-2];
for (mm=0;mm<SIZE;mm++){
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
ez[50]+=exp(-(qTime+0.5-(-0.5)-30.)*(qTime+0.5-(-0.5)-30.0)/100.);
/*Write*/
if (qTime % 10==0){
sprintf(filename,"%s.%d", basename, frame++);
snapshot=fopen(filename,"w");
for (mm=0;mm<SIZE;mm++){
fprintf(snapshot,"%g\n",ez[mm]);
}
fclose(snapshot);
}
}
return 0;
}
在此循环中:
for (mm=0;mm<SIZE;mm++){
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
在第一次迭代中,mm == 0
所以 hy[mm-1]
是 hy[-1]
,这是越界未定义的行为。这意味着任何事情都可能发生,因为它正在访问随机数据。
如果您希望它访问最后一个元素,请像这样检查:
for (mm=0;mm<SIZE;mm++){
if(mm==0) {
ez[0]=ez[0]+(hy[0]-hy[SIZE - 1])*imp0/9.0;
} else {
ez[mm]=ez[mm]+(hy[mm]-hy[mm-1])*imp0/9.0;
}
}