我是物理专业的学生并且编写了用于模拟电磁波的代码。我在这里发布了我的一个代码,我的问题是如何改进我的代码。(而不是速度)
#include <iostream>
#include <vector>
#include <math.h>
#include <fstream>
using namespace std;
#define IE 100
#define JE 100
#define KE 100
double ***alloc3d(int l, int m, int n) {
double *data = new double [l*m*n];
double ***array = new double **[l];
for (int i=0; i<l; i++) {
array[i] = new double *[m];
for (int j=0; j<m; j++) {
array[i][j] = &(data[(i*m+j)*n]);
}
}
return array;
}
int main()
{
//////////////////////declartion/////////////////////////////
int const NFREQS=100,ia=7,ja=7,ka=7;
double const pi=3.14159;
int i,j;
double ***gax=alloc3d(IE,JE,KE);
double ***gay=alloc3d(IE,JE,KE);
double ***gaz=alloc3d(IE,JE,KE);
double ***gbx=alloc3d(IE,JE,KE);
double ***gby=alloc3d(IE,JE,KE);
double ***gbz=alloc3d(IE,JE,KE);
double ***dx=alloc3d(IE,JE,KE);
double ***dy=alloc3d(IE,JE,KE);
double ***dz=alloc3d(IE,JE,KE);
double ***ex=alloc3d(IE,JE,KE);
double ***ey=alloc3d(IE,JE,KE);
double ***ez=alloc3d(IE,JE,KE);
double ***sx=alloc3d(IE,JE,KE);
double ***sy=alloc3d(IE,JE,KE);
double ***sz=alloc3d(IE,JE,KE);
double ***hx=alloc3d(IE,JE,KE);
double ***hy=alloc3d(IE,JE,KE);
double ***hz=alloc3d(IE,JE,KE);
double ***ix=alloc3d(IE,JE,KE);
double ***iy=alloc3d(IE,JE,KE);
double ***iz=alloc3d(IE,JE,KE);
double ***idyl=alloc3d(IE,JE,KE);
double ***ihyl=alloc3d(IE,JE,KE);
double*** idxl=new double**[ia];
double*** idxh=new double**[ia];
double*** ihxl=new double**[ia];
double*** ihxh=new double**[ia];
for(i=0;i<ia;i++)
{
idxl[i]=new double *[JE];
idxh[i]=new double *[JE];
ihxl[i]=new double *[JE];
ihxh[i]=new double *[JE];
for(j=0;j<JE;j++)
{
idxl[i][j]=new double [KE];
idxh[i][j]=new double [KE];
ihxl[i][j]=new double [KE];
ihxh[i][j]=new double [KE];
}
}
double***idzl=new double**[IE];
double***idzh=new double**[IE];
double***ihzl=new double**[IE];
double***ihzh=new double**[IE];
for(i=0;i<IE;i++)
{
idzl[i]=new double *[JE];
idzh[i]=new double *[JE];
ihzl[i]=new double *[JE];
ihzh[i]=new double *[JE];
for(j=0;j<JE;j++){
idzl[i][j]=new double [ka];
idzh[i][j]=new double [ka];
ihzl[i][j]=new double [ka];
ihzh[i][j]=new double [ka];
}
}
double *gi1=new double [IE];
double *gi2=new double [IE];
double *gi3=new double [IE];
double *gj1=new double [JE];
double *gj2=new double [JE];
double *gj3=new double [JE];
double *gk1=new double [KE];
double *gk2=new double [KE];
double *gk3=new double [KE];
double *fi1=new double [IE];
double *fi2=new double [IE];
double *fi3=new double [IE];
double *fj1=new double [JE];
double *fj2=new double [JE];
double *fj3=new double [JE];
double *fk1=new double [KE];
double *fk2=new double [KE];
double *fk3=new double [KE];
int l,n,m,k,ic,jc,kc,nsteps,numsph,npml,ib,jb,kb,ixh,jyh,kzh,ke,percent;
double xn,xxn,xnum,xd,curl_e,curl_h,freqi,freqf;
double *ez_inc=new double [JE];
double *hx_inc=new double [JE];
double t0,spread,pulse;
double *freq=new double [NFREQS];
double *arg=new double [NFREQS];
double***real_pt=new double**[NFREQS];
double***imag_pt=new double**[NFREQS];
for(m=0;m<NFREQS;m++)
{
real_pt[m]=new double *[IE];
imag_pt[m]=new double *[IE];
for(i=0;i<IE;i++){
real_pt[m][i]=new double [JE];
imag_pt[m][i]=new double [JE];
}
}
double***real_pt_sx=new double**[NFREQS];
double***imag_pt_sx=new double**[NFREQS];
for(m=0;m<NFREQS;m++)
{
real_pt_sx[m]=new double *[IE];
imag_pt_sx[m]=new double *[IE];
for(i=0;i<IE;i++){
real_pt_sx[m][i]=new double [JE];
imag_pt_sx[m][i]=new double [JE];
}
}
double***real_pt_sy=new double**[NFREQS];
double***imag_pt_sy=new double**[NFREQS];
for(m=0;m<NFREQS;m++)
{
real_pt_sy[m]=new double *[IE];
imag_pt_sy[m]=new double *[IE];
for(i=0;i<IE;i++){
real_pt_sy[m][i]=new double [JE];
imag_pt_sy[m][i]=new double [JE];
}
}
double***real_pt_sz=new double**[NFREQS];
double***imag_pt_sz=new double**[NFREQS];
for(m=0;m<NFREQS;m++)
{
real_pt_sz[m]=new double *[IE];
imag_pt_sz[m]=new double *[IE];
for(i=0;i<IE;i++){
real_pt_sz[m][i]=new double [JE];
imag_pt_sz[m][i]=new double [JE];
}
}
double *real_in=new double[NFREQS];
double *imag_in=new double[NFREQS];
double *amp_in=new double[NFREQS];
double *phase_in=new double[NFREQS];
ic=IE/2;
jc=JE/2;
kc=KE/2;
ddx=2e-9;
dt=ddx/6e8;
epsz=8.8e-12;
ib=IE-ia-1;
jb=JE-ja-1;
kb=KE-ka-1;
/////////////////////////////initilization///////////////////////
ez_low_m2=0;
ez_high_m2=0;
ez_low_m1=0;
ez_high_m1=0;
for(j=0;j<JE;j++){
ez_inc[j]=0.0;
hx_inc[j]=0.0;
for(i=0;i<IE;i++){
}}
for (k=0;k<KE;k++){
for(j=0;j<JE;j++){
for(i=0;i<IE;i++){
ex[i][j][k]=0.0;
ey[i][j][k]=0.0;
ez[i][j][k]=0.0;
sx[i][j][k]=0.0;
sy[i][j][k]=0.0;
sz[i][j][k]=0.0;
ix[i][j][k]=0.0;
iy[i][j][k]=0.0;
iz[i][j][k]=0.0;
dx[i][j][k]=0.0;
dy[i][j][k]=0.0;
dz[i][j][k]=0.0;
hx[i][j][k]=0.0;
hy[i][j][k]=0.0;
hz[i][j][k]=0.0;
gax[i][j][k]=1.0;
gay[i][j][k]=1.0;
gaz[i][j][k]=1.0;
gbx[i][j][k]=0.0;
gby[i][j][k]=0.0;
gbz[i][j][k]=0.0;
idyl[i][j][k]=0.0;
ihyl[i][j][k]=0.0;
}}}
for(i=0;i<ia;i++){
for(j=0;j<JE;j++){
for(k=0;k<KE;k++){
idxl[i][j][k]=0.0;
idxh[i][j][k]=0.0;
ihxl[i][j][k]=0.0;
ihxh[i][j][k]=0.0;
}}}
for(i=0;i<IE;i++){
for(j=0;j<JE;j++){
for(k=0;k<ka;k++){
idzl[i][j][k]=0.0;
idzh[i][j][k]=0.0;
ihzl[i][j][k]=0.0;
ihzh[i][j][k]=0.0;
}}}
for(i=0;i<IE;i++){
gi1[i]=0.0;
fi1[i]=0.0;
gi2[i]=1.0;
fi2[i]=1.0;
gi3[i]=1.0;
fi3[i]=1.0;
}
for(j=0;j<JE;j++){
gj1[j]=0.0;
fj1[j]=0.0;
gj2[j]=1.0;
fj2[j]=1.0;
gj3[j]=1.0;
fj3[j]=1.0;
}
for(k=0;k<KE;k++){
gk1[k]=0.0;
fk1[k]=0.0;
gk2[k]=1.0;
fk2[k]=1.0;
gk3[k]=1.0;
fk3[k]=1.0;
}
for(n=0;n<NFREQS;n++){
real_in[n]=0.0;
imag_in[n]=0.0;
amp_in[n]=0.0;
phase_in[n]=0.0;
for(j=0;j<JE;j++){
for(i=0;i<IE;i++){
real_pt[n][i][j]=0.0;
imag_pt[n][i][j]=0.0;
real_pt_sx[n][i][j]=0.0;
imag_pt_sx[n][i][j]=0.0;
real_pt_sy[n][i][j]=0.0;
imag_pt_sy[n][i][j]=0.0;
real_pt_sz[n][i][j]=0.0;
imag_pt_sz[n][i][j]=0.0;
}}}
lambdai=200e-9;
lambdaf=700e-9;
freqi=2e8/lambdai;
freqf=7e8/lambdaf;
for(i=0;i<NFREQS;i++){
freq[i]=freqi-i*(freqi-freqf)/NFREQS;
}
for(n=0;n<NFREQS;n++){
arg[n]=2*pi*freq[n]*dt;
}
//////////////////////////antena//////////////////////////
t0=20.0;
spread =6.0;
T=0.0;
cout<<"enter time -->";
cin>>nsteps;
ke=0;
////////////*******************FDTD*******************///////////////////////
for (n=1;n<=nsteps;n++){
T=T+1;
percent=T/nsteps*100;
if (percent>=ke+1) {
cout<<percent<<"%"<<endl;
}
ke=percent;
/////////////////////source////////////////////
pulse=exp(-.5*(pow((t0-T)/spread,2.0)));
ez_inc[3]=pulse;
//////////////////ABC//////////////////////////////////
ez_inc[0]=ez_low_m2;
ez_low_m2=ez_low_m1;
ez_low_m1=ez_inc[1];
ez_inc[JE-1]=ez_high_m2;
ez_high_m2=ez_high_m1;
ez_high_m1=ez_inc[JE-2];
//////////////////////////update dx///////////////////////////////
for(i=1;i<ia;i++){
for(j=1;j<JE;j++){
for(k=1;k<KE;k++){
curl_h=(hz[i][j][k]-hz[i][j-1][k]-hy[i][j][k]+hy[i][j][k-1]);
idxl[i][j][k]=idxl[i][j][k]+curl_h;
dx[i][j][k]=x[i][j][k]+gj2[j]*gk2[k]*.5*(curl_h+gi1[i]*idxl[i][j][k]);
}}}
for(i=ia;i<=ib;i++){
for(j=1;j<JE;j++){
for(k=1;k<KE;k++){
curl_h=(hz[i][j][k]-hz[i][j-1][k]-hy[i][j][k]+hy[i][j][k-1]);
dx[i][j][k]=gj3[j]*gk3[k]*dx[i][j][k]+gj2[j]*gk2[k]*.5*curl_h;
}}}
for(i=ib+1;i<IE;i++){
ixh=IE-i-1;
for(j=1;j<JE;j++){
for(k=1;k<KE;k++){
curl_h=(hz[i][j][k]-hz[i][j-1][k]-hy[i][j][k]+hy[i][j][k-1]);
idxh[ixh][j][k]=idxh[ixh][j][k]+curl_h;
dx[i][j][k]=dx[i][j][k]+gj2[j]*gk2[k]*.5*(curl_h+gi1[i]*idxh[ixh][j][k]);
}}}
/////////////////////////update dy/////////////////////////////////
for(i=1;i<IE;i++){
for(j=1;j<JE;j++){
for(k=1;k<KE;k++){
curl_h=(hx[i][j][k]-hx[i][j][k-1]-hz[i][j][k]+hz[i-1][j][k]);
idyl[i][j][k]=idyl[i][j][k]+curl_h;
dy[i][j][k]=y[i][j][k]+gi2[i]*gk2[k]*.5*(curl_h+gj1[j]*idyl[i][j][k]);
}}}
////////////////////////update dz///////////////////////////////////
for(i=1;i<IE;i++){
for(j=1;j<JE;j++){
for(k=0;k<ka;k++){
curl_h=(hy[i][j][k]-hy[i-1][j][k]-hx[i][j][k]+hx[i][j-1][k]);
idzl[i][j][k]=idzl[i][j][k]+curl_h;
dz[i][j][k]=gi3[i]*gj3[j]*dz[i][j][k]+gi2[i]*gj2[j]*.5*(curl_h+gk1[k]*idzl[i][j][k]);
}}}
for(i=1;i<IE;i++){
for(j=1;j<JE;j++){
for(k=ka;k<=kb;k++){
curl_h=(hy[i][j][k]-hy[i-1][j][k]-hx[i][j][k]+hx[i][j-1][k]);
dz[i][j][k]=gi3[i]*gj3[j];
}}}
for(i=1;i<IE;i++){
for(j=1;j<JE;j++){
for(k=kb+1;k<KE;k++){
kzh=KE-k-1;
curl_h=(hy[i][j][k]-hy[i-1][j][k]-hx[i][j][k]+hx[i][j-1][k]);
idzh[i][j][kzh]=idzh[i][j][kzh]+curl_h;
dz[i][j][k]=gi3[i]*gj3[j]*dz[i][j][k]+
}}}
///////////////////////////////<<<<<<<<<incident dz>>>>>>>>>>>>>////////////////////////////
////////////////////////////source///////////////////////////
pulse=exp(-.5*(pow((t0-T)/spread,2.0)));
dz[ic][jc][kc]=pulse;
////////////////////////////////{{{{{{{{{{{update ex,ey,ez}}}}}}}}}}}}///////////////////////
for(i=1;i<IE-1;i++){
for(j=1;j<JE-1;j++){
for(k=1;k<KE-1;k++){
ex[i][j][k]=gax[i][j][k]*(dx[i][j][k]-ix[i][j][k]);
ix[i][j][k]=ix[i][j][k]+gbx[i][j][k]*ex[i][j][k];
ey[i][j][k]=gay[i][j][k]*(dy[i][j][k]-iy[i][j][k]);
iy[i][j][k]=iy[i][j][k]+gby[i][j][k]*ey[i][j][k];
ez[i][j][k]=gaz[i][j][k]*(dz[i][j][k]-iz[i][j][k]);
iz[i][j][k]=iz[i][j][k]+gbz[i][j][k]*ez[i][j][k];
}}}
//////////////////////////////update hx///////////////////////////////////
for(i=0;i<ia;i++){
for(j=0;j<JE-1;j++){
for(k=0;k<KE-1;k++){
curl_e=(ey[i][j][k+1]-ey[i][j][k]-ez[i][j+1][k]+ez[i][j][k]);
ihxl[i][j][k]=ihxl[i][j][k]+curl_e;
hx[i][j][k]=fj3[j]*fk3[k]*hx[i][j][k]+fj2[j]*fk2[k]*.5*(curl_e+fi1[i]*ihxl[i][j][k]);
}}}
for(i=ia;i<=ib;i++){
for(j=0;j<JE-1;j++){
for(k=0;k<KE-1;k++){
curl_e=(ey[i][j][k+1]-ey[i][j][k]-ez[i][j+1][k]+ez[i][j][k]);
hx[i][j][k]=.5*curl_e;
}}}
for(i=ib+1;i<IE;i++){
ixh=IE-i-1;
for(j=0;j<JE-1;j++){
for(k=0;k<KE-1;k++){
curl_e=(ey[i][j][k+1]-ey[i][j][k]-ez[i][j+1][k]+ez[i][j][k]);
ihxh[ixh][j][k]=ihxh[ixh][j][k]+curl_e;
fj3[j]*fk3[k]*hx[i][j][k]+fj2[j]*fk2[k]*.5*(curl_e+fi1[i]*ihxh[ixh][j][k]);
}}}
/////////////////////////////incident hx////////////////////////////////////
/*for(i=ia;i<=ib;i++){
for(k=ka;k<=kb;k++){
hx[i][ja-1][k]=hx[i][ja-1][k]+.5*ez_inc[ja];
hx[i][jb][k]=hx[i][jb][k]-.5*ez_inc[jb];
}
}*/
//////////////////////////////update hy/////////////////////////////////////
for(i=0;i<IE-1;i++){
for(j=0;j<JE;j++){
for(k=0;k<KE-1;k++){
curl_e=(ez[i+1][j][k]-ez[i][j][k]-ex[i][j][k+1]+ex[i][j][k]);
ihyl[i][j][k]=ihyl[i][j][k]+curl_e;
hy[i][j][k]=fi3[i]*fk3[k]*hy[i][j][k]+fi2[i]*fk2[k]*.5*(curl_e+fj1[j]*ihyl[i][j][k]);
}}}
/*for(i=0;i<IE-1;i++){
for(j=ja;j<=jb;j++){
for(k=0;k<KE-1;k++){
curl_e=(ez[i+1][j][k]-ez[i][j][k]-ex[i][j][k+1]+ex[i][j][k]);
hy[i][j][k]=fi3[i]*fk3[k]*hy[i][j][k]+fi2[i]*fk2[k]*.5*curl_e;
}}}
for(i=0;i<IE-1;i++){
for(j=jb+1;j<JE;j++){
jyh=JE-j-1;
for(k=0;k<KE-1;k++){
curl_e=(ez[i+1][j][k]-ez[i][j][k]-ex[i][j][k+1]+ex[i][j][k]);
ihyh[i][jyh][k]=ihyh[i][jyh][k]+curl_e;
hy[i][j][k]=fi3[i]*fk3[k]*hy[i][j][k]+fi2[i]*fk2[k]*.5*(curl_e+fj1[j]*ihyh[i][jyh][k]);
}}}*/
/////////////////////////////incident hy////////////////////////////////////
/*for(j=ja;j<=jb;j++){
for(k=ka;k<=kb;k++){
hy[ia-1][j][k]=hy[ia-1][j][k]-.5*ez_inc[j];
hy[ib][j][k] =hy[ib][j][k] +.5*ez_inc[j];
}
}*/
/////////////////////////////update hz////////////////////////////////////////
for(i=0;i<IE-1;i++){
for(j=0;j<JE-1;j++){
for(k=0;k<ka;k++){
curl_e=(ex[i][j+1][k]-ex[i][j][k]-ey[i+1][j][k]+ey[i][j][k]);
ihzl[i][j][k]=ihzl[i][j][k]+curl_e;
hz[i][j][k]=fi3[i]*fj3[j]*hz[i][j][k]+fi2[i]*fj2[j]*.5* (curl_e+fk1[k]*ihzl[i][j][k]);
}}}
for(i=0;i<IE-1;i++){
for(j=0;j<JE-1;j++){
for(k=ka;k<=kb;k++){
curl_e=(ex[i][j+1][k]-ex[i][j][k]-ey[i+1][j][k]+ey[i][j][k]);
hz[i][j][k]=fi3[i]*fj3[j]*hz[i][j][k]+fi2[i]*fj2[j]*.5*curl_e;
}}}
for(i=0;i<IE-1;i++){
for(j=0;j<JE-1;j++){
for(k=kb+1;k<KE;k++){
kzh=KE-k-1;
curl_e=(ex[i][j+1][k]-ex[i][j][k]-ey[i+1][j][k]+ey[i][j][k]);
ihzh[i][j][kzh]=ihzh[i][j][kzh]+curl_e;
hz[i][j][k]=fi3[i]*fj3[j]*hz[i][j][k]+fi2[i]*fj2[j]*.5*(curl_e+fk1[k]*ihzh[i][j][kzh]);
}}}
}//********************************END OF FDTD*******************************////////////
}
正如你所看到的,我的代码中充满了一些用于某些矩阵的for循环,我如何忽略for循环,例如我可以使用函数而不是编写for循环。我真的很感激任何建议。
答案 0 :(得分:8)
下载现有的图书馆,如GLM,Eigen,Boost.UBLAS,为您提供矩阵功能。
另外,请使用std::vector
。
答案 1 :(得分:4)
请首先使用单词表示变量而不是单个或双字母。我的本能是,我曾经遇到过这样的代码,就是要仔细地将事物重新命名为它们。如果事实证明这是不可能的,那就把它重写一下吧。
答案 2 :(得分:3)
立即想到三件事。
首先,更长,更具描述性的变量名称和/或常量。
l
,m
和n
之类的内容并未告诉我有关该变量的任何信息。
其次,更多评论。每个执行重要操作的块都应该有一个注释,指出它所处的高级 (不是如何,除了一般情况下,我可以读取代码来找出它)。
第三,我们没有缺少函数原型,因此您不必将每个语句都放入main()
: - )
如果单个函数占用超过大约50行(作为示例),它可能太长,并且应该调用更多子函数。)
答案 3 :(得分:0)
您的代码有多个想法。
第一个出现在我脑海中的人,为什么不使用matlab进行这样的数学模拟呢?
第二,我是电气工程专业的学生,因此我知道我对电磁波的公平分享。我真的会想到,如果我看到模拟波浪的代码,我至少会认出它的大纲。但我在你的代码中没有看到任何告诉我的东西。改善这一点:
double ***gax=alloc3d(IE,JE,KE);
你真的不应该使用三重指针。