登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
时域有限差分法 FDTD
>
Python的实现
发帖
回复
1
2
3
4
8477
阅读
33
回复
[
RFEDA原创
]
Python的实现
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
20楼
发表于: 2010-07-30 17:01:55
fd2d_3.3.c平面波源:
|+f-h,
/yPXMJ6W~R
from pylab import *
+RDJY(Y$
from enthought.mayavi import mlab
D4Nu8Wr$
ZFn(x*L
NSTEPS = 115; NPML = 8
= !2NU
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
1y5Ex:JVZT
T = 0; t0 = 20.0; spread = 8.0
wSXVyg{
3vic(^Qh
IE = 60; ic = IE/2; ia = 7; ib = IE-ia-1
*I*i>==Z
JE = 60; jc = JE/2; ja = 7; jb = JE-ja-1
@F5f"8!.\
5W? PCOh\
dz = zeros((IE,JE)); hx = zeros((IE,JE)); ihx = zeros((IE,JE))
jgu*Y{ocm
ez = zeros((IE,JE)); hy = zeros((IE,JE)); ihy = zeros((IE,JE))
k4\UK#ODe
ga = ones((IE,JE))
L'A)6^d@S
gi2 = ones(IE); gi3 = ones(IE); fi1= zeros(IE); fi2 = ones(IE); fi3 = ones(IE)
dF@)M
gj2 = ones(JE); gj3 = ones(JE); fj1= zeros(JE); fj2 = ones(JE); fj3 = ones(JE)
;y>a nE}n{
X(AN)&L[
ez_inc = zeros(JE); ez_inc_low_m1 = 0.0; ez_inc_high_m1 = 0.0
`wz[='yM
hx_inc = zeros(JE); ez_inc_low_m2 = 0.0; ez_inc_high_m2 = 0.0
Ao.\
vZAv_8S)
xnum = NPML-arange(NPML)
&X>7n~@0
(/{aJV
xn = 0.33*(xnum/float(NPML))**3
6^F'|Wh
gi2[0:NPML] = 1.0/(1.0+xn); gi2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
5Jk<xWKj
gi3[0:NPML] = (1.0-xn)/(1.0+xn); gi3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
onei4c>@
gj2[0:NPML] = 1.0/(1.0+xn); gj2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
)}lRd#V
gj3[0:NPML] = (1.0-xn)/(1.0+xn); gj3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
"MOpsb,
gwB\<rzG
xn = 0.25*((xnum-0.5)/float(NPML))**3
X&\d)/Y
fi1[0:NPML] = xn; fi1[-2:-2-NPML:-1] = xn
C*kK)6v`
fi2[0:NPML] = 1.0/(1.0+xn); fi2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
3'I^lc
fi3[0:NPML] = (1.0-xn)/(1.0+xn); fi3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
MXp3g@Cz
fj1[0:NPML] = xn; fj1[-2:-2-NPML:-1] = xn
[0;buVU.
fj2[0:NPML] = 1.0/(1.0+xn); fj2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
]`o!1( GA
fj3[0:NPML] = (1.0-xn)/(1.0+xn); fj3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
Z*!O:/B
m@G i6
for n in range(NSTEPS):
U.0kR/>Z=
T += 1
Sb&lhgW]c
ez_inc[1:] += 0.5*(hx_inc[:-1]-hx_inc[1:])
@4+#Xd7"
{,$rkwW
ez_inc[0] = ez_inc_low_m2; ez_inc[JE-1] = ez_inc_high_m2
P Ru&3BP
ez_inc_low_m2 = ez_inc_low_m1; ez_inc_high_m2 = ez_inc_high_m1
-yH,5vD
ez_inc_low_m1 = ez_inc[1]; ez_inc_high_m1 = ez_inc[JE-2]
[a1jCo
m\u26`M
for i in range(1,IE):
'xK.UI
for j in range(1,JE):
,^s0</ve
dz[j] = gi3*gj3[j]*dz[j]+gi2*gj2[j]*0.5*(hy[j]-hy[i-1][j]-hx[j]+hx[j-1])
2?7(A
s}5+3f$f
pulse = exp(-0.5*((t0-T)/spread)**2); ez_inc[3] = pulse;
K >tf,
!kuX,*}q
for i in range(ia,ib+1):
(GKpA}~R
dz[ja] += 0.5*hx_inc[ja-1]
LO%!Z,}
dz[jb] += -0.5*hx_inc[jb]
HM[klH]s=
{<$bAj
ez = ga*dz
K7TzF&
0DPxW8Y -`
for i in range(IE-1): ez[0] = 0.0; ez[-1] = 0.0
Bik*b)9y2
for j in range(JE-1): ez[0][j] = 0.0; ez[-1][j] = 0.0
(#\pQ51
48D?'lW %
hx_inc[:-1] += 0.5*(ez_inc[:-1]-ez_inc[1:])
y*b3&%.ml
a|j%n
for i in range(IE):
"eAy^,
for j in range(JE-1):
.i"W8~<e
curl_e = ez[j]-ez[j+1]; ihx[j] += fi1*curl_e
AC%JC+
hx[j] = fj3[j]*hx[j]+fj2[j]*0.5*(curl_e+ihx[j])
77 r(*.O|
{d3<W N
for i in range(ia,ib+1):
)Di \_/G
hx[ja-1] += 0.5*ez_inc[ja]
I s57F4[}
hx[jb] += -0.5*ez_inc[jb]
PgM (l3x
TbVn6V'
for i in range(IE-1):
Z?NW1m()F
for j in range(JE-1):
V\5 L?}
curl_e = ez[i+1][j]-ez[j]; ihy[j] += fj1[j]*curl_e
$0A ~uDbs
hy[j] = fi3*hy[j]+fi2*0.5*(curl_e+ihy[j])
G'z{b$?/[
TX8<J>x
for j in range(ja,jb+1):
l{c]p-
hy[ia-1][j] += -0.5*ez_inc[j]
^]C&tG0 !
hy[ib][j] += 0.5*ez_inc[j]
Vy<HA*
@p=AWi}\
x, y = np.ogrid[0:IE,0:JE]
wBk@F5\<
pl = mlab.surf(x, y, ez, warp_scale="auto")
W-~n|PX8+
6=hk=2]f
坚持到底就是胜利!
_Xcn N:Rt
图片: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中间存在圆柱介质:
}g`A*y;t
s(zG.7*3n
from pylab import *
/ ]I]
from enthought.mayavi import mlab
YAO.Cc z
h'N,oDB)
NSTEPS = 100; NPML = 8;
x*_c'\F|
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
/at#[Pw~01
T = 0; t0 = 25.0; spread = 8.0
}U8H4B~UtY
."MBKyg6
IE = 60; ic = IE/2; ia = 7; ib = IE-ia-1
XX/cJp
JE = 60; jc = JE/2; ja = 7; jb = JE-ja-1
DTJ~.
=LuA[g
dz = zeros((IE,JE)); hx = zeros((IE,JE)); ihx = zeros((IE,JE))
[ jafPi(#g
ez = zeros((IE,JE)); hy = zeros((IE,JE)); ihy = zeros((IE,JE))
n0EKNMO
ga = ones((IE,JE)); gb = zeros((IE,JE)); iz = zeros((IE,JE))
8(ZQD+U(9F
gi2 = ones(IE); gi3 = ones(IE); fi1= zeros(IE); fi2 = ones(IE); fi3 = ones(IE)
Ble <n6
gj2 = ones(JE); gj3 = ones(JE); fj1= zeros(JE); fj2 = ones(JE); fj3 = ones(JE)
T,;6q!s=
QjRVdb>
ez_inc = zeros(JE); ez_inc_low_m1 = 0.0; ez_inc_high_m1 = 0.0
rR."_Z2
hx_inc = zeros(JE); ez_inc_low_m2 = 0.0; ez_inc_high_m2 = 0.0
"--rz;+K
yy%J{;
xnum = NPML-arange(NPML)
&oAuh?kTq
p[W8XX
xn = 0.33*(xnum/float(NPML))**3
d,$[633It}
gi2[0:NPML] = 1.0/(1.0+xn); gi2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
fIFB"toiPE
gi3[0:NPML] = (1.0-xn)/(1.0+xn); gi3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
0C0iAp
gj2[0:NPML] = 1.0/(1.0+xn); gj2[-1:-1-NPML:-1] = 1.0/(1.0+xn)
5~ jGF
gj3[0:NPML] = (1.0-xn)/(1.0+xn); gj3[-1:-1-NPML:-1] = (1.0-xn)/(1.0+xn)
cnI!}Bu
Z EG
xn = 0.25*((xnum-0.5)/float(NPML))**3
R(Z2DEt</
fi1[0:NPML] = xn; fi1[-2:-2-NPML:-1] = xn
6W~F nJI
fi2[0:NPML] = 1.0/(1.0+xn); fi2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
{At1]>
fi3[0:NPML] = (1.0-xn)/(1.0+xn); fi3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
b`1P%OjC
fj1[0:NPML] = xn; fj1[-2:-2-NPML:-1] = xn
tdEu4)6
fj2[0:NPML] = 1.0/(1.0+xn); fj2[-2:-2-NPML:-1] = 1.0/(1.0+xn)
Vj`9j. 5
fj3[0:NPML] = (1.0-xn)/(1.0+xn); fj3[-2:-2-NPML:-1] = (1.0-xn)/(1.0+xn)
7|H !( a'
3{ `fT5]U
radius = 10; epsilon = 30.0; sigma = 0.3
A/GEDG ?
@1rF9< 4g
for j in range(ja,jb):
bPiJCX0d
for i in range(ia,ib):
Y]ZOvA5W
xdist = (ic-i)
y_\vXY'
ydist = (jc-j)
#Mi>f4T;
dist = sqrt(xdist**2+ydist**2)
0gxbo
if dist<=radius:
z%]~^k8
ga[j] = 1.0/(epsilon+sigma*dt/epsz)
F!N;4J5u
gb[j] = sigma*dt/epsz
17J|g.]m-&
0hCJovSG%
for n in range(NSTEPS+1):
yl)}1DPP
T += 1
E5.)ro=$
ez_inc[1:] += 0.5*(hx_inc[:-1]-hx_inc[1:])
:h?Zg(l
:fo%)_Jc!
ez_inc[0] = ez_inc_low_m2; ez_inc[JE-1] = ez_inc_high_m2
Pgb<;c:4
ez_inc_low_m2 = ez_inc_low_m1; ez_inc_high_m2 = ez_inc_high_m1
$Nnz|y
ez_inc_low_m1 = ez_inc[1]; ez_inc_high_m1 = ez_inc[JE-2]
H<"{wUPT0
hCc I >[H5
for i in range(1,IE):
t[7YMk
for j in range(1,JE):
Wrt3p-N"D
dz[j] = gi3*gj3[j]*dz[j]+gi2*gj2[j]*0.5*(hy[j]-hy[i-1][j]-hx[j]+hx[j-1])
]yA| m3^2
,HR~oT^
pulse = exp(-0.5*((t0-T)/spread)**2); ez_inc[3] = pulse;
fM d]P:B
c7S<ex,
for i in range(ia,ib+1):
T*O!r`.Ak
dz[ja] += 0.5*hx_inc[ja-1]
lshO'I+)*
dz[jb] += -0.5*hx_inc[jb]
~M+|g4W%
]w! x
ez = ga*(dz-iz)
CShVJ:u+K\
iz += gb*ez
?GX5Pvg
tOS%.0W5J
for i in range(IE-1): ez[0] = 0.0; ez[-1] = 0.0
/1t(e._
for j in range(JE-1): ez[0][j] = 0.0; ez[-1][j] = 0.0
QD q2<
.-fJ\`^mi
hx_inc[:-1] += 0.5*(ez_inc[:-1]-ez_inc[1:])
.#Z}}W#
'^n2]<
for i in range(IE):
q4Qm:|-
for j in range(JE-1):
iC$~v#2
curl_e = ez[j]-ez[j+1]; ihx[j] += fi1*curl_e
m?bb/o'B
hx[j] = fj3[j]*hx[j]+fj2[j]*0.5*(curl_e+ihx[j])
'V .4Nhd
<#LHL
for i in range(ia,ib+1):
,Rz,[KI|
hx[ja-1] += 0.5*ez_inc[ja]
%<:?{<~wH9
hx[jb] += -0.5*ez_inc[jb]
61b,+'-
N%n#mV;
for i in range(IE-1):
pn>zuHe
for j in range(JE-1):
Peh(*D{
curl_e = ez[i+1][j]-ez[j]; ihy[j] += fj1[j]*curl_e
i$$\}2m{L
hy[j] = fi3*hy[j]+fi2*0.5*(curl_e+ihy[j])
-7hU1j~I
w=y!|F
for j in range(ja,jb+1):
NZmmO )p4
hy[ia-1][j] += -0.5*ez_inc[j]
^pAqe8u_
hy[ib][j] += 0.5*ez_inc[j]
E~jNUTq
-Z)$].~|t
x, y = np.ogrid[0:IE,0:JE]
zZGPA j
pl = mlab.surf(x, y, ez, warp_scale="auto")
DSD#',
hekAics6S
图片:fd2d_3.4.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
22楼
发表于: 2010-08-04 13:29:44
希望楼主把该贴子整理成pdf文档,后放出来让版主加技术分或者威望
;M>0,
谢谢!
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
23楼
发表于: 2010-08-04 13:39:09
我给大家整理了一个pdf,请下载!
k$7-F3
帖子整理
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好奇,写代码也没有认真检查过。
Ig6s'^
U} g%`<
关于python调c,有很多种方式,我觉着最好的方式是把c函数编译成dll,然后在python导入ctypes,通过ctypes提供的方法直接调c函数。
rKjQEO$yi
n XQg(!
3维的fdtd不加边界条件很不鲁棒,数组下标稍微有所变化,结果就相差十万八千里。
Y>z(F\
第四章三维FDTD第一题fd3d_4.1.c,偶极天线,未加边界条件:
p;B +g X
from pylab import *
0~-+5V
from enthought.mayavi import mlab
mq "p"iI
co*5NM^
nsteps = 40
Llzowlf e
IE = 40; ic = IE/2
P"~B2__*
JE = 40; jc = JE/2
X~j A*kmAj
KE = 40; kc = KE/2
6Qo6T][
gax = ones((IE,JE,KE)); dx = zeros((IE,JE,KE)); ex = zeros((IE,JE,KE)); hx = zeros((IE,JE,KE))
T^Z#x-Q
gay = ones((IE,JE,KE)); dy = zeros((IE,JE,KE)); ey = zeros((IE,JE,KE)); hy = zeros((IE,JE,KE))
LyQO_mT2
gaz = ones((IE,JE,KE)); dz = zeros((IE,JE,KE)); ez = zeros((IE,JE,KE)); hz = zeros((IE,JE,KE))
5Q^~Z},
ddx = 0.01; dt = ddx/6e8; epsz = 8.8e-12
uIba{9tM"P
@emZwN"m
for k in range(11,30):
Ea3tF0{
gaz[ic][jc][k] = 0.0
TS%cTh'ItH
gaz[ic][jc][kc] = 1.0
p;'vOb
w%$n)7<*
t0 = 20.0; spread = 6.0; T = 0
|, :(3Ml
ht =yzJ9Pr
for n in range(1,nsteps+1):
q`{.2yV
T += 1;
UjfB+=7I{L
for k in range(1,KE):
q`\lvdl
for j in range(1,JE):
X)|%[aX}q
for i in range(1,IE):
JD>!3>S)?
dx
[j][k] += 0.5*(hz[j][k]-hz[j-1][k]-hy[j][k]+hy[j][k-1])
!O.B,
dy[j][k] += 0.5*(hx[j][k]-hx[j][k-1]-hz[j][k]+hz[i-1][j][k])
N1SR nJu<f
dz[j][k] += 0.5*(hy[j][k]-hy[i-1][j][k]-hx[j][k]+hx[j-1][k])
](W#Tj5-
pulse = exp(-0.5*((t0-T)/spread)**2);
v<-D>iJ
dz[ic][jc][kc] = pulse;
A^m hPBT_
for k in range(1,KE-1):
)dvOg'it
for j in range(1,JE-1):
GC{Ys|s
for i in range(1,IE-1):
[F>zM
ex[j][k] = gax[j][k]*dx[j][k]
FKzqJwT
ey[j][k] = gay[j][k]*dy[j][k]
\Z~m6;
ez[j][k] = gaz[j][k]*dz[j][k]
^@ux
for k in range(1,KE-1):
\k* ]w_m-
for j in range(1,JE-1):
Cz(Pj S
for i in range(1,IE):
Ex Qld
hx[j][k] += 0.5*(ey[j][k+1]-ey[j][k]-ez[j+1][k]+ez[j][k])
H11Wb(6Wu
for k in range(1,KE-1):
i?R qv<n
for j in range(1,JE):
s}A]lY
for i in range(1,IE-1):
-Wig k['v
hy[j][k] += 0.5*(ez[i+1][j][k]-ez[j][k]-ex[j][k+1]+ex[j][k])
~7=,)Q
for k in range(1,KE):
@<AIPla
for j in range(1,JE-1):
y}3V3uqK
for i in range(1,IE-1):
?@u &3/&
hz[j][k] += 0.5*(ex[j+1][k]-ex[j][k]-ey[i+1][j][k]+ey[j][k])
<.AIVp
print T
.5T7O_%FP
x, y = np.ogrid[0:IE,0:JE]
LQS*/s0
ez0 = zeros((IE,JE))
K;Xn!:) V:
for i in range(IE):
Comuc
for j in range(JE):
6z(_^CY
ez0[j] = ez[j][kc]
BE U[M
pl = mlab.surf(x, y, ez0, warp_scale="auto")
xq]&XlA:ug
图片:fd3d_4.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
25楼
发表于: 2010-08-08 09:54:00
谢谢楼主,我已经将我的FDTD程序利用python做了一个简单界面,但是有一个问题想问一下:
(kSkbwu
EUNG&U
mathplotlib中的画图的函数中,最终显示是用show(),但是该函数仅仅能够显示出一副图片,只有关闭该显示界面后,下面的代码才能够继续进行,如果想显示波传播那样的问题,就不很多方便。
k4|YaGhf
我目前是利用savefig将需要显示的图片保存下来,但是这样的方式不直接。
c]O4l2nCL
W}e5 4-lu
有没有什么好的办法能够让python将显示的图像显示在自己定义的界面上的某个区域中?而且还可以实时刷新。
kn<[v;+
谢谢
共
条评分
离线
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
谢谢楼主,我试试看看,
c1Hv^*Y
I7}[%(~Sf/
还有一个问题想问一下楼主,就是C++与python之间的数组如何传递,我目前的方式是做一个函数get_list(int i,int j)将数组的结果通过下标i和j返回
aR3W9
._nhW*
由于不是每个步骤都需要返回结果,只有在需要显示的时间步上才导出,因此现在还不觉得有多慢
ei"FN3 Rm
%++q+pa
我希望有一种方式将numpy中的数组(一维或二维数组)从C++中返回给py或者由py指派给C++,不知道怎样解决
cBAA32wf
xOt|j4
其它的数据结构的对应问题已经解决了,我用的是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++的代码是可以原封不动的。
zIlQqyOQ8
http://hyry.dip.jp/pydoc/ctypes_numpy.html
[WB8X,
Gz kf
VbZZ=q=Kd
boost不了解,可能要改c++的代码吧:
9 Z4H5!:(
01.#include <boost/python.hpp>
}?H |9OS
02.#include "boost/python/extract.hpp"
('>!dXA$
03.#include "boost/python/numeric.hpp"
? 1_*ct=g9
04.#include <iostream>
fghJj@ES
05.
,Z3.Le"
06.using namespace boost::python;
2"13!s
07.
C^uXJ~8
08.// Functions to demonstrate extraction
UGAP$_j ]P
09.void setArray(boost::python::numeric::array data) {
h nyZXk1|
10.
;ASlsUE\)
11. // Access a built-in type (an array)
B>JRta;hj
12. boost::python::numeric::array a = data;
+.zriiF]i
13. // Need to <extract> array elements because their type is unknown
eE7+fMP{
14. std::cout << "First array item: " << extract<int>(a[0]) << std::endl;
p!HpqW
15.}
a*o=,!
16.
i5rAb<q`
17.// Expose classes and methods to Python
g4U%(3,>D
18.BOOST_PYTHON_MODULE(TestNumPy) {
VRT| OUq
19. boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
|J8c|h<
20.
0(64}T)
21. def("setArray", &setArray);
Y>IEB,w
22.
_TkiI. '
23.}
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
29楼
发表于: 2010-08-09 19:59:13
你这种方式好像只能setArray
zsWYV n]
我有时想要的是getArray
共
条评分
发帖
回复