登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
时域有限差分法 FDTD
>
Python的实现
发帖
回复
1
2
3
4
8489
阅读
33
回复
[
RFEDA原创
]
Python的实现
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
20楼
发表于: 2010-07-30 17:01:55
fd2d_3.3.c平面波源:
j(k: @
v>-VlQ
from pylab import *
CCWg{*og
from enthought.mayavi import mlab
'_/Bp4i
,J{ei7TN
NSTEPS = 115; NPML = 8
AG?dGj^
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
v!ujj5-$I
T = 0; t0 = 20.0; spread = 8.0
E7Y`|nT
$W9{P;
IE = 60; ic = IE/2; ia = 7; ib = IE-ia-1
XoCC/
JE = 60; jc = JE/2; ja = 7; jb = JE-ja-1
Gmq/3tw
yA.4G_|I
dz = zeros((IE,JE)); hx = zeros((IE,JE)); ihx = zeros((IE,JE))
D*F4it.
ez = zeros((IE,JE)); hy = zeros((IE,JE)); ihy = zeros((IE,JE))
\&i P`v`K
ga = ones((IE,JE))
eQD)$d_5
gi2 = ones(IE); gi3 = ones(IE); fi1= zeros(IE); fi2 = ones(IE); fi3 = ones(IE)
B&.FOO
gj2 = ones(JE); gj3 = ones(JE); fj1= zeros(JE); fj2 = ones(JE); fj3 = ones(JE)
W034N[9
v(-{=*':
ez_inc = zeros(JE); ez_inc_low_m1 = 0.0; ez_inc_high_m1 = 0.0
24 )(5!:"
hx_inc = zeros(JE); ez_inc_low_m2 = 0.0; ez_inc_high_m2 = 0.0
q"<ac qK
d~:!#uWyFk
xnum = NPML-arange(NPML)
X90J!
PV4(hj
xn = 0.33*(xnum/float(NPML))**3
>ey\jDr#O
gi2[0:NPML] = 1.0/(1.0+xn); gi2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
cgm~>
gi3[0:NPML] = (1.0-xn)/(1.0+xn); gi3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
'b#0t#|TM
gj2[0:NPML] = 1.0/(1.0+xn); gj2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
j/nWb`#y
gj3[0:NPML] = (1.0-xn)/(1.0+xn); gj3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
lobGj8uxq
P3nb2.
xn = 0.25*((xnum-0.5)/float(NPML))**3
cnFI &,FM
fi1[0:NPML] = xn; fi1[-2:-2-NPML:-1] = xn
},>pDeX^P
fi2[0:NPML] = 1.0/(1.0+xn); fi2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
\7l-@6'7
fi3[0:NPML] = (1.0-xn)/(1.0+xn); fi3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
5i1>I=N
fj1[0:NPML] = xn; fj1[-2:-2-NPML:-1] = xn
%y|)=cm[
fj2[0:NPML] = 1.0/(1.0+xn); fj2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
zOqn<Y@
fj3[0:NPML] = (1.0-xn)/(1.0+xn); fj3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
MF'$~gxo
bV$)!]V
for n in range(NSTEPS):
,>eMG=C; g
T += 1
jlBanGs?
ez_inc[1:] += 0.5*(hx_inc[:-1]-hx_inc[1:])
X(\fN[;
Y<Xz wro0
ez_inc[0] = ez_inc_low_m2; ez_inc[JE-1] = ez_inc_high_m2
8rMX9qTO@
ez_inc_low_m2 = ez_inc_low_m1; ez_inc_high_m2 = ez_inc_high_m1
k25WucQ
ez_inc_low_m1 = ez_inc[1]; ez_inc_high_m1 = ez_inc[JE-2]
!2'jrJGc
{6c2{@
for i in range(1,IE):
CO2C{~Q5
for j in range(1,JE):
/~Z?27F6@
dz[j] = gi3*gj3[j]*dz[j]+gi2*gj2[j]*0.5*(hy[j]-hy[i-1][j]-hx[j]+hx[j-1])
-"h;uDz|z
3`B6w$z>(
pulse = exp(-0.5*((t0-T)/spread)**2); ez_inc[3] = pulse;
MV\|e1B}
QzzW x2
for i in range(ia,ib+1):
bBS,-vN
dz[ja] += 0.5*hx_inc[ja-1]
'C ~y5j
dz[jb] += -0.5*hx_inc[jb]
fD07VBS yl
k-HCeZ
ez = ga*dz
1!1beR]
&b?LP]
for i in range(IE-1): ez[0] = 0.0; ez[-1] = 0.0
LX@/RAd vz
for j in range(JE-1): ez[0][j] = 0.0; ez[-1][j] = 0.0
mi)LP?q
PG_0\'X)/w
hx_inc[:-1] += 0.5*(ez_inc[:-1]-ez_inc[1:])
kWe{r5C7
5K<5kHpvJ{
for i in range(IE):
,>:;#2+og
for j in range(JE-1):
MwR0@S}*
curl_e = ez[j]-ez[j+1]; ihx[j] += fi1*curl_e
y7$iOR
hx[j] = fj3[j]*hx[j]+fj2[j]*0.5*(curl_e+ihx[j])
NyVnA
k7>|q"0C
for i in range(ia,ib+1):
lm xr oHE
hx[ja-1] += 0.5*ez_inc[ja]
& M~`:R
hx[jb] += -0.5*ez_inc[jb]
kRTwaNDOD
HKqwE=NZ
for i in range(IE-1):
f"9q^
for j in range(JE-1):
v}tag#f5>?
curl_e = ez[i+1][j]-ez[j]; ihy[j] += fj1[j]*curl_e
USVqB\#
hy[j] = fi3*hy[j]+fi2*0.5*(curl_e+ihy[j])
|iR T! ]
K a6,<C o
for j in range(ja,jb+1):
<0QH<4
hy[ia-1][j] += -0.5*ez_inc[j]
/u0' 6V
hy[ib][j] += 0.5*ez_inc[j]
3v mjCm
=7C%P%yt
x, y = np.ogrid[0:IE,0:JE]
S6+y?,^
pl = mlab.surf(x, y, ez, warp_scale="auto")
:bWUuXVtJ
q@@T]V6
坚持到底就是胜利!
(q4),y<:[
图片:fd2d_3.3.JPG
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
21楼
发表于: 2010-08-02 18:01:51
fd2d_3.4.c中间存在圆柱介质:
qTB$`f'|$
ooj~&fu
from pylab import *
jr /lk
from enthought.mayavi import mlab
$v`afd y
WA$>pG5s
NSTEPS = 100; NPML = 8;
kwud?2E
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
a6h>=uT [
T = 0; t0 = 25.0; spread = 8.0
S/`%Q2za4
97,rE$bC
IE = 60; ic = IE/2; ia = 7; ib = IE-ia-1
W{5:'9,
JE = 60; jc = JE/2; ja = 7; jb = JE-ja-1
m$LVCB
Qe'g3z>
dz = zeros((IE,JE)); hx = zeros((IE,JE)); ihx = zeros((IE,JE))
/R LI,.%
ez = zeros((IE,JE)); hy = zeros((IE,JE)); ihy = zeros((IE,JE))
D-U<u@A4
ga = ones((IE,JE)); gb = zeros((IE,JE)); iz = zeros((IE,JE))
;@nFVy>U
gi2 = ones(IE); gi3 = ones(IE); fi1= zeros(IE); fi2 = ones(IE); fi3 = ones(IE)
"0EA;S8$8
gj2 = ones(JE); gj3 = ones(JE); fj1= zeros(JE); fj2 = ones(JE); fj3 = ones(JE)
$fpq 3
v`c$!L5
ez_inc = zeros(JE); ez_inc_low_m1 = 0.0; ez_inc_high_m1 = 0.0
j.i#*tN//
hx_inc = zeros(JE); ez_inc_low_m2 = 0.0; ez_inc_high_m2 = 0.0
G\;}w
QI!F6pGF
xnum = NPML-arange(NPML)
r{seb E\ ;
m))<!3
xn = 0.33*(xnum/float(NPML))**3
u0RS)&
gi2[0:NPML] = 1.0/(1.0+xn); gi2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
%y<ejM
gi3[0:NPML] = (1.0-xn)/(1.0+xn); gi3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
\#rO!z d
gj2[0:NPML] = 1.0/(1.0+xn); gj2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
hAqg Iu*
gj3[0:NPML] = (1.0-xn)/(1.0+xn); gj3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
K?4FT$9G
phYDs9-K
xn = 0.25*((xnum-0.5)/float(NPML))**3
P(SZ68
fi1[0:NPML] = xn; fi1[-2:-2-NPML:-1] = xn
1mSaS4!"B
fi2[0:NPML] = 1.0/(1.0+xn); fi2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
7$k8%lI;>
fi3[0:NPML] = (1.0-xn)/(1.0+xn); fi3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
`T2 <<<
fj1[0:NPML] = xn; fj1[-2:-2-NPML:-1] = xn
oW$s xS
fj2[0:NPML] = 1.0/(1.0+xn); fj2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
QR> Y%4 ;h
fj3[0:NPML] = (1.0-xn)/(1.0+xn); fj3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
$>R(W=Q
o:Zd1"Z
radius = 10; epsilon = 30.0; sigma = 0.3
}K(o9$V ^!
}4>JO""
for j in range(ja,jb):
` r']^ ,
for i in range(ia,ib):
rxO2js
xdist = (ic-i)
_Hd{sd#xX1
ydist = (jc-j)
m9md|yS
dist = sqrt(xdist**2+ydist**2)
+zkm(
if dist<=radius:
3I|3wQ (
ga[j] = 1.0/(epsilon+sigma*dt/epsz)
-#29xRPk
gb[j] = sigma*dt/epsz
@4!x>q$3
CodSJ,
for n in range(NSTEPS+1):
FZH\Q~IUV
T += 1
R 4wr
ez_inc[1:] += 0.5*(hx_inc[:-1]-hx_inc[1:])
kzq29S
l+wc'=]
ez_inc[0] = ez_inc_low_m2; ez_inc[JE-1] = ez_inc_high_m2
nW+YOX|+
ez_inc_low_m2 = ez_inc_low_m1; ez_inc_high_m2 = ez_inc_high_m1
U,lJ"$'
ez_inc_low_m1 = ez_inc[1]; ez_inc_high_m1 = ez_inc[JE-2]
l+y}4k=/
#*c F8NV-
for i in range(1,IE):
(X6sSO
for j in range(1,JE):
-Z^4L
dz[j] = gi3*gj3[j]*dz[j]+gi2*gj2[j]*0.5*(hy[j]-hy[i-1][j]-hx[j]+hx[j-1])
n^hocGH*
cE{ =(OQ
pulse = exp(-0.5*((t0-T)/spread)**2); ez_inc[3] = pulse;
n(lk dw
(vJ2z =z
for i in range(ia,ib+1):
=C f(B<u
dz[ja] += 0.5*hx_inc[ja-1]
gcJF`H/iNK
dz[jb] += -0.5*hx_inc[jb]
oh#> 5cA8
"%@uO)A /
ez = ga*(dz-iz)
O4No0xeWo
iz += gb*ez
Ra3ukYG[
Iia.k'N
for i in range(IE-1): ez[0] = 0.0; ez[-1] = 0.0
G_ Ay
for j in range(JE-1): ez[0][j] = 0.0; ez[-1][j] = 0.0
N8!TZ~1$
]$M<]w,IJ2
hx_inc[:-1] += 0.5*(ez_inc[:-1]-ez_inc[1:])
A%vsno!
5M23/= N
for i in range(IE):
ecX/K.8l
for j in range(JE-1):
S^cH}-+
curl_e = ez[j]-ez[j+1]; ihx[j] += fi1*curl_e
M;Wha;%E"
hx[j] = fj3[j]*hx[j]+fj2[j]*0.5*(curl_e+ihx[j])
S*)o)34U
2N~ E' 25
for i in range(ia,ib+1):
`BnP[jF
hx[ja-1] += 0.5*ez_inc[ja]
#^&jW
hx[jb] += -0.5*ez_inc[jb]
ACjf\4Q
qUf)j\7"Fn
for i in range(IE-1):
QMk+RM8U
for j in range(JE-1):
yu ,h\
curl_e = ez[i+1][j]-ez[j]; ihy[j] += fj1[j]*curl_e
~]8p_;\
hy[j] = fi3*hy[j]+fi2*0.5*(curl_e+ihy[j])
OK`Z@X_,bW
{$^SP7qV#>
for j in range(ja,jb+1):
Jbp5'e _
hy[ia-1][j] += -0.5*ez_inc[j]
{6x PdUhw
hy[ib][j] += 0.5*ez_inc[j]
.h;Se
ex?\c"
x, y = np.ogrid[0:IE,0:JE]
,vG<*|pn
pl = mlab.surf(x, y, ez, warp_scale="auto")
TK>{qxt:=
j1$<] f
图片:fd2d_3.4.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
22楼
发表于: 2010-08-04 13:29:44
希望楼主把该贴子整理成pdf文档,后放出来让版主加技术分或者威望
9B)lGLL}q
谢谢!
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
23楼
发表于: 2010-08-04 13:39:09
我给大家整理了一个pdf,请下载!
Ko}2%4on
帖子整理
python-fdtd.pdf
(326 K) 下载次数:12
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
24楼
发表于: 2010-08-05 17:27:10
3Q,我很大程度是对FDTD好奇,写代码也没有认真检查过。
(tpof 5a
} m6\C5
关于python调c,有很多种方式,我觉着最好的方式是把c函数编译成dll,然后在python导入ctypes,通过ctypes提供的方法直接调c函数。
K@*rVor{
eB7>t@ED
3维的fdtd不加边界条件很不鲁棒,数组下标稍微有所变化,结果就相差十万八千里。
)+*{Y$/U
第四章三维FDTD第一题fd3d_4.1.c,偶极天线,未加边界条件:
v}f&q!
from pylab import *
\boL`X
from enthought.mayavi import mlab
W8x[3,gT
U81;7L8
nsteps = 40
HrDTn&/
IE = 40; ic = IE/2
$^K]&Mft
JE = 40; jc = JE/2
}/49T
KE = 40; kc = KE/2
aSTFcz"
gax = ones((IE,JE,KE)); dx = zeros((IE,JE,KE)); ex = zeros((IE,JE,KE)); hx = zeros((IE,JE,KE))
.`mtA`N
gay = ones((IE,JE,KE)); dy = zeros((IE,JE,KE)); ey = zeros((IE,JE,KE)); hy = zeros((IE,JE,KE))
r/^tzH's
gaz = ones((IE,JE,KE)); dz = zeros((IE,JE,KE)); ez = zeros((IE,JE,KE)); hz = zeros((IE,JE,KE))
1N>6rN
ddx = 0.01; dt = ddx/6e8; epsz = 8.8e-12
.P8-~?&M
N tO?
for k in range(11,30):
;{]8>`im&4
gaz[ic][jc][k] = 0.0
IJldN6&\q
gaz[ic][jc][kc] = 1.0
m]1!-`(*
K Ka c6Zj
t0 = 20.0; spread = 6.0; T = 0
fPOEVmj<
Gxo# !
for n in range(1,nsteps+1):
TMNfJz
T += 1;
l3BD <PB2S
for k in range(1,KE):
R|$[U
for j in range(1,JE):
?LR"hZ>
for i in range(1,IE):
;hkro$
dx
[j][k] += 0.5*(hz[j][k]-hz[j-1][k]-hy[j][k]+hy[j][k-1])
5pB^Y MP
dy[j][k] += 0.5*(hx[j][k]-hx[j][k-1]-hz[j][k]+hz[i-1][j][k])
jjX'_E
dz[j][k] += 0.5*(hy[j][k]-hy[i-1][j][k]-hx[j][k]+hx[j-1][k])
ckAsGF_B~!
pulse = exp(-0.5*((t0-T)/spread)**2);
w/O<.8+
dz[ic][jc][kc] = pulse;
U|9U(il
for k in range(1,KE-1):
u\:rY)V
for j in range(1,JE-1):
.B6`OX&k
for i in range(1,IE-1):
G{/; AK
ex[j][k] = gax[j][k]*dx[j][k]
D7M0NEY
ey[j][k] = gay[j][k]*dy[j][k]
~~U<
ez[j][k] = gaz[j][k]*dz[j][k]
^g-Fg>&M
for k in range(1,KE-1):
z;ULQ
for j in range(1,JE-1):
D>ojW|@}
for i in range(1,IE):
M q76]I%
hx[j][k] += 0.5*(ey[j][k+1]-ey[j][k]-ez[j+1][k]+ez[j][k])
A"0wvk)UcY
for k in range(1,KE-1):
qP qy4V.;
for j in range(1,JE):
HRj7n<>L=
for i in range(1,IE-1):
>/8ru*Oc
hy[j][k] += 0.5*(ez[i+1][j][k]-ez[j][k]-ex[j][k+1]+ex[j][k])
G&.d)NfE
for k in range(1,KE):
@T5YsX]qb7
for j in range(1,JE-1):
EZ..^M3
for i in range(1,IE-1):
tK*%8I\s
hz[j][k] += 0.5*(ex[j+1][k]-ex[j][k]-ey[i+1][j][k]+ey[j][k])
32s5-.{c/f
print T
9^(HXH_f
x, y = np.ogrid[0:IE,0:JE]
cJSVT8
ez0 = zeros((IE,JE))
>6XDX=JVI
for i in range(IE):
c%jsu"
for j in range(JE):
"$]ls9-%n
ez0[j] = ez[j][kc]
g)X7FxS,z
pl = mlab.surf(x, y, ez0, warp_scale="auto")
BSOjyy1f
图片:fd3d_4.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
25楼
发表于: 2010-08-08 09:54:00
谢谢楼主,我已经将我的FDTD程序利用python做了一个简单界面,但是有一个问题想问一下:
j p!
,Y$F7&
mathplotlib中的画图的函数中,最终显示是用show(),但是该函数仅仅能够显示出一副图片,只有关闭该显示界面后,下面的代码才能够继续进行,如果想显示波传播那样的问题,就不很多方便。
ESn6D@"
我目前是利用savefig将需要显示的图片保存下来,但是这样的方式不直接。
Xg,0 /P~
7t ZW^dF
有没有什么好的办法能够让python将显示的图像显示在自己定义的界面上的某个区域中?而且还可以实时刷新。
j.<:00<
谢谢
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
26楼
发表于: 2010-08-08 12:54:24
可以试一下mayavi。比matplotlib要简单好用,图形也更美观,可参考上面的np.ogrid,mlab.surf,可以实时刷新,也可以嵌入。附件是一篇介绍。
附件:
full_text.pdf
(767 K) 下载次数:5
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
27楼
发表于: 2010-08-08 14:32:11
谢谢楼主,我试试看看,
9 %D$T'K
m5X3{[a:
还有一个问题想问一下楼主,就是C++与python之间的数组如何传递,我目前的方式是做一个函数get_list(int i,int j)将数组的结果通过下标i和j返回
os}b?I*K
1P(%9
由于不是每个步骤都需要返回结果,只有在需要显示的时间步上才导出,因此现在还不觉得有多慢
$dlnmNP+
K~`n}_:
我希望有一种方式将numpy中的数组(一维或二维数组)从C++中返回给py或者由py指派给C++,不知道怎样解决
9BqQ^`bu
UN-T^
其它的数据结构的对应问题已经解决了,我用的是boost.python
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
28楼
发表于: 2010-08-09 10:33:28
numpy可以通过ctypes调c,如果调c++可以用一个c函数转一下,这样c/c++的代码是可以原封不动的。
A Oby*c
http://hyry.dip.jp/pydoc/ctypes_numpy.html
(iHf9*i CV
v9Z lNA7m!
IW5*9)N?
boost不了解,可能要改c++的代码吧:
C>.]Bvg
01.#include <boost/python.hpp>
66I|0_
02.#include "boost/python/extract.hpp"
i!CKA}",
03.#include "boost/python/numeric.hpp"
P3+)pOE-SI
04.#include <iostream>
g2+l@$W
05.
&Pmc"9Rl
06.using namespace boost::python;
)p^m}N 6M]
07.
1bV 2
08.// Functions to demonstrate extraction
zkjPLeX
09.void setArray(boost::python::numeric::array data) {
9X 5*{f Y
10.
@m+pr\h(
11. // Access a built-in type (an array)
ArNur~
12. boost::python::numeric::array a = data;
6Y;Y}E
13. // Need to <extract> array elements because their type is unknown
6'RZ
14. std::cout << "First array item: " << extract<int>(a[0]) << std::endl;
a"`g"ZRx
15.}
@?<N +qdH>
16.
?D RFsA
17.// Expose classes and methods to Python
/Oq1q._9F
18.BOOST_PYTHON_MODULE(TestNumPy) {
s5c! ^,L8
19. boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
S% JNxT7'
20.
tU+@1~ ~
21. def("setArray", &setArray);
=?meO0]y
22.
"\VW.S
23.}
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
29楼
发表于: 2010-08-09 19:59:13
你这种方式好像只能setArray
t] n(5!L(
我有时想要的是getArray
共
条评分
发帖
回复