Vsim学习笔记

基本概念

PIC算法:Particle-In-Cell(粒子云网格算法)

基本概念:等离子体基本上可以理解为 一些在电磁力作用下运动的带电粒子,每个粒子的轨道都由电磁力决定;但在另一方面,等离子体中的 带电粒子又接近于连续分布,产生的电磁场基本等于带电的连续介质的场。研究等离子体的运动,就包 括两个基本过程:首先要确定等离子体中的电荷-电流密度分布,并由此得出等离子体中的电磁场分布; 然后再利用电磁场计算出粒子的运动轨道,并通过所有粒子轨道的求和平均得到等离子体的整体运动。+

然后假设在时刻 t=0 的宏粒子位置是已知的,记为$x^0 $,同时 t=-1/2∆t 的宏粒子速度已知,记为$v^{1/2}$ , 那么已知了所有宏粒子的 $x^0$可以算出 t=0 时刻的电荷密度 $\rho^{0}$,从而求出电场$E^0$。然后,在第一级近似下,可以估计出下一时刻的速度和位置:

image-20221115180015123

对所有粒子重复这个计算就得到了下一个时刻(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>
4.2.2 场求解器参数

5. 粒子模块

6. 碰撞模块

7. History

8. 外电路

9. 后处理