Vsim学习笔记
基本概念
PIC算法:Particle-In-Cell(粒子云网格算法)
基本概念:等离子体基本上可以理解为 一些在电磁力作用下运动的带电粒子,每个粒子的轨道都由电磁力决定;但在另一方面,等离子体中的 带电粒子又接近于连续分布,产生的电磁场基本等于带电的连续介质的场。研究等离子体的运动,就包 括两个基本过程:首先要确定等离子体中的电荷-电流密度分布,并由此得出等离子体中的电磁场分布; 然后再利用电磁场计算出粒子的运动轨道,并通过所有粒子轨道的求和平均得到等离子体的整体运动。+
然后假设在时刻 t=0 的宏粒子位置是已知的,记为$x^0 $,同时 t=-1/2∆t 的宏粒子速度已知,记为$v^{1/2}$ , 那么已知了所有宏粒子的 $x^0$可以算出 t=0 时刻的电荷密度 $\rho^{0}$,从而求出电场$E^0$。然后,在第一级近似下,可以估计出下一时刻的速度和位置:

对所有粒子重复这个计算就得到了下一个时刻(t=1 & 1/2)的位置和速度。这样称为完成了一个时间 推进步。反复执行上述推进过程,就得出未来任何时刻等离子体状态的预测结果。在一般情况下,一个 时间推进步的具体结构就类似上面的流程图中一个循环的内容。
Vsim的模型基于用户的输入文件,该文件由描述性语言写成,后缀为.pre,然后由转换器转成.in文件,最后导入Vsim执行。
1. 全局变量
2. 网格模块
2.1 均匀网格
2.2 柱坐标网格
2.3 非均匀网格
3. 几何模块
4. 场模块
4.1 场模块常用Block
Multifield对象:用于描述所有场量
- Field:定义场
- FieldUpdater:场更新器
- UpdateStep:更新步骤
- InitialUpdateStep:初始化更新
- FieldMultiUpdater:多字段更新
4.2 电磁场模型
4.3 静电场模型
4.2.1 场更新及粒子更新流程
以二维弧后阶段PIC仿真代码为例。
## 场对象
<MultiField esMultiField>
## 外加场
<Field TM>
numComponents = 3
overlap = [1 1]
offset = none
labels = [TM_x TM_y TM_z]
## 初始条件
<InitialCondition initTM>
kind = varset
lowerBounds = [0 0]
upperBounds = [321 401]
components = [0 1 2]
<STFunc component0>
kind = expression
expression = 0.0
</STFunc>
<STFunc component1>
kind = expression
expression = 0.0
</STFunc>
<STFunc component2>
kind = expression
expression = 0.0
</STFunc>
</InitialCondition>
dumpSteps = [0]
</Field>
## 描述场
<Field E>
numComponents = 3
offset = edge
kind = regular
overlap = [1 1]
labels = [E_x E_y E_z]
</Field>
<Field nodalE>
</Field>
<Field nodalB>
</Field>
<Field Phi>
</Field>
<Field ChargeDensity>
</Field>
## 场更新
<FieldUpdater TMaddingUpdater>
kind = fieldBinOpUpdater
binOp = add
lowerBounds = [0 0 0]
upperBounds = [321 401 13]
aCoeff = 1.0
bCoeff = 1.0
## 读入数据
readFields = [TM nodalB]
## 更新数据
writeFields = [nodalB]
</FieldUpdater>
<FieldUpdater gradPhi>
kind = gradVecUpdater
factor = -1.0
lowerBounds = [0 0 0]
upperBounds = [320 400 12]
readFields = [Phi]
writeFields = [E]
</FieldUpdater>
<FieldUpdater edgeToNode>
</FieldUpdater>
<FieldUpdater copyPerimlowerX>
kind = unaryFieldOpUpdater
minDim = 1
lowerBounds = [0 0 0]
upperBounds = [1 401 13]
operation = set
bumpReadIter = [0 0 0]
readFields = [E]
component = 0
writeFields = [nodalE]
## unaryFieldOpUpdater更新器 系数
<STFunc copyFunc>
kind = constantFunc
amplitude = 1.
</STFunc>
</FieldUpdater>
<FieldUpdater copyPerimupperX>
</STFunc>
</FieldUpdater>
<FieldUpdater copyPerimlowerY>
</STFunc>
</FieldUpdater>
<FieldUpdater copyPerimupperY>
</STFunc>
</FieldUpdater>
## 初始化更新器
<InitialUpdateStep TMaddingUpdaterInitStep>
alsoAfterRestore = False
updaters = [TMaddingUpdater]
messageFields = [nodalB]
</InitialUpdateStep>
<InitialUpdateStep esSolveInitialUpdateStep>
alsoAfterRestore = False
updaters = [esSolve]
messageFields = [Phi]
</InitialUpdateStep>
<InitialUpdateStep edgeToNodeInitStep>
</InitialUpdateStep>
<InitialUpdateStep gradPhiInitStep>
</InitialUpdateStep>
## 更新步骤模块
<UpdateStep esSolveStep>
toDtFrac = 1.0
updaters = [gradPhi]
messageFields = [E]
</UpdateStep>
<UpdateStep edgeToNodeStep>
</UpdateStep>
<UpdateStep copyPerimlowerXStep>
</UpdateStep>
<UpdateStep copyPerimupperXStep>
</UpdateStep>
<UpdateStep copyPerimlowerYStep>
</UpdateStep>
<UpdateStep copyPerimupperYStep>
</UpdateStep>
## es求解器更新模块
<FieldUpdater esSolve>
kind = linearSolveUpdater
lowerBounds = [0 0]
upperBounds = [321 401]
readFields = [ChargeDensity]
readComponents = [0]
writeFields = [Phi]
writeComponents = [0]
writeEquationToFile = 0
## 矩阵填充
<MatrixFiller interiorFiller>
kind = nodeSTFuncStencilFiller
gridBoundary = LSPecShapes
rowInteriorosity = [insideBoundary]
colInteriorosity = [insideBoundary cutByBoundary outsideBoundary]
component = 0
minDim = 1
lowerBounds = [1 1 0]
upperBounds = [320 400 12]
<STFunc coeff>
kind = expression
expression = -8.854187817591624e-12
</STFunc>
<STFuncStencilElement phi_dxp>
value = -100000000.0
minDim = 1
cellOffset = [0 0 0]
functionOffset = [0.5 0. 0.]
rowFieldIndex = 0
columnFieldIndex = 0
</STFuncStencilElement>
<STFuncStencilElement phi_dxm>
</STFuncStencilElement>
...
...
...
<STFuncStencilElement phi_nmz>
value = 0
minDim = 3
cellOffset = [0 0 -1]
functionOffset = [0. 0. -0.5]
rowFieldIndex = 0
columnFieldIndex = 0
</STFuncStencilElement>
</MatrixFiller>
## 向量写入
<VectorWriter interiorWriter>
kind = nodeFieldVectorWriter
gridBoundary = LSPecShapes
interiorosity = [insideBoundary]
minDim = 1
readField = ChargeDensity
readComponent = 0
lowerBounds = [1 1 0]
upperBounds = [320 400 12]
component = 0
</VectorWriter>
## 向量读取
<VectorReader phiReader>
kind = fieldVectorReader
minDim = 0
writeField = Phi
writeComponent = 0
lowerBounds = [0 0]
upperBounds = [321 401]
componentBounds = [0 1]
</VectorReader>
......
## 阴极区域条件设置 矩阵填充 向量写入
<MatrixFiller CathodePhiFiller>
kind = nodeStencilFiller
gridBoundary = cathode
rowInteriorosity = [cutByBoundary outsideBoundary]
colInteriorosity = [cutByBoundary outsideBoundary]
component = 0
minDim = 1
lowerBounds = [1 1 0]
upperBounds = [320 400 12]
<StencilElement ident>
value = 0.0035416751270366496
minDim = 1
cellOffset = [0 0 0]
rowFieldIndex = 0
columnFieldIndex = 0
</StencilElement>
</MatrixFiller>
<VectorWriter CathodePhiWriter>
kind = stFuncNodeVectorWriter
gridBoundary = cathode
minDim = 1
lowerBounds = [1 1 0]
upperBounds = [320 400 12]
component = 0
interiorosity = [cutByBoundary outsideBoundary]
<STFunc function>
kind = expression
expression = (-1e9*t)
</STFunc>
scaling = 0.0035416751270366496
</VectorWriter>
<MatrixFiller AnodePhiFiller>
</MatrixFiller>
<VectorWriter AnodePhiWriter>
</VectorWriter>
## 线性求解器设置
<LinearSolver linearSolver>
kind = iterativeSolver
verbosity = 127
output = last
maxIterations = 200
tolerance = 1e-08
convergenceMetric = r0
<BaseSolver myBS>
kind = gmres
kspace = 30
orthog = classic
</BaseSolver>
<Preconditioner precond>
kind = multigrid
mgOutput = 0
mgDefaults = DD
maxLevels = 10
smootherType = GaussSeidel
smootherSweeps = 3
smootherPrePost = both
coarseType = Jacobi
dampingFactor = 1.333
threshold = 0.0
increaseDecrease = increasing
</Preconditioner>
</LinearSolver>
</FieldUpdater>
## 场更新顺序
updateStepOrder = [esSolveStep gradPhiStep edgeToNodeStep copyPerimlowerXStep copyPerimupperXStep copyPerimlowerYStep copyPerimupperYStep]
</MultiField>
# 电荷更新
<ScalarDepositor ChargeDensityDep>
kind = areaWeighting
depField = esMultiField.ChargeDensity
</ScalarDepositor>