Skip to content

SProcess Ch6:Writing PDE Using Alagator

> 来源:sprocess_ug.pdf 第 6 章(W-2024.09,约 p.684-p.721)
> 说明:本页按原章小节顺序进行结构化翻译;命令关键字、文件名、参数、单位保持原文形式。

<details> <summary>本章目录</summary>

</details>

6.1 可用运算符和变量

本章介绍如何使用 Alagator 脚本语言为仿真指定偏微分方程和边界条件。
PDE 以适合 Newton 迭代的“等于 0 的字符串表达式”形式给出。
多数数学运算符可用,并提供了微分项相关运算符。
需要特别注意 Tcl 对变量和字符串的展开时机,通常应在运行时求值,而不是在读取命令时求值。

6.1.1 二元和一元运算符

支持常见二元代数运算符,也支持一元负号。可使用括号控制分组与优先级。

注意:-(一元负号)与 ^(幂)在本语境中属于非标准优先级,编写时建议显式加括号。

条件运算符 ?: 有三个操作数:

  • 第一个操作数:条件
  • 第二个操作数:条件为真时的值
  • 第三个操作数:条件为假时的值

注意:使用 ?: 时请为子表达式加括号,避免求值顺序错误。

支持的二元/一元运算符优先级(原表 81):

运算符说明
-Unary minus
^Power,例如 a^b
*, /Multiplication, division
+, -Addition, subtraction
&lt;, &lt;=, &gt;=, &gt;, ==, !=比较与相等性判断
&&Logical and
`
?:Conditional operator
,列表逗号运算符

注意:==!= 用于浮点比较时需谨慎。

示例(截断剖面时常用):

tcl
select z= "(MyData>1e15) ? (1e15) : (MyData)" name= MyData

该命令将网格点中 MyData &gt; 1e15 的值截断到 1e15,小于等于阈值的点保持不变。

6.1.2 简单函数

简单函数均为单参数,参数必须写在括号内,可为任意表达式。常用函数包括:

  • exp(自然指数)
  • log(自然对数)
  • log10(以 10 为底对数)
  • sqrt(平方根)
  • erfc(互补误差函数)
  • erf(误差函数)

其中 erfcerf 常用于初始掺杂剖面构建。以上函数具有可用导数,可用于 PDE。

abssign 可用于绝对值和符号操作,但不提供导数,因此不能作为 PDE 组成项。

6.1.3 微分函数

微分函数仅在 PDE 中使用,不参与 select 求值。关键运算符:

  • ddt(arg):时间一阶导
  • grad(arg):梯度

时间积分由求解器自动使用 TRBDF(Bank-Rose trapezoidal rule/backward differentiation formula)方法处理。

当表达式包含 grad 时,Sentaurus Process 在离散组装时会自动处理散度,因此通常无需显式写 div。例如:

text
A*B*grad(C)

将按 div(A*B*grad(C)) 的意义处理。

6.1.4 字符串名称

未被识别为“实数、运算符、函数”的字符串,会按以下顺序匹配:

  1. solution 创建的有效解变量名
  2. term 创建的命名子表达式
  3. 数据场名称
  4. 传给 Tcl expression parser,若可解析为实数表达式则作为常数

这使得参数数据库中的参数可直接在 PDE 中使用。

6.1.5 解名称和子表达式

solution name=&lt;c&gt; 中的名称必须与 PDE 中字符串完全一致。
因为求解器会基于这些名称自动构建对各解变量的导数。

term name=&lt;c&gt; 同样要求名称严格匹配。
若某区域中“term 名称”和“数据场名称”同名,方程解析时 term 优先级更高。

6.1.6 常量和参数

任何未匹配 term/solution 的字符串,都会交由 Tcl expression parser 检查并尝试求值为常数。
当温度或时间变化时,该表达式会再次评估,因此参数可以显式依赖时间和温度。


6.2 指定偏微分方程的基础知识

6.2.1 参数定义与嵌套表达式

定义参数时要小心嵌套声明,尤其是 pdbDelayDouble 链式引用。示例:

tcl
pdbSetDouble Si Test Param1 {[Arrhenius 1 2]}                     (1)
pdbSetDouble Si Test Param2 {2.0*[pdbDelayDouble Si Test Param1]} (2)
pdbSetDouble Si Test Param3 {2.0*[pdbGetDouble   Si Test Param1]} (3)
pdbGet Si Test Param2                                             (4)
pdbGet Si Test Param3                                             (5)

这里 (4) 可能报错而 (5) 可返回有效值,原因是 pdbDelayDouble 返回表达式字符串,在某些嵌套情况下 Tcl 表达式解析器不能完整展开。

规避方式:

tcl
pdbSetDouble Si Test Param2 {[expr 2.0*[pdbDelayDouble Si Test Param1]]}

注意:若 Sentaurus Process 无法正确评估表达式,会按 0 处理。

6.2.2 构建 PDE

扩散方程示例可写为:

text
ddt(CX) - D*grad(CX) = 0

其中 CX 是解变量,D 是扩散率项。
grad 项隐含散度处理,D*grad(CX) 前通常不显式加 div

最简命令(常系数扩散):

tcl
solution name=CX add !negative !damp solve
pdbSetString Silicon CX Equation "ddt(CX) - \[Arrhenius 0.138 1.37\]*grad(CX)"

对应求解形式可理解为:

text
d(CX)/dt - div(0.138*exp(-1.37/kT)*grad(CX)) = 0

说明:

  • solution 创建并标记待解变量 CX
  • !negative 禁止负值
  • !damp 不对 Newton 更新做数值阻尼
  • Equation 是 Alagator 默认查找的 PDE 字段

注意:

  • PDE 中的 solution 名必须与 solution 命令完全一致
  • Arrhenius 两侧 \[\] 用于阻止立即求值,使其在扩散步按当前温度计算

6.2.3 设置边界条件

Dirichlet边界条件

示例:在 Gas_Silicon 界面将硅侧 CX 固定为 5.0e19 cm^-3

tcl
pdbSetBoolean Gas_Silicon CX Fixed_Silicon 1
pdbSetString Gas_Silicon CX Equation_Silicon "CX_Silicon - 5.0e19"

解释:

  • Fixed_Silicon 1 指示在硅侧施加 Dirichlet 条件
  • 使用 Fixed 后该节点处通量项被忽略,浓度由边界方程控制
  • 界面名遵循字母序(例如 Gas_Silicon

分凝边界条件

示例:在 Oxide_Silicon 界面施加分凝型边界:

tcl
pdbSetString Oxide_Silicon CX Equation_Oxide "(1.6e-7*(CX_Oxide - CX_Silicon/0.28))"
pdbSetString Oxide_Silicon CX Equation_Silicon "-(1.6e-7*(CX_Oxide - CX_Silicon/0.28))"

说明:

  • 两侧通量符号相反
  • 1.6e-7 是传输系数
  • 0.28 是分凝系数
  • 若氧化物侧不求解 CX,该界面方程会失衡

6.2.4 使用项

term 用于复用子表达式、降低维护复杂度、并便于后处理读取。

示例(将扩散率抽为 term):

tcl
term name= D Silicon eqn= "\[Arrhenius 0.138 1.37\]" store
pdbSetString Silicon CX Equation "ddt(CX) - D * grad(CX)"

term 是全局术语对象,不是 Tcl 局部变量,因此后续表达式中无需 $D

双变量复合反应示例(CXCY):

tcl
solution add name=CX !damp !negative solve
solution add name=CY !damp !negative solve
set Kf {[Arrhenius 4.2e-11 0.1]}
set CXStar {[Arrhenius 3.6e27 3.7]}
set CYStar {[Arrhenius 4.0e26 3.97]}
term name= RCXCY Silicon eqn= "$Kf * (CX * CY- $CXStar * $CYStar)" store
set diff {[Arrhenius 0.138 1.37]}
pdbSetString Silicon CX Equation "ddt(CX) - $diff * grad(CX) + RCXCY"
set diff {[Arrhenius 0.02 0.3]}
pdbSetString Silicon CY Equation "ddt(CY) - $diff * grad(CY) + RCXCY"

常见错误:只在一个方程里添加反应项,导致耦合系统不守恒或收敛异常。


6.3 指定通用生长方程的基础知识

本节在 PDE 基础上扩展“反应-生长”建模。核心思想是:

  • 先定义新材料与反应接口
  • 再定义反应物扩散方程、界面通量、增长反应通量
  • 最后通过 diffuse + ambient 激活生长

6.3.1 基本反应定义(TEOS 示例)

示例场景:ambient GX 与 Silicon 反应,生成新材料 TEOS

图 1:生长过程中的通量、环境浓度与生长前沿(占位图)

图 1:sprocess_ug.pdf 第 6 章 Figure 78(p.693)。当前仓库使用章节占位图,后续可替换为精确裁图。

tcl
mater add name=TEOS
ambient name=GX react add
reaction name=TEOSreaction mat.l=Silicon mat.r=Gas mat.new=TEOS \
  new.like=Oxide ambient.name=GX diffusing.species=GX

说明:

  • mat.l=Siliconmat.r=Gas 为反应界面左右材料
  • mat.new=TEOS 指反应后生成材料
  • new.like=Oxide 使新材料及其界面继承 Oxide 的接口行为模板
  • 反应依赖 ambient GX,若 diffuse 中未启用该 ambient,则反应不发生
  • reaction 会自动将 GX 加入 solution 列表(GrowthStep

6.3.2 生长方程与界面通量

tcl
pdbSetString TEOS GX Equation "ddt(GX)- \[Arrhenius 0.2 1.86\]*grad(GX)"
pdbSetString Gas_TEOS     GX Equation_TEOS "-(GX_TEOS - 1e17)"
pdbSetString Silicon_TEOS GX Equation_TEOS "-5e-2*(GX_TEOS)"
pdbSetString Silicon_TEOS GX GrowthReaction " 5e-2*(GX_TEOS)"

其中 GrowthReaction 是 generic growth 特有关键字。其符号通常与对应扩散通量取相反号。

要激活反应,需在 gas_flowdiffuse 中给出 ambient:

tcl
gas_flow name= gxflw partial_pressure= {GX= 1.0}
diffuse time= 100 temp=1000 gas_flow= gxflw

或:

tcl
diffuse time=100 temp=1000 GX

6.3.3 参数数据库化

将模型参数放入 PDB,便于复用与调参:

tcl
pdbSetDouble TEOS GX Dstar "\[Arrhenius 0.2 1.86\]"
pdbSetDouble Gas_TEOS GX Cstar "1e17"
pdbSetDouble Silicon_TEOS GX Kfd "5e-2"
pdbSetDouble Silicon_TEOS GX Kfg "5e-2"
set diff [pdbDelayDouble TEOS GX Dstar]
pdbSetString TEOS GX Equation "ddt(GX)- $diff * grad(GX)"
set GXStar [pdbDelayDouble Gas_TEOS GX Cstar]
pdbSetString Gas_TEOS GX Equation_TEOS "-(GX_TEOS - $GXStar)"
set GKfd [pdbDelayDouble Silicon_TEOS GX Kfd]
pdbSetString Silicon_TEOS GX Equation_TEOS "-$GKfd*(GX_TEOS)"
set GKfg [pdbDelayDouble Silicon_TEOS GX Kfg]
pdbSetString Silicon_TEOS GX GrowthReaction " $GKfg*(GX_TEOS)"

关于生长速度,文档给出 FGrowthGrowthReactionExpansion.RatioDensity.Grow 的关系。默认值来自硅在 O2 氛围下氧化模型,可按需覆盖:

tcl
pdbSetDouble &lt;interface material&gt; &lt;ambient&gt; Beta &lt;n&gt;
pdbSetDouble &lt;interface material&gt; &lt;ambient&gt; Expansion.Ratio &lt;n&gt;
pdbSetDouble &lt;interface material&gt; &lt;ambient&gt; Density.Grow &lt;n&gt;

示例:

tcl
pdbSetDouble Silicon_TEOS GX Beta 1.1
pdbSetDouble Silicon_TEOS GX Expansion.Ratio 2.0
pdbSetDouble Silicon_TEOS GX Density.Grow 3e22

Expansion.Ratio=0 时,旧材料可溶解而新材料不生成(某些工艺场景有用)。

6.3.4 外延生长

可通过 reaction 定义新的外延模式,mat.final 指定扩散步结束后的最终材料:

tcl
ambient name=MyEpi epi add
mater name=MyEpiOnNitride add
reaction name= MyEpiOnNiReact mat.l=Nitride mat.r=Gas \
  mat.new=MyEpiOnNitride ambient.name=MyEpi new.like=PolySilicon \
  mat.final=PolySilicon

6.4 修改内置方程和项

Sentaurus Process 对已知解变量会自动生成默认方程/terms。若需“在内建模型上增量改写”,可用:

  • UserAddEqnTerm
  • UserSubEqnTerm
  • UserAddToTerm
  • UserSubFromTerm
  • MultiplyTerm

注意:

  • 这些命令用于“不走 callback”的 PDE 增量修改
  • 不建议放在 callback 过程内部使用
  • MultiplyTerm 外,修改会写入 TDR

6.4.1 UserAddEqnTerm / UserSubEqnTerm

语法:

tcl
UserAddEqnTerm &lt;material&gt; &lt;solution&gt; &lt;expression&gt; &lt;side&gt; overwrite | !overwrite
UserSubEqnTerm &lt;material&gt; &lt;solution&gt; &lt;expression&gt; &lt;side&gt; overwrite | !overwrite

示例:

tcl
UserAddEqnTerm Silicon CY "{2e-15*(CY*CY-1e-16*CX)}" overwrite
UserAddEqnTerm Oxide_Silicon CX "(CX_Oxide - CX_Silicon)" Silicon
UserSubEqnTerm Oxide_Silicon CX "(CX_Oxide - CX_Silicon)" Oxide

&lt;side&gt; 用于界面方程三组件(界面本体、左右材料侧)定向写入。

6.4.2 UserAddToTerm / UserSubFromTerm

语法:

tcl
UserAddToTerm   &lt;material&gt; &lt;term&gt; &lt;expression&gt;
UserSubFromTerm &lt;material&gt; &lt;term&gt; &lt;expression&gt;

示例:

tcl
UserAddToTerm Silicon MyTerm "2*CX"
UserSubFromTerm Silicon MyTerm "2*CX"

6.4.3 MultiplyTerm

语法:

tcl
MultiplyTerm &lt;material&gt; &lt;term&gt; &lt;expression&gt; [store]

示例:

tcl
MultiplyTerm Si MyTerm "2*CX"

若带 store,term 修改会保存到 TDR。


6.5 使用回调过程构建模型

回调机制允许在运行时按模型开关、材料名、解变量名动态拼装方程字符串。
这是内建复杂模型的主要实现方式。

6.5.1 回调关键字总览(Table 82)

关键字用途
EquationGrowthProc构建材料生长方程字符串
EquationInitProc构建初始化方程字符串
EquationProc构建扩散 PDE 方程字符串
GrowthRateProc外延生长速率相关回调
InitGrowthgeneric growth 前清理方程/terms
InitProc扩散求解前清理方程字符串
InitSolve初始化阶段清理/重置方程

6.5.2 diffuse 执行流程中的回调

图 2:diffuse 执行过程中的回调流程(占位图)

图 2:sprocess_ug.pdf 第 6 章 Figure 79(p.701)。

流程要点:

  1. diffPreProcess
  2. InitSolve / EquationInitProc
  3. 初始化方程求解
  4. InitProc
  5. EquationProc
  6. 正式扩散求解
  7. diffPostProcess

The diffPreProcess Procedure

diffPreProcess 在每个 diffuse 起始执行,负责初始化或预处理数据场。
典型操作包括截断非晶区缺陷分布、根据模型开关启停相关方程。

示例:

tcl
fproc diffPreProcess { } {
  LogFile "This procedure is used to initialize data fields CX and CY"
  sel z= "CX + 2.0e18 * exp( -(x-0.5)*(x-0.5) / (0.01 * 0.01) ) + 1.0" name= CX store
  sel z= "CY + CX * 0.1" name= CY store
}

若想保留系统默认预处理逻辑,建议改写 UserDiffPreProcess,不要整体覆盖 diffPreProcess

Initialization

初始化阶段:

  • 检查是否给某 material/solution 配置了 InitSolve
  • 检查是否配置了 EquationInitProc
  • 求解初始化方程(通常在 time=0
  • 调用 InitPostProcess(默认空实现)

若无需初始化,可在 diffuse 上用 !isolve 跳过。

Building and Solving PDEs

初始化后:

  • InitProc 常用于清空旧方程和旧 term
  • EquationProc 构建本步扩散方程
  • 然后在 diffuse 全温程求解

注意:若已设置 EquationProc,它通常会覆盖命令行直接写入的方程。

The diffPostProcess Procedure

diffPostProcess 在扩散结束执行,常用于:

  • 清理临时数据场
  • 保存总浓度类场
  • 调用默认空实现 UserDiffPostProcess

6.5.3 generic growth 执行流程中的回调

图 3:包含 generic growth 的 diffuse 回调流程(占位图)

图 3:sprocess_ug.pdf 第 6 章 Figure 80(p.706)。

与普通扩散流程相比,增加:

  • growthPreProcess
  • InitGrowth
  • EquationGrowthProc
  • generic growth equations 求解阶段

建议通过改写 UserGrowthPreProcess 增加自定义逻辑,而非完全覆盖系统默认实现。

6.5.4 用关键字指定回调

通用模式

tcl
pdbSetString Silicon CX InitProc CleanEquations
proc CleanEquations { Mat  Sol } {
  LogFile "This callback procedure unsets $Sol equation in $Mat."
  pdbUnSetString $Mat $Sol Equation
}

说明:

  • 第一参数始终是材料名,第二参数始终是解变量名
  • MatSol 只是 Tcl 形参名,可自定义
  • 若过程实现不依赖 Mat/Sol,可设计为通用回调并多处复用

InitProc:清理方程字符串

tcl
pdbSetString Silicon CX InitProc ResetEquations
pdbSetString Silicon CY InitProc ResetEquations
pdbSetString Oxide   CX InitProc ResetEquations
pdbSetString Oxide   CY InitProc ResetEquations

同一个 ResetEquations 可服务多材料多解变量,降低维护成本。

EquationProc:构建扩散方程字符串

tcl
pdbSetString Silicon CX EquationProc SetEquations
pdbSetString Silicon CY EquationProc SetEquations
pdbSetDouble Silicon CX D {[Arrhenius 0.138 1.37]}
pdbSetDouble Silicon CY D {[Arrhenius 0.02 0.3]}

fproc SetEquations { Mat Sol } {
  LogFile "This callback procedure sets $Sol equation in $Mat."
  set diff [pdbDelayDouble $Mat $Sol D]
  pdbSetString $Mat $Sol Equation "ddt($Sol) - $diff * grad($Sol)"
}

通过 pdbDelayDouble 可把扩散率参数化并延迟求值。

InitSolve + EquationInitProc:初始化方程

tcl
solution add name=CX !damp !negative solve InitStep
pdbSetString Silicon CX InitSolve ResetInitEquations
pdbSetString Silicon CX EquationInitProc SetInitEquations

proc ResetInitEquations { Mat Sol } {
  LogFile "This callback procedure unsets $Sol equation in $Mat during initialization."
  pdbUnSetString $Mat $Sol Equation
}

proc SetInitEquations { Mat Sol } {
  LogFile "This callback procedure sets $Sol equation in $Mat during initialization."
  set alpha [pdbDelayDouble $Mat $Sol Alpha]
  set beta  [pdbDelayDouble $Mat $Sol Beta]
  pdbSetString $Mat $Sol Equation "${Sol}_Implant - $Sol - (($alpha * $Sol)^$beta)"
}

EquationInitProc 只在初始化阶段调用,EquationProc 只在扩散阶段调用。

InitGrowth:清理 generic growth 方程与 term

tcl
pdbSetString TEOS         GX InitGrowth ResetEquations
pdbSetString Gas_TEOS     GX InitGrowth ResetInterfaceEquations
pdbSetString Silicon_TEOS GX InitGrowth ResetInterfaceEquations

接口侧清理通常需同时清理:

  • Equation
  • Equation_&lt;mater1&gt;
  • Equation_&lt;mater2&gt;
  • GrowthReaction

EquationGrowthProc:构建生长方程

tcl
pdbSetString TEOS GX EquationGrowthProc SetEquations

fproc SetEquations { Mat  Sol } {
  LogFile "This callback procedure sets $Sol equation in $Mat."
  set diff [pdbDelayDouble $Mat $Sol Dstar]
  pdbSetString $Mat $Sol Equation "ddt($Sol) -$diff * grad($Sol)"
}

pdbSetString Gas_TEOS     GX EquationGrowthProc SetInterfaceEquations
pdbSetString Silicon_TEOS GX EquationGrowthProc SetInterfaceEquations

SetInterfaceEquations 可结合 FirstMat/SecondMatpdbIsAvailable 在不同接口复用。

GrowthRateProc:外延生长速率

tcl
fproc mygrproc { Mat Amb } {
  pdbSetString $Mat $Amb GrowthReaction \
    "([simDelayDouble Diffuse EpiThick]- \
      [pdbDelayDouble $Mat $Amb NativeOffset])/ \
      [simDelayDouble Diffuse AnnealStepTime]"
}
pdbSet Gas_LTEOnOxide LTE GrowthRateProc mygrproc

该过程可访问的常用仿真量:

  • [simDelayDouble Diffuse EpiThick]
  • [pdbDelayDouble $Mat $Amb NativeOffset]
  • [simDelayDouble Diffuse AnnealStepTime]

若沉积的是非标准外延材料,还需设置:

tcl
pdbSetDouble &lt;mat.new&gt;_Gas &lt;ambient.name&gt; Expansion.Ratio 1.0
pdbSetDouble &lt;mat.new&gt;_Gas &lt;ambient.name&gt; Density.Grow 1.0

6.6 最小可执行示例(MWE)

下面给出一个“可直接运行并验证回调链路”的最小示例骨架。
目标:在 Silicon 中求解 CX 扩散方程,使用 InitProc + EquationProc 回调。

tcl
go sprocess

# 1) solution
solution add name=CX !damp !negative solve

# 2) 参数数据库项
pdbSetDouble Silicon CX D {[Arrhenius 0.138 1.37]}

# 3) 回调绑定
pdbSetString Silicon CX InitProc ResetEquations
pdbSetString Silicon CX EquationProc SetEquations

# 4) 回调实现
fproc ResetEquations { Mat Sol } {
  LogFile "Reset equation: $Mat / $Sol"
  pdbUnSetString $Mat $Sol Equation
}

fproc SetEquations { Mat Sol } {
  LogFile "Set equation: $Mat / $Sol"
  set diff [pdbDelayDouble $Mat $Sol D]
  pdbSetString $Mat $Sol Equation "ddt($Sol) - $diff * grad($Sol)"
}

# 5) 一个 Dirichlet 边界(示例)
pdbSetBoolean Gas_Silicon CX Fixed_Silicon 1
pdbSetString  Gas_Silicon CX Equation_Silicon "CX_Silicon - 5.0e19"

# 6) 扩散
diffuse time=100 temp=1000

# 7) 保存
struct tdr=out/ch6-mwe-final.tdr

验收点:

  • 日志中可见 Reset equationSet equation 输出
  • CX 方程被正确写入并参与求解
  • 边界侧浓度受 Equation_Silicon 约束

6.7 关键参数速查表

名称作用典型位置/写法备注
Equation主 PDE 字符串pdbSetString &lt;Mat&gt; &lt;Sol&gt; Equation "..."必须等于 0 形式
Equation_&lt;side&gt;界面侧方程/通量Equation_Silicon, Equation_Oxide, Equation_TEOS注意 side 一致性
Fixed_&lt;side&gt;Dirichlet 开关pdbSetBoolean Gas_Silicon CX Fixed_Silicon 1开启后该点通量忽略
GrowthReaction生长反应通量pdbSetString &lt;IF&gt; &lt;Sol&gt; GrowthReaction "..."generic growth / epi 关键
D, Dstar扩散率参数pdbSetDouble ... {[Arrhenius ...]}常用 pdbDelayDouble 读取
Cstar平衡浓度pdbSetDouble Gas_TEOS GX Cstar "1e17"常用于界面条件
Kf, Kfd, Kfg反应速率系数pdbSetDouble ... Kf/Kfd/Kfg ...用于反应项与生长通量
Alpha, Beta初始化模型参数pdbSetDouble ... Alpha/Beta ...用于 EquationInitProc
InitProc扩散前清理回调pdbSetString ... InitProc &lt;proc&gt;每扩散步可能调用
EquationProc扩散方程构建回调pdbSetString ... EquationProc &lt;proc&gt;覆盖命令行方程常见
InitSolve初始化清理回调pdbSetString ... InitSolve &lt;proc&gt;常配合 InitStep
EquationInitProc初始化方程构建回调pdbSetString ... EquationInitProc &lt;proc&gt;仅初始化阶段调用
InitGrowth生长前清理回调pdbSetString ... InitGrowth &lt;proc&gt;generic growth 专用
EquationGrowthProc生长方程构建回调pdbSetString ... EquationGrowthProc &lt;proc&gt;generic growth 专用
GrowthRateProc外延增长率回调pdbSet ... GrowthRateProc &lt;proc&gt;epi 专用
Expansion.Ratio转换体积比pdbSetDouble &lt;IF&gt; &lt;Amb&gt; Expansion.Ratio &lt;n&gt;0 时可只溶解不生长
Density.Grow生长材料密度pdbSetDouble &lt;IF&gt; &lt;Amb&gt; Density.Grow &lt;n&gt;影响生长速度换算

6.8 常见问题与诊断步骤

问题 1:方程不生效或被覆盖

现象:命令行写入的 Equation 没被实际求解。
原因:已配置 EquationProc,回调重写了方程。

诊断步骤:

  1. 检查是否存在 pdbSetString &lt;Mat&gt; &lt;Sol&gt; EquationProc ...
  2. 在回调中加 LogFile,确认调用顺序
  3. InitProc 后、EquationProc 中打印最终方程字符串

问题 2:界面条件写错侧(side)

现象:浓度/通量方向与预期相反,或边界无效。
原因:Equation_&lt;side&gt; 与变量后缀(如 CX_Silicon)不一致。

诊断步骤:

  1. 核对接口名是否字母序(如 Gas_Silicon
  2. 同时核对 Equation_&lt;side&gt;${Sol}_&lt;side&gt;
  3. 对分凝条件确认两侧符号是否相反

问题 3:pdbDelayDouble 嵌套导致表达式求值失败

现象:参数读取报错或值异常为 0。
原因:嵌套表达式未被 Tcl 正确展开。

诊断步骤:

  1. 将复杂表达式先拆为中间变量
  2. 必要时外包 expr
  3. pdbGet 检查每个参数最终值

问题 4:耦合反应项只加到一个方程

现象:系统收敛差、守恒不对、结果偏离。
原因:例如 RCXCY 未同时加入 CXCY 方程。

诊断步骤:

  1. 列出所有受影响 solution
  2. 检查每个方程是否都含反应项
  3. 在回调中逐个 LogFile 输出最终方程

问题 5:generic growth 不发生

现象:diffuse 后新材料不增长。
原因:ambient 未激活、GrowthReaction 未设置、接口参数缺失。

诊断步骤:

  1. 检查 gas_flowdiffuse 是否启用对应 ambient
  2. 检查 GrowthReaction 是否存在
  3. 检查 Kfd/Kfg/CstarExpansion.RatioDensity.Grow 是否已配置

问题 6:初始化步骤异常

现象:初值场异常、time=0 收敛失败。
原因:InitStep/InitSolve/EquationInitProc 配置不完整。

诊断步骤:

  1. solution 是否包含 InitStep
  2. InitSolve 是否先清理旧方程
  3. EquationInitProc 是否生成可求解方程
  4. 必要时先用 !isolve 隔离问题来源

6.9 参考

  • [1] R. E. Bank et al., “Transient Simulation of Silicon Devices and Circuits,” IEEE Transactions on Electron Devices, vol. ED-32, no. 10, pp. 1992-2007, 1985.

相关链接

基于 Sentaurus TCAD 官方文档构建

代码块