3.6 KiB
3.6 KiB
DEVSIM Customization: min_error Implementation Walkthrough
這份文件總結了我們為了將 DEVSIM 核心的載子收斂底限參數 min_error 開放給 Python 介面所做的所有工作。我們成功在獨立的 devsim-dev 環境中完成了原始碼修改、重新編譯,並在本地端虛擬環境中完成了安裝與驗證。
1. C++ 原始碼修改 (Backend Changes)
我們成功實作了 Plan B,也就是完全仿造 variable_update 參數的設計模式,將 min_error 拉出成為一個選項。
修改了以下三個核心檔案:
-
- 在類別定義中宣告了
void SetMinError(double);的新介面。
- 在類別定義中宣告了
-
- 實作了該介面,使其在內部呼叫泛型(
double或float128)的底層equation->setMinError(...),以確實改變運算引擎中的收斂底限判定。
- 實作了該介面,使其在內部呼叫泛型(
-
- 修改了
createEquationCmd函數,在參數解析清單中註冊了"min_error"選項。 - 設定其預設值為
"1.0e-10"以保持向後相容性。 - 提取 Python 端傳入的值,並呼叫
eh.SetMinError(min_error)。
- 修改了
Note
這些修改使得我們無需更動
Equation.cc內硬編碼的defminError = 1.0e-10,而是以優雅、可擴充的方式從 API 進行覆寫。
2. 環境與編譯挑戰解決 (Build Process)
編譯過程中我們遇到了一些環境與依賴挑戰,均順利排除:
- 子模組拉取:因為原 DEVSIM repo 使用了相對路徑的 Git Submodules,但在 GitLab 的 Fork 中無法對應到公開庫。我們改由直接從 GitHub 官方抓取
umfpack_lgpl、symdiff、superlu與boostorg相關套件。 - SuperLU 標籤相容性:一開始使用了
master版本的 SuperLU,導致與 DEVSIM 2.0 期待的 API (dgstrf缺少第 12 個引數GlobalLU_t *) 不合。我們迅速將其降版至與 DEVSIM 2.0 完全相容的v5.2.2。 - 編譯器與 128 位元支援:為了支援
-DDEVSIM_EXTENDED_PRECISION=ON,我們從clang切換為gcc,並且在 CMake 參數中動態加入了QUADMATH_ARCHIVE=-lquadmath連結參數,成功讓math與devsim模組連結了 Linux 原生的libquadmath。
3. 打包與驗證 (Packaging & Verification)
-
打包 Wheel:
- 修正了 DEVSIM 官方編譯腳本
build_standalone_wheel.sh中未加上引號,導致複製有空白的檔名(PROJECT GUIDE.md)會失敗的 Bug。 - 順利打包產出了
devsim-2.10.0-cp39-abi3-linux_x86_64.whl。
- 修正了 DEVSIM 官方編譯腳本
-
安裝與執行測試:
- 透過
pip install --force-reinstall將自製的 DEVSIM 安裝進/home/pchan/devsim2026/.venv/環境中。 - 我們撰寫了一支簡單的 Python 測試腳本
test_min_error.py來呼叫包含min_error=1.0e-5的新 API。
- 透過
測試結果:
devsim.equation(device="dev1", region="reg1", name="MyEq", variable_name="MyVar", variable_update="positive", min_error=1.0e-5)
執行後沒有出現任何參數錯誤或崩潰(Crash),順利印出 Equation with min_error successfully created!,代表 Python 端與 C++ 端已完美橋接。
Tip
之後您可以開始在
devsim_bjt_example-main中對載子連續性方程式進行測試了! 當您確認目前修改完全符合需求後,我們就可以隨時將這份修改透過git push上傳至 GitLab 成為專屬的wisetop-custom版本!