CST-Python實(shí)例教程二:控制 CST 建模
前言
在工程設(shè)計(jì)、求解計(jì)算的過(guò)程中,往往存在大量重復(fù)性的工作,這些工作不僅耗時(shí)耗力,而且容易出錯(cuò)。為了提高工作效率,減少人為錯(cuò)誤,我們希望這些重復(fù)性工作能夠被計(jì)算機(jī)自動(dòng)完成,從而讓工程師從繁重的重復(fù)性勞動(dòng)中解放出來(lái),將更多的精力投入到創(chuàng)造性的工作中。
CST Studio Suite(R) 提供了 Python 編程接口,也提供了在 Python 環(huán)境中執(zhí)行 VB 腳本的接口。并且,在 CST Studio Suite 2024 中,CST Python Libraries 的特性得到了更新。
廣州浦信系統(tǒng)技術(shù)有限公司發(fā)布的 CST Studio Suite(R) Python Automation and Scripting 系列文章,將會(huì)為您詳細(xì)介紹使用 Jupyter Notebook 連接到 CST Studio Suite 進(jìn)行腳本控制與自動(dòng)化仿真的方方面面。
現(xiàn)在,我們將使用 Jupyter Notebook 連接到 CST Studio Suite,通過(guò)一個(gè)演示案例,完成腳本控制建立模型、查看結(jié)果等工作,并在 Python 中進(jìn)行更多自動(dòng)化任務(wù)。
文章共分為5個(gè)部分,分別介紹以下內(nèi)容:
搭建 Python 環(huán)境
控制 CST 建模
仿真并繪制結(jié)果
仿真優(yōu)化
外部后處理
本期為第 2 篇文章,詳細(xì)介紹如何使用 Python 控制 CST 創(chuàng)建仿真模型。
準(zhǔn)備工作
在上一篇文章中,我們分享了如何搭建 Python 測(cè)試環(huán)境的流程。本次案例基于上一篇文章的模型操作。
如果您保留了上次搭建環(huán)境時(shí)候的 Jupyter Notebook 工程和 CST 工程,可以在關(guān)聯(lián)文件后基于該模型繼續(xù)操作。
如果您未保留上一次的 CST 工程,可以按照以下步驟操作:
打開(kāi)測(cè)試案例并檢查對(duì)應(yīng)的庫(kù)
在 cmd 中輸入以下內(nèi)容(注意全是小寫(xiě))即可進(jìn)入控制臺(tái)。
jupyter notebook
打開(kāi)測(cè)試案例,運(yùn)行有以下代碼,加載必要的庫(kù)。如果有報(bào)錯(cuò)提示缺少庫(kù),使用pip
安裝缺少的庫(kù),直到無(wú)報(bào)錯(cuò)出現(xiàn)。
import timeimport numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import minimizeimport tempfiletmp = tempfile.gettempdir()%matplotlib notebook
運(yùn)行下面的代碼,加載 CST Python 庫(kù)。
# cst related importsimport cstimport cst.interfaceimport cst.resultsprint(cst.__file__) # should print '<PATH_TO_CST_AMD64>\python_cst_libraries\cst\__init__.py'
如果成功執(zhí)行該命令,該單元格的輸出將打印庫(kù)的路徑。
調(diào)用 CST 并創(chuàng)建項(xiàng)目
現(xiàn)在,讓我們調(diào)用 CST Design Environment,開(kāi)始初始化連接。
project = cst.interface.DesignEnvironment()
執(zhí)行該代碼,打開(kāi) CST Design Environment,會(huì)出現(xiàn)提示“靜態(tài)/腳本模式已激活,彈出窗口已被阻止”彈窗,點(diǎn)擊“Swich to Interactive Mode”切換到交互模式即可。
運(yùn)行下面的代碼,創(chuàng)建一個(gè)空的 CST Microwave Studio 項(xiàng)目。
mws_project = project.new_mws()
運(yùn)行下面的代碼,激活當(dāng)前項(xiàng)目的窗口。
mws_project.activate()
將項(xiàng)目保存在當(dāng)前用戶的TEMP
文件夾中,即C:\Users\<Users>\AppData\Local\Temp
路徑。
mws_project.save(tmp+"\CST_TEST.cst")
如果提示“文件已存在”,說(shuō)明此前已經(jīng)保存過(guò)該文件到該目錄,沒(méi)有賦予文件操作相關(guān)的命令,無(wú)法覆蓋保存。
可以修改擬保存的項(xiàng)目名稱,也可以在文件管理器中訪問(wèn)該路徑刪除原有文件。
此外,用戶也可以根據(jù)自己的需求,將項(xiàng)目文件保存到指定的位置。
創(chuàng)建 offset 參數(shù)
在模型中創(chuàng)建一個(gè)名為offset
的參數(shù)。
mws_project.model3d.StoreDoubleParameter("offset",3)
請(qǐng)檢查該參數(shù)在項(xiàng)目參數(shù)列表中是否可見(jiàn)。
建模
CST 支持 Python 與 VBA,并通過(guò)在 Python 調(diào)用封裝的 VBA 命令,以獲得完整的腳本功能。
在這里,我們先使用 VBA 定義模型,隨后使用 Python 命令add_to_history
將之前定義的建模命令添加到 History List 中,以完成建模操作。
模型介紹
選用一個(gè) T 型波導(dǎo)進(jìn)行建模演示。在 T 形波導(dǎo)結(jié)構(gòu)中,中間的金屬結(jié)構(gòu)通常被稱為“探針”,它的作用主要是將能量從主波導(dǎo)耦合到分支波導(dǎo),或者從分支波導(dǎo)耦合到主波導(dǎo)。
改變探針的位置,能夠改變波導(dǎo)內(nèi)部的場(chǎng)分布。前面設(shè)置的offset
參數(shù)的作用就是修改探針的位置。這個(gè)參數(shù)在建模和優(yōu)化的過(guò)程中會(huì)用到。
我們嘗試使用命令來(lái)進(jìn)行建模操作。
使用 VBA 定義命令
在該操作的中間步驟中,并非所有的 VBA 命令都有對(duì)應(yīng)的本地 Python 命令。
不過(guò),為了保證操作的連續(xù)性,通過(guò)在 Python 中調(diào)用封裝的 VBA 命令,仍然可以獲得完整的腳本功能控制 CST。
接下來(lái)將通過(guò) VBA 代碼來(lái)定義一些命令。
設(shè)置求解器參數(shù)
設(shè)置仿真頻率為 8-10 GHz,并設(shè)置一個(gè) 9GHz 場(chǎng)監(jiān)視器,求解器選用 T 求解器。
Full_History = """'Set FreqSolver.FrequencyRange 8, 10"""Full_History = Full_History + """'Define MonitorWith Monitor .Reset .Name "e-field (f=9)" .Dimension "Volume" .Domain "Frequency" .FieldType "Efield" .Frequency 9 .CreateEnd With"""Full_History = Full_History + """'Define SolverChangeSolverType "HF Time Domain"With Solver .CalculationType "TD-S" .StimulationPort "1" .StimulationMode "1" .MeshAdaption False .CalculateModesOnly False .SParaSymmetry False .StoreTDResultsInCache False .FullDeembedding False .UseDistributedComputing FalseEnd With"""
創(chuàng)建 T 型波導(dǎo)模型
Full_History = Full_History + """'Define UnitsWith Units .Geometry "mm" .Frequency "ghz" .Time "ns" End With ' set workplane propertiesWith WCS .SetWorkplaneSize "50" .SetWorkplaneRaster "10" .SetWorkplaneSnap "TRUE" .SetWorkplaneSnapRaster "5"End With' new component: component1Component.New "component1" ' define brick: component1:solid1With Brick .Reset .Name "solid1" .Component "component1" .Material "Vacuum" .Xrange "-10", "10" .Yrange "0", "10" .Zrange "0", "40" .CreateEnd With' pick facePick.PickFaceFromId "component1:solid1", "6" ' align wcs with faceWCS.AlignWCSWithSelectedFace Pick.PickCenterpointFromId "component1:solid1", "6" WCS.AlignWCSWithSelectedPoint ' define brick: component1:solid2With Brick .Reset .Name "solid2" .Component "component1" .Material "Vacuum" .Xrange "-5", "5" .Yrange "-10", "10" .Zrange "0", "20" .CreateEnd With' pick facePick.PickFaceFromId "component1:solid2", "1" ' define port: 1With Port .Reset .PortNumber "1" .NumberOfModes "1" .AdjustPolarization False .PolarizationAngle "0.0" .ReferencePlaneDistance "0" .TextSize "50" .Coordinates "Picks" .Orientation "xmax" .PortOnBound "True" .ClipPickedPortToBound "False" .Xrange "30", "30" .Yrange "0", "10" .Zrange "10", "30" .Create End With ' pick facePick.PickFaceFromId "component1:solid1", "1" ' define port: 2With Port .Reset .PortNumber "2" .NumberOfModes "1" .AdjustPolarization False .PolarizationAngle "0.0" .ReferencePlaneDistance "0" .TextSize "50" .Coordinates "Picks" .Orientation "zmax" .PortOnBound "True" .ClipPickedPortToBound "False" .Xrange "-10", "10" .Yrange "0", "10" .Zrange "40", "40" .Create End With ' pick facePick.PickFaceFromId "component1:solid1", "2" ' define port: 3With Port .Reset .PortNumber "3" .NumberOfModes "1" .AdjustPolarization False .PolarizationAngle "0.0" .ReferencePlaneDistance "0" .TextSize "50" .Coordinates "Picks" .Orientation "zmin" .PortOnBound "True" .ClipPickedPortToBound "False" .Xrange "-10", "10" .Yrange "0", "10" .Zrange "0", "0" .Create End With ' define boundariesWith Boundary .Xmin "electric" .Xmax "electric" .Ymin "electric" .Ymax "electric" .Zmin "electric" .Zmax "electric" .Xsymmetry "none" .Ysymmetry "electric" .Zsymmetry "none" End With' define backgroundWith Background .ResetBackground .XminSpace "0.0" .XmaxSpace "0.0" .YminSpace "0.0" .YmaxSpace "0.0" .ZminSpace "0.0" .ZmaxSpace "0.0" .ApplyInAllDirections "False" End With With Material .Reset .FrqType "all" .Type "Pec" .MaterialUnit "Frequency", "Hz" .MaterialUnit "Geometry", "m" .MaterialUnit "Time", "s" .MaterialUnit "Temperature", "Kelvin" .Epsilon "1.0" .Mu "1.0" .ReferenceCoordSystem "Global" .CoordSystemType "Cartesian" .NLAnisotropy "False" .NLAStackingFactor "1" .NLADirectionX "1" .NLADirectionY "0" .NLADirectionZ "0" .Rho "0.0" .ThermalType "Normal" .ThermalConductivity "0.0" .SpecificHeat "0.0", "J/K/kg" .MetabolicRate "0" .BloodFlow "0" .VoxelConvection "0" .MechanicsType "Unused" .Colour "0.6", "0.6", "0.6" .Wireframe "False" .Reflection "False" .Allowoutline "True" .Transparentoutline "False" .Transparency "0" .ChangeBackgroundMaterialEnd With ' activate global coordinatesWCS.ActivateWCS "global"' boolean add shapes: component1:solid1, component1:solid2Solid.Add "component1:solid1", "component1:solid2" ' pick facePick.PickFaceFromId "component1:solid1", "11" ' align wcs with faceWCS.AlignWCSWithSelectedFace Pick.PickCenterpointFromId "component1:solid1", "11" WCS.AlignWCSWithSelectedPoint ' store picked point: 1Pick.NextPickToDatabase "1" Pick.PickEndpointFromId "component1:solid1", "9"' define cylinder: component1:solid2With Cylinder .Reset .Name "solid2" .Component "component1" .Material "PEC" .OuterRadius "1" .InnerRadius "0" .Axis "z" .Zrange "zp(1)", "0" .Xcenter "-10+offset" .Ycenter "0" .Segments "0" .Create End With ' activate global coordinatesWCS.ActivateWCS "global""""
將建模命令添加到 History List
隨后,我們向 CST 發(fā)送建模命令。
注意,這次我們使用的是 Python 命令add_to_history
。這將執(zhí)行我們之前定義的命令字符串,并將這些命令添加到 History List 中。
mws_project.model3d.add_to_history ("My_Splitter" , Full_History)
檢查幾何體是否在界面中可見(jiàn),并檢查求解器和頻率設(shè)置。
至此,已經(jīng)完成建模、設(shè)置場(chǎng)監(jiān)視器和求解器的步驟。
總結(jié)
CST 支持 Python 與 VBA,并通過(guò)在 Python 調(diào)用封裝的 VBA 命令,獲得完整的腳本功能。
先使用 VBA 定義模型,隨后使用 Python 命令
add_to_history
將之前定義的建模等命令添加到 History List 中,以完成建模操作。