- 締切済み
FDTD法を用いた電磁界解析にOpenMPを導入
FDTD法を用いた電磁界解析にOpenMPを導入するにはどうしたらよいのでしょうか? ちなみに3次元のプログラムを作成しており、電磁界解析のエンジン部分は下記の様になっています。 for( kt=0; kt<=it ; kt++) { /* ※※※forの括弧開始※※※ */ /*********** 1ステップ前の電磁界[jt-1]の値の定式 ***********/ for( jx=0; jx<=ix; jx++ ) for( jy=0; jy<=iy; jy++ ) for( jz=0; jz<=iz; jz++ ) { exg[jx][jy][jz] = ex[jx][jy][jz]; eyg[jx][jy][jz] = ey[jx][jy][jz]; ezg[jx][jy][jz] = ez[jx][jy][jz]; } /*********** 磁界(hx)の計算 ***********/ for( jx=0; jx<=ix; jx++ ) for( jy=0; jy<=iy-1; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double dey = (ey[jx][jy][jz+1]-ey[jx][jy][jz])/dz; double dez = (ez[jx][jy+1][jz]-ez[jx][jy][jz])/dy; hx[jx][jy][jz] = hx[jx][jy][jz]+dt/amuy[jx][jy][jz]*(dey-dez); } /*********** 磁界(hy)の計算 ***********/ for( jx=0; jx<=ix-1; jx++ ) for( jy=0; jy<=iy; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double dez = (ez[jx+1][jy][jz]-ez[jx][jy][jz])/dx; double dex = (ex[jx][jy][jz+1]-ex[jx][jy][jz])/dz; hy[jx][jy][jz] = hy[jx][jy][jz]+dt/amuz[jx][jy][jz]*(dez-dex); } /*********** 磁界(hz)の計算 ***********/ for( jx=0; jx<=ix-1; jx++ ) for( jy=0; jy<=iy-1; jy++ ) for( jz=0; jz<=iz; jz++ ) { double dex = (ex[jx][jy+1][jz]-ex[jx][jy][jz])/dy; double dey = (ey[jx+1][jy][jz]-ey[jx][jy][jz])/dx; hz[jx][jy][jz] = hz[jx][jy][jz]+dt/amuz[jx][jy][jz]*(dex-dey); } /*********** 励振 ***********/ for( jx=1; jx<=ix-1; jx++ ) for( jz=1; jz<=iz-2; jz++ ) { ez[jx][80][jz] = sin( 2.0*pi*(kt%100)/100 )*sin(pi*float(jx)/float(ix)); } /*********** 電界(Ez)の計算 ***********/ for( jx=1; jx<=ix-1; jx++ ) for( jy=1; jy<=iy-1; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double term1 = (1.0-sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])) /(1.0+sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])); double term2 = 1.0/(1.0+sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])); double dhy = (hy[jx][jy][jz]-hy[jx-1][jy][jz])/dx; double dhx = (hx[jx][jy][jz]-hx[jx][jy-1][jz])/dy; ez[jx][jy][jz] = term1*ez[jx][jy][jz]+dt/epsirx[jx][jy][jz]*term2*(dhy-dhx); } ・ ・ ・ この後電界の計算が同様に続きます。 どなたかこのプログラムにOpenMPを導入するにはどうすればよいか教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
お礼
ありごとうございます。 二重ループの場合、 #pragma omp parallel for private(lwjy) を書き込めば良いのはわかったんですが、三重の場合はどのようにすればよいのでしょうか? またOSはWindows 7、CPUはIntelのコア2、コンパイラはMicrosoft Visual C++ 2010 Expressです。