Appearance
SProcess Ch6:Writing PDE Using Alagator
> 来源:sprocess_ug.pdf 第 6 章(W-2024.09,约 p.684-p.721)
> 说明:本页按原章小节顺序进行结构化翻译;命令关键字、文件名、参数、单位保持原文形式。
<details> <summary>本章目录</summary>
- 6.1 可用运算符和变量
- 6.2 指定偏微分方程的基础知识
- 6.3 指定通用生长方程的基础知识
- 6.4 修改内置方程和项
- 6.5 使用回调过程构建模型
- 6.6 最小可执行示例(MWE)
- 6.7 关键参数速查表
- 6.8 常见问题与诊断步骤
- 6.9 参考
</details>
6.1 可用运算符和变量
本章介绍如何使用 Alagator 脚本语言为仿真指定偏微分方程和边界条件。
PDE 以适合 Newton 迭代的“等于 0 的字符串表达式”形式给出。
多数数学运算符可用,并提供了微分项相关运算符。
需要特别注意 Tcl 对变量和字符串的展开时机,通常应在运行时求值,而不是在读取命令时求值。
6.1.1 二元和一元运算符
支持常见二元代数运算符,也支持一元负号。可使用括号控制分组与优先级。
注意:-(一元负号)与 ^(幂)在本语境中属于非标准优先级,编写时建议显式加括号。
条件运算符 ?: 有三个操作数:
- 第一个操作数:条件
- 第二个操作数:条件为真时的值
- 第三个操作数:条件为假时的值
注意:使用 ?: 时请为子表达式加括号,避免求值顺序错误。
支持的二元/一元运算符优先级(原表 81):
| 运算符 | 说明 |
|---|---|
- | Unary minus |
^ | Power,例如 a^b |
*, / | Multiplication, division |
+, - | Addition, subtraction |
<, <=, >=, >, ==, != | 比较与相等性判断 |
&& | Logical and |
| ` | |
?: | Conditional operator |
, | 列表逗号运算符 |
注意:== 与 != 用于浮点比较时需谨慎。
示例(截断剖面时常用):
tcl
select z= "(MyData>1e15) ? (1e15) : (MyData)" name= MyData该命令将网格点中 MyData > 1e15 的值截断到 1e15,小于等于阈值的点保持不变。
6.1.2 简单函数
简单函数均为单参数,参数必须写在括号内,可为任意表达式。常用函数包括:
exp(自然指数)log(自然对数)log10(以 10 为底对数)sqrt(平方根)erfc(互补误差函数)erf(误差函数)
其中 erfc 与 erf 常用于初始掺杂剖面构建。以上函数具有可用导数,可用于 PDE。
abs 与 sign 可用于绝对值和符号操作,但不提供导数,因此不能作为 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 字符串名称
未被识别为“实数、运算符、函数”的字符串,会按以下顺序匹配:
solution创建的有效解变量名term创建的命名子表达式- 数据场名称
- 传给 Tcl expression parser,若可解析为实数表达式则作为常数
这使得参数数据库中的参数可直接在 PDE 中使用。
6.1.5 解名称和子表达式
solution name=<c> 中的名称必须与 PDE 中字符串完全一致。
因为求解器会基于这些名称自动构建对各解变量的导数。
term name=<c> 同样要求名称严格匹配。
若某区域中“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。
双变量复合反应示例(CX 与 CY):
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: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=Silicon、mat.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_flow 或 diffuse 中给出 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 GX6.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)"关于生长速度,文档给出 FGrowth 与 GrowthReaction、Expansion.Ratio、Density.Grow 的关系。默认值来自硅在 O2 氛围下氧化模型,可按需覆盖:
tcl
pdbSetDouble <interface material> <ambient> Beta <n>
pdbSetDouble <interface material> <ambient> Expansion.Ratio <n>
pdbSetDouble <interface material> <ambient> Density.Grow <n>示例:
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=PolySilicon6.4 修改内置方程和项
Sentaurus Process 对已知解变量会自动生成默认方程/terms。若需“在内建模型上增量改写”,可用:
UserAddEqnTermUserSubEqnTermUserAddToTermUserSubFromTermMultiplyTerm
注意:
- 这些命令用于“不走 callback”的 PDE 增量修改
- 不建议放在 callback 过程内部使用
- 除
MultiplyTerm外,修改会写入 TDR
6.4.1 UserAddEqnTerm / UserSubEqnTerm
语法:
tcl
UserAddEqnTerm <material> <solution> <expression> <side> overwrite | !overwrite
UserSubEqnTerm <material> <solution> <expression> <side> 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<side> 用于界面方程三组件(界面本体、左右材料侧)定向写入。
6.4.2 UserAddToTerm / UserSubFromTerm
语法:
tcl
UserAddToTerm <material> <term> <expression>
UserSubFromTerm <material> <term> <expression>示例:
tcl
UserAddToTerm Silicon MyTerm "2*CX"
UserSubFromTerm Silicon MyTerm "2*CX"6.4.3 MultiplyTerm
语法:
tcl
MultiplyTerm <material> <term> <expression> [store]示例:
tcl
MultiplyTerm Si MyTerm "2*CX"若带 store,term 修改会保存到 TDR。
6.5 使用回调过程构建模型
回调机制允许在运行时按模型开关、材料名、解变量名动态拼装方程字符串。
这是内建复杂模型的主要实现方式。
6.5.1 回调关键字总览(Table 82)
| 关键字 | 用途 |
|---|---|
EquationGrowthProc | 构建材料生长方程字符串 |
EquationInitProc | 构建初始化方程字符串 |
EquationProc | 构建扩散 PDE 方程字符串 |
GrowthRateProc | 外延生长速率相关回调 |
InitGrowth | generic growth 前清理方程/terms |
InitProc | 扩散求解前清理方程字符串 |
InitSolve | 初始化阶段清理/重置方程 |
6.5.2 diffuse 执行流程中的回调

图 2:sprocess_ug.pdf 第 6 章 Figure 79(p.701)。
流程要点:
diffPreProcessInitSolve/EquationInitProc- 初始化方程求解
InitProcEquationProc- 正式扩散求解
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常用于清空旧方程和旧 termEquationProc构建本步扩散方程- 然后在
diffuse全温程求解
注意:若已设置 EquationProc,它通常会覆盖命令行直接写入的方程。
The diffPostProcess Procedure
diffPostProcess 在扩散结束执行,常用于:
- 清理临时数据场
- 保存总浓度类场
- 调用默认空实现
UserDiffPostProcess
6.5.3 generic growth 执行流程中的回调

图 3:sprocess_ug.pdf 第 6 章 Figure 80(p.706)。
与普通扩散流程相比,增加:
growthPreProcessInitGrowthEquationGrowthProc- 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
}说明:
- 第一参数始终是材料名,第二参数始终是解变量名
Mat、Sol只是 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接口侧清理通常需同时清理:
EquationEquation_<mater1>Equation_<mater2>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 SetInterfaceEquationsSetInterfaceEquations 可结合 FirstMat/SecondMat 与 pdbIsAvailable 在不同接口复用。
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 <mat.new>_Gas <ambient.name> Expansion.Ratio 1.0
pdbSetDouble <mat.new>_Gas <ambient.name> Density.Grow 1.06.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 equation和Set equation输出 CX方程被正确写入并参与求解- 边界侧浓度受
Equation_Silicon约束
6.7 关键参数速查表
| 名称 | 作用 | 典型位置/写法 | 备注 |
|---|---|---|---|
Equation | 主 PDE 字符串 | pdbSetString <Mat> <Sol> Equation "..." | 必须等于 0 形式 |
Equation_<side> | 界面侧方程/通量 | Equation_Silicon, Equation_Oxide, Equation_TEOS | 注意 side 一致性 |
Fixed_<side> | Dirichlet 开关 | pdbSetBoolean Gas_Silicon CX Fixed_Silicon 1 | 开启后该点通量忽略 |
GrowthReaction | 生长反应通量 | pdbSetString <IF> <Sol> 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 <proc> | 每扩散步可能调用 |
EquationProc | 扩散方程构建回调 | pdbSetString ... EquationProc <proc> | 覆盖命令行方程常见 |
InitSolve | 初始化清理回调 | pdbSetString ... InitSolve <proc> | 常配合 InitStep |
EquationInitProc | 初始化方程构建回调 | pdbSetString ... EquationInitProc <proc> | 仅初始化阶段调用 |
InitGrowth | 生长前清理回调 | pdbSetString ... InitGrowth <proc> | generic growth 专用 |
EquationGrowthProc | 生长方程构建回调 | pdbSetString ... EquationGrowthProc <proc> | generic growth 专用 |
GrowthRateProc | 外延增长率回调 | pdbSet ... GrowthRateProc <proc> | epi 专用 |
Expansion.Ratio | 转换体积比 | pdbSetDouble <IF> <Amb> Expansion.Ratio <n> | 0 时可只溶解不生长 |
Density.Grow | 生长材料密度 | pdbSetDouble <IF> <Amb> Density.Grow <n> | 影响生长速度换算 |
6.8 常见问题与诊断步骤
问题 1:方程不生效或被覆盖
现象:命令行写入的 Equation 没被实际求解。
原因:已配置 EquationProc,回调重写了方程。
诊断步骤:
- 检查是否存在
pdbSetString <Mat> <Sol> EquationProc ... - 在回调中加
LogFile,确认调用顺序 - 在
InitProc后、EquationProc中打印最终方程字符串
问题 2:界面条件写错侧(side)
现象:浓度/通量方向与预期相反,或边界无效。
原因:Equation_<side> 与变量后缀(如 CX_Silicon)不一致。
诊断步骤:
- 核对接口名是否字母序(如
Gas_Silicon) - 同时核对
Equation_<side>与${Sol}_<side> - 对分凝条件确认两侧符号是否相反
问题 3:pdbDelayDouble 嵌套导致表达式求值失败
现象:参数读取报错或值异常为 0。
原因:嵌套表达式未被 Tcl 正确展开。
诊断步骤:
- 将复杂表达式先拆为中间变量
- 必要时外包
expr - 用
pdbGet检查每个参数最终值
问题 4:耦合反应项只加到一个方程
现象:系统收敛差、守恒不对、结果偏离。
原因:例如 RCXCY 未同时加入 CX 与 CY 方程。
诊断步骤:
- 列出所有受影响 solution
- 检查每个方程是否都含反应项
- 在回调中逐个
LogFile输出最终方程
问题 5:generic growth 不发生
现象:diffuse 后新材料不增长。
原因:ambient 未激活、GrowthReaction 未设置、接口参数缺失。
诊断步骤:
- 检查
gas_flow或diffuse是否启用对应 ambient - 检查
GrowthReaction是否存在 - 检查
Kfd/Kfg/Cstar、Expansion.Ratio、Density.Grow是否已配置
问题 6:初始化步骤异常
现象:初值场异常、time=0 收敛失败。
原因:InitStep/InitSolve/EquationInitProc 配置不完整。
诊断步骤:
- solution 是否包含
InitStep InitSolve是否先清理旧方程EquationInitProc是否生成可求解方程- 必要时先用
!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.