VSim螺旋线行波管模拟案例讲义.docx
《VSim螺旋线行波管模拟案例讲义.docx》由会员分享,可在线阅读,更多相关《VSim螺旋线行波管模拟案例讲义.docx(23页珍藏版)》请在冰豆网上搜索。
VSim螺旋线行波管模拟案例讲义
VSim螺旋线行波管模拟案例讲义
第一部分概述
模拟的对象为一个典型的螺旋线行波管。
基本结构是在金属管内装有螺旋线和介质夹持杆,然后在两端引入输入和输出端口。
当电子束进入螺旋线波导时,就产生微波放大。
实际模拟时我们用很多圈的螺旋线,为了看清几何,我们用一组示意图来描述:
第二部分几何生成
从上面的图形可以看到,整个几何模型包括下面的主要内容:
金属外壳:
在外壳上安装了耦合端口,这里使用的耦合端口是一个简单的同轴线针头-壁面耦合,在模拟的时候直接从同轴线送入TEM波。
然后是作为波导的螺旋线,同轴线针头直接耦合到螺旋线上。
接下来,为了支持螺旋线,需要三根介质夹持杆:
剖面图显示出夹持结构:
实际计算中,我们需要使用一个圈数很多的螺旋线(N=100turns以上)。
此外,在实践中还需要加入衰减器。
我们首先把匝数调整到100,然后可以看到衰减器的结构(去掉外壳以便看清):
中央绿色的是衰减器。
这里需要考虑一下VSim的逻辑,金属件都必须被实现为几何结构(gridBoundary),而夹持杆(介电结构)和衰减器(电导耗散)既可以实现为几何结构,也可以直接用函数引入,它们并不是必须被写成gridBoundary的。
确定一个结构是否要被实现为gridBoundary,要看它的具体应用。
例如如果设置夹持杆和衰减器都要吸收电子,那么就应该将它们实现为gridBoundary,而如果我们暂时不考虑夹持杆和衰减器的吸收,那么就可以到处理电磁场的时候再写这个部分。
除了上述的部分之外,VSim逻辑建议把所有的粒子发射源(emitter)都设置成为gridBoundary。
所以,在几何建模部分,需要建立金属部件和发射体的gridBoundary。
特别是,如果整个系统中有若干组金属部件,但其中只有一个用作发射体,那么这个必须额外被单独几何建模一次,吸收体同理。
gridBoundary可以用常规的对象来做,也可以使用geometry宏来做。
下面是用geometry宏实现的金属部件几何,其中复杂的主要是螺旋线结构。
基本思路就是从一个实体开始,不断贴上或者挖去部分,最后形成金属部件。
$DM_FRAC=0.25
$importgeometry
fillGeoExpression(tube,geoCylinderXP(x-XBGN_GUN_WALL,y,z,REND_TUBE,LENGTH_TUBE_SHELL))
$ifPERIODIC_GEOMETRY==0
fillGeoExpression(inputCoaxShell,geoCylinderXP(y-YBGN_COAX,z,x-XBGN_HELIX,RSHELL_COAX,LEGNTH_COAX))
fillGeoExpression(outputCoaxShell,geoCylinderXP(y-YBGN_COAX,z,x-XEND_HELIX,RSHELL_COAX,LEGNTH_COAX))
$endif
voidGeoExpression(tubeInterior,geoCylinderXP(x-XEND_GUN_WALL,y,z,RBGN_TUBE,LENGTH_TUBE_INTERIOR))
$ifPERIODIC_GEOMETRY==0
voidGeoExpression(inputCoaxInterior,geoCylinderXP(y-YBGN_COAX,z,x-XBGN_HELIX,ROUTER_COAX,LEGNTH_COAX))
voidGeoExpression(outputCoaxInterior,geoCylinderXP(y-YBGN_COAX,z,x-XEND_HELIX,ROUTER_COAX,LEGNTH_COAX))
$endif
fillGeoExpression(helix,geoCylinderXP(x-XBGN_HELIX_WIRE,yHelix(y,z),zHelix(x,y,z),RWIRE_HELIX,LENGTH_HELIX_WIRE))
$ifPERIODIC_GEOMETRY==0
voidGeoExpression(trimHelixInput,myHalfCylinderXPZ(x-XBGN_HELIX_WIRE,y,-z,RBGN_TUBE,LENGTH_TRIM_HELIX_INPUT))
voidGeoExpression(trimHelixOutput,myHalfCylinderXPZ(x-XTRIM_HELIX_OUTPUT,y,z,RBGN_TUBE,LENGTH_TRIM_HELIX_OUTPUT))
fillGeoExpression(inputCoaxInner,geoCylinderXP(y-YBGN_COAX,z,x-XBGN_HELIX,RINNER_COAX,LEGNTH_COAX))
fillGeoExpression(outputCoaxInner,geoCylinderXP(y-YBGN_COAX,z,x-XEND_HELIX,RINNER_COAX,LEGNTH_COAX))
$endif
saveGeoToGridBoundary(metalParts,DM_FRAC)
其中有一部分几何用$ifPERIODIC_GEOMETRY==0来设置为条件形式。
这些部分主要是两端的切断以及馈电的同轴线接口。
涉及到的几个宏的具体描述参考VSimInDepth。
emitter几何可以类似地来做,应该指出的是emitter一般来说不必和金属部件有什么关系,但是实践中emitter往往是金属部件的一部分。
在这种情况下,emitter必须被独立地实现为一个gridBoundary:
resetGeoToVoid()
fillGeoExpression(emitterDisk,geoCylinderXP(x-XBGN_GUN_WALL,y,z,RBGN_TUBE,THICKNESS_ENDCAPS))
saveGeoToGridBoundary(emitter,DM_FRAC)
第三部分:
场模型和频率分析
基本框架
产生金属部件模型后,就可以启用电磁场模型了。
电磁场模型看上去很复杂,实际上基本都是从一个模板产生的,最简单的模板是以前用的dMYee宏。
对于微波器件,一般我们可以从VSim6的例子中选择一个类似的模型,然后逐步修改成我们需要的模型。
这里我们使用的是一个比较通用的模板,它基本来自于dMYee宏。
#场定义
...................
#推进公式
#-------------------------
#updateoperations
#实际的推进步骤
通常几乎不会有人真的从头写出整个电磁模块,而都是在一个类型比较相似的模块上进行修改。
当然,我们可以使用以前遗留的一个宏deymittra.mac,此外现在的TWT输入文件也是一个不错的模板。
这个模板是利用MultiField写成的。
为了在需要的时候修改这个模板,我们需要解释其基本内容。
一般来说,MultiField框架要包含三个主要的部分:
场定义,更新器和算法包装。
由于MultiField是一个具有相当自由的场计算框架,原则上我们应该首先列出场方程。
实践中因为微波器件的场模型是非常类似的,一般只要简单修改就可以,无需如此复杂。
这里为了解释清楚,我们列出基本概念。
微波器件计算的电磁场,一般包含静态外场(主要是外磁场)和微波时变电磁场。
时变电磁场的方程是
和在计算电磁学中的方法一样,电场强度(和电流强度)被定义在网格的棱边上,而磁场强度B被定义在面心,如同下面这个图:
和标准计算电磁学稍有区别的是,由于存在粒子电流J,为了计算的精度,上述方程是被拆成三步来进行FDTD推进。
按照VSim的逻辑,我们引入一个参数toDtFrac,它的取值从0.0到1.0。
我们假设每个推进步推进中,迭代器的绝对时间从
推进到
,每个电磁场推进步的时间步长是
。
实际中MultiField总是要由一组“更新步”组成,而每个更新步代表从“当前时间”推进到某个值
。
现在我们可以列出PIC算法里面最标准的电磁场推进步,,推进开始的时刻是
,所有场的“内部时间”都是
:
第一步:
进行磁场B的推进。
设置toDtFac参数为0.5,也就是推进目标时间
然后按照法拉第电磁感应定律将磁场推进为
其中
,其中
是磁场在这个更新步之前的内部时间。
这里显然
。
于是
,于是磁场被推进了半个时间步,推进结束后,磁场内部时间被推进到
。
第二步:
进行电场E的推进,这是利用广义的安培定律:
由于电场只有一步推进,因此这里的toDtFrac=1.0,所以
,并且在执行这个推进后,电场的内部时间被推进到
。
第三步:
再次推进磁场,仍然使用法拉第定律,并且设置toDtFrac=1.0,于是
并且
。
执行这个推进后,磁场内部时间被推进到
。
现在我们可以分析行波管的MultiField模型了。
在开始的部分,必须定义这个MultiField框架所蕴含的场:
numComponents=3
offset=edge
overlap=[12]
numComponents=3
offset=face
overlap=[12]
kind=depField
numComponents=3
offset=edge
overlap=[12]
$ifINCLUDE_PARTICLES==1
numComponents=3
offset=none
overlap=[12]
dumpPeriod=0
numComponents=3
offset=none
overlap=[12]
dumpPeriod=0
$endif
几个场的语法是一样的,都是要定义场的分量,位置(offset参数用来约定场量定义是在顶点,面心还是棱边上),存盘周期以及鬼网格结构。
在这里首先定义了电场,磁场和电流场。
接下来两个节点电磁场nodalE和nodalB是用来将计算出的电磁场传递给带电粒子计算。
所以这个部分是使用了条件编译。
接下来是更新算法,我们看到一系列的FieldUpdater和FieldMultiUpdater:
gridBoundary=metalParts
interiorness=deymittra
kind=yeeFaradayUpdater
components=[012]
expandToTopInComponentDir=1
lowerBounds=[000]
upperBounds=[NXNYNZ]
readFields=[edgeE]
writeFields=[faceB]
gridBoundary=metalParts
interiorness=deymittra
kind=deyMittraUpdater
lowerBounds=[000]
upperBounds=[NXNYNZ]
readFields=[edgeE]
writeFields=[faceB]
gridBoundary=metalParts
interiorness=deymittra
kind=yeeAmpereUpdater
components=[012]
contractFromBottomInNonComponentDir=1
lowerBounds=[000]
upperBounds=[NXNYNZ]
readFieldCompShifts=[00]
readFields=[faceBedgeJ]
writeFields=[edgeE]
$ifINCLUDE_PARTICLES==1
kind=edgeToNodeVec
lowerBounds=[000]
upperBounds=[$NX+1$$NY+1$$NZ+1$]
readFields=[edgeE]
writeFields=[nodalE]
kind=faceToNodeVec
lowerBounds=[000]
upperBounds=[$NX+1$$NY+1$$NZ+1$]
readFields=[faceB]
writeFields=[nodalB]
$endif
这里面有五个Updater。
一般来说前三个都是标准的:
yeeFaradayUpdater和deyMittraUpdater用来推进电磁场的法拉第感应定律:
由于导体表面处没有切向电场,需要对这个方程做特殊考虑,所以法拉第定律包含了两个updater,yeeFaradayUpdater用于计算不和导体接触的网格,而deyMittraUpdater用于计算导体边界处的网格,两个updater一般都是在一起应用的。
yeeAmpereUpdatery用来推进安培定律:
上面两种updater足以完成FDTD推进步骤,为了把电磁场输出给粒子,需要把edgeE和faceB的值传送给nodalE和nodalB,这是后面两个updater完成的工作。
一般情况下我们基本不需要修改这些updater,只要补充我们需要的updater并且封装就可以了。
最后是包装成完整的推进步:
toDtFrac=0.5
messageFields=[faceB]
updaters=[yeeFaradaydeyMittraFaraday]
toDtFrac=1.0
updaters=[yeeAmpere]
messageFields=[edgeE]
toDtFrac=1.0
messageFields=[faceB]
updaters=[yeeFaradaydeyMittraFaraday]
$ifINCLUDE_PARTICLES==1
toDtFrac=1.0
updaters=[nodalEupdate]
messageFields=[nodalE]
toDtFrac=1.0
updaters=[nodalBupdate]
messageFields=[nodalB]
$endif
按照我们说的那样,首先是finishFarady(半步法拉第定律),然后是Ampere(一步安培定律),再startFarady(另外半步法拉第定律)。
实际上完成这三步之后,一个FDTD推进步就完成,剩下的两个更新步用于将E和B输出到nodalE和nodalB。
加入介质和损耗
上面的计算只包含了导体部分,而实际的行波管还包含夹持杆和衰减器。
从模拟的角度来说夹持杆是一块电介质,而衰减器是一块部分导体。
对于电介质和衰减介质的建模,VSim有两种方案,一种是使用现成的两个求解器(更新器),另一种是干脆自己写一个更新器。
两者的区别是前者可以处理复杂外形(包括CAD导入),但是只能是均匀的介电函数或者电导函数;后者只能处理用函数描述的结构,但可以处理介电/电导函数的演化。
这里因为外形很简单,我们使用第二种方法。
首先看一下处理介电和电导问题的方法,在考虑介电和电导的情况下,安培定律是
使用半点差分,这个方程可以写成
化简后就是
或者写成
其中第二个方程完全等价于原来的安培更新步,所以我们只需要在原来的安培更新步之前之后各插入一个转换步,就可以实现带电导和介电的器件的求解。
为了实现这两个步骤,首先要写出介电和电导的表达式,这两个表达式是:
1.0+\
(EPS_ROD-1.0)*geoCylinderXP(x-XBGN_HELIX_WIRE,y-YROD1,z-ZROD1,RADIUS_ROD,LENGTH_HELIX_WIRE)+\
(EPS_ROD-1.0)*geoCylinderXP(x-XBGN_HELIX_WIRE,y-YROD2,z-ZROD2,RADIUS_ROD,LENGTH_HELIX_WIRE)+\
(EPS_ROD-1.0)*geoCylinderXP(x-XBGN_HELIX_WIRE,y-YROD3,z-ZROD3,RADIUS_ROD,LENGTH_HELIX_WIRE)
#definitionsforattenuator
$VPHASEX_HELIX=LIGHTSPEED*SINPHI
$XBGNTURN_ATTENUATOR=XBGN_HELIX+BGNTURN_ATTENUATOR*PITCH_HELIX
$LENGTH_ATTENUATOR=(ENDTURN_ATTENUATOR-BGNTURN_ATTENUATOR)*PITCH_HELIX
$SIGMA=(VPHASEX_HELIX*EPS0/LENGTH_ATTENUATOR)*ln(10.0**(DB_ATTENUATOR/10.0))
$ATTENUATE_FACTOR=0.5*DT*SIGMA/EPS0
ATTENUATE_FACTOR*geoPipeXP(x-XBGNTURN_ATTENUATOR,y,z,RMID_HELIX,REND_TUBE,LENGTH_ATTENUATOR)
然后需要在MultiField框架内加入updater和updaterStep:
#=epsRel-0.5*sigma*dt/eps0
numComponents=3
overlap=[12]
offset=edge
kind=variable
lowerBounds=[000]
upperBounds=[NXNYNZ]
components=[012]
kind=expression
expression=epsRelTerm(x,y,z)-attenuateTerm(x,y,z)
kind=expression
expression=epsRelTerm(x,y,z)-attenuateTerm(x,y,z)
kind=expression
expression=epsRelTerm(x,y,z)-attenuateTerm(x,y,z)
#=epsRel+0.5*sigma*dt/eps0
numComponents=3
overlap=[12]
offset=edge
kind=variable
lowerBounds=[000]
upperBounds=[NXNYNZ]
components=[012]
kind=expression
expression=epsRelTerm(x,y,z)+attenuateTerm(x,y,z)
kind=expression
expression=epsRelTerm(x,y,z)+attenuateTerm(x,y,z)
kind=expression
expression=epsRelTerm(x,y,z)+attenuateTerm(x,y,z)
kind=fieldBinOpUpdater
lowerBounds=[000]
upperBounds=[NXNYNZ]
binOp=multiply
aCoeff=0.0
bCoeff=0.0
readFields=[edgeEepsRelMinus]
writeFields=[edgeE]
kind=fieldBinOpUpdater
lowerBounds=[000]
upperBounds=[NXNYNZ]
binOp=divide
aCoeff=0.0
bCoeff=0.0
readFields=[edgeEepsRelPlus]
writeFields=[edgeE]
上面是电磁场的基本部分。
按照我们知道的,行波管除了等离子体自生电磁场之外,还有一个导向磁场,为此我们还要再加入一个更新器:
kind=STFuncUpdater
operation=add