首页 理论教育FEKO仿真原理:LUA脚本功能全解析

FEKO仿真原理:LUA脚本功能全解析

【摘要】:FEKO提供了LUA的脚本功能,在前处理CADFEKO和后处理POSTFEKO中均集成了LUA脚本编辑器Script editor,如图4-37所示。图4-37 FEKO的LUA脚本编辑器FEKO脚本编辑器的启动方法非常简单,即在CADFEKO或POSTFEKO的“Home”菜单中单击“Script editor”按钮,即可弹出脚本编辑器,如图4-38和图4-39所示。对于初学者,也有助于掌握LUA脚本。

FEKO提供了LUA的脚本功能,在前处理CADFEKO和后处理POSTFEKO中均集成了LUA脚本编辑器Script editor,如图4-37所示。在脚本编辑器中可以输入或编辑脚本,支持断点设置进行调试,可直接运行输出结果。

978-7-111-56144-6-Chapter04-63.jpg

图4-37 FEKO的LUA脚本编辑器

FEKO脚本编辑器的启动方法非常简单,即在CADFEKO或POSTFEKO的“Home”菜单中单击“Script editor”按钮,即可弹出脚本编辑器,如图4-38和图4-39所示。

978-7-111-56144-6-Chapter04-64.jpg

图4-38 CADFEKO中启动脚本编辑器

978-7-111-56144-6-Chapter04-65.jpg

图4-39 POSTFEKO中启动脚本编辑器

FEKO网站提供了部分脚本,网址为https://www.feko.info/support/lua-scripts,可直接下载。

1.LUA脚本在CADFEKO中的使用

CADFEKO可以基于LUA脚本来完成求解之前所有的工作,主要包括参量定义、材料定义、建立模型(包括导入几何模型或网格)、赋材料属性、端口定义、工作频率设置、求解方法设置、求解参数设置以及网格生成等,为了提高代码生成的效率,CADFEKO支持脚本宏的录制功能(Record macro),单击“Record macro”按钮后,CADFEKO按照单击按钮功能的顺序,自动生成LUA脚本,完成操作再次单击“Record macro”按钮后,会自动弹出脚本编辑器,查看生成的脚本,非常方便。同时,由于LUA脚本语法简单,易读性强,因此非常有助于用户理解和修改脚本。对于初学者,也有助于掌握LUA脚本。

这里给出的例子就是利用宏录制功能快速生成的脚本,可以直接复制下边几个部分的脚本到脚本编辑器,或直接读取光盘目录“../scripts/cadfeko/”中的“cadfeko_macro_record.lua”文件,直接运行。

示例:CADFEKO录制宏。

第1部分是创建CADFEKO的一个应用app(cf代表CADFEKO的一个接口),并生成一个工程project:

--CADFEKO14.0-273612(x64)

app=cf.GetApplication()

project=app:NewProject()

第2部分是设置长度单位为毫米(mm):

--Modified solution entity:Model unit

properties=project:GetProperties()

properties.ModelAttributes.Unit=cf.Enums.ModelUnitEnum.Millimetres

project:SetProperties(properties)

第3部分是设定几个主要变量

--Added variable"freq"=6e9

freq=project.Variables:Add("freq","6e9")

--Added variable"lam"=c0/freq/0.001

lam=project.Variables:Add("lam","c0/freq/0.001")

--Added variable"a"=0.8*lam

a=project.Variables:Add("a","0.8*lam")

--Added variable"b"=0.6*lam

b=project.Variables:Add("b","0.6*lam")

--Added variable"c"=0.2*lam

c=project.Variables:Add("c","0.2*lam")

第4部分是创建模型Cuboid1和Cylinder1:

--Created geometry:cuboid"Cuboid1"

properties=cf.Cuboid.GetDefaultProperties()

properties.Depth="b"

properties.Height="c"

properties.Label="Cuboid1"

properties.Width="a"

Cuboid1=project.Geometry:AddCuboid(properties)

--Created geometry:cylinder"Cylinder1"

properties=cf.Cylinder.GetDefaultProperties()

properties.Base.U="a/2"

properties.Base.V="b/2"

properties.Height="2*c"

properties.Label="Cylinder1"

properties.Radius="0.2*lam"

Cylinder1=project.Geometry:AddCylinder(properties)

第5部分是进行布尔操作:

--Created geometry:union""

Cuboid1=project.Geometry["Cuboid1"]

Cylinder1=project.Geometry["Cylinder1"]

targets={Cuboid1,Cylinder1}

project.Geometry:Union(targets)

第6部分是调整视图:

View3D=app.Views["3D view 1"]

View3D:ZoomToExtents()

第7部分是网格剖分设置:

MeshSettings=project.Mesher.Settings

properties=MeshSettings:GetProperties()

properties.Advanced.MinElementSize=37.0511713132585

properties.Advanced.RefinementFactor=62.4196350581785

properties.MeshSizeOption=cf.Enums.MeshSizeOptionEnum.Custom

properties.TetrahedronEdgeLength=""

properties.TriangleEdgeLength="lam/12"

properties.WireSegmentLength=""

MeshSettings:SetProperties(properties)

第8部分是进行网格划分:

--Mesh the model

project.Mesher:Mesh()

上述脚本的运行,也可以直接进入DOS界面,把目录切换到../scripts/cadfeko中,输入如下脚本,按〈Enter〉键即可:

>>:cadfeko--run-script cadfeko_macro_record.lua

关于CADFEKO中LUA脚本的使用方法与详细说明,可以参考User Manual中的第7章。

2.LUA脚本在POSTFEKO中的使用

POSTFEKO也支持LUA脚本功能,主要是利用LUA脚本读取bof中的计算结果信息(电场强度磁场强度电流功率、RCS等),并可对这些结果进行计算处理。

FEKO运算直接得到参量结果(近场、远场、源、阻抗、S参数、功率、模式项、T/R等),可以单击“Home”菜单中的“New script”按钮,选择相应的参数,会直接弹出脚本编辑器,自动生成相应的代码。

下边给出的示例,可以直接复制下边几个部分的脚本到POSTFEKO的脚本编辑器,保存该脚本文件,并把光盘目录“../scripts/postfeko”中的“horn.fek”和“horn.bof”复制过来,或直接读取光盘目录“../scripts/postfeko”中的“far_field.lua”文件,直接运行。

示例1:POSTFEKO读取远场数据,并在3D视图和直角坐标系中显示。

第1部分是创建POSTFEKO的一个应用app(pf代表POSTFEKO的一个接口),生成一个工程,并打开“Horn.fek”文件,读取CADFEKO求解设置中所设定的远场计算FarFields:

app=pf.GetApplication()

app:NewProject()

app:OpenFile("Horn.fek")

farFieldCollection=app.Models[1].Configurations[1].FarFields

第2部分添加一个直角坐标系,采用索引和名称两种方式来生成2D曲线:

--Add the first far field to a Cartesian graph

graph=app.CartesianGraphs:Add()

farFieldTrace1=graph.Traces:Add(farFieldCollection[1])--Index method

farFieldTrace2=graph.Traces:Add(farFieldCollection["FarField1"])--Name method

第3部分是显示远场的3D视图:

--Add all the far fields in the collection to the 3D view

for index,farFieldData in pairs(farFieldCollection)do

farFieldPlot=app.Views[1].Plots:Add(farFieldData)

end

示例2:POSTFEKO中通过LUA读取近场数据。

该脚本把z=0,以原点为中心,半径大于等于0.15m区域的电/磁场值强制设置为0:

978-7-111-56144-6-Chapter04-66.jpg(www.chuimin.cn)

上述脚本参见链接资源的文件“../scripts/postfeko/near_field.lua”。要运行该脚本,方法是:单击“Home”菜单中的“Script editor”按钮,启动脚本编辑器,这时复制上述代码,或选择打开“../scripts/postfeko/near_field.lua”,单击“运行”按钮。

示例3:POSTFEKO中通过LUA设置2D曲线的运算。

该脚本演示了如何读取FEKO安装路径下的已有工程的结果,显示近场的2D曲线,并激活“Enable math”选项,写入表达式实现2D曲线翻倍和取dB,其中FEKO_HOME是FEKO的环境变量,并可以在脚本编辑器中直接使用。

app=pf.GetApplication()

app:NewProject()

app:OpenFile(FEKO_HOME..[[/examples/Resources/Automation/startup.fek]])

cartesianGraph1=app.CartesianGraphs:Add()

trace1=cartesianGraph1.Traces:Add(app.Models[1].Configurations[1].NearFields[1])

--Set 'TraceMathExpression' properties

trace1.Math.Expression="self*2.0"

trace1.Math.Enabled=true

cartesianGraph2=app.CartesianGraphs:Add()

trace2=cartesianGraph2.Traces:Add(app.Models[1].Configurations[1].NearFields[1])

cartesianGraph1:ZoomToExtents()

--Set 'TraceMathExpression' properties

trace2.Math.Expression="20*log(self)"

trace2.Label="NearField_Math_Expression_".."20log10E"

trace2.Math.Enabled=true

trace3=cartesianGraph2.Traces:Add(app.Models[1].Configurations[1].NearFields[1])

--Set 'Value ScaledToDB'

trace3.Quantity.ValuesScaledToDB=true

trace3.Label="NearField_dB"

关于POSTFEKO中LUA脚本的使用方法与详细说明,可以参考User Manual中的第10章。

3.LUA窗体与控件(Form&Controls)

为方便用户创建自定义窗体(Form)以实现某些功能应用,FEKO集成的LUA脚本也提供了窗体与常用控件(Controls)集创建功能,可以通过输入脚本的方式来完成,不提供常用控件的面板功能。对于复杂的窗体,也可以通过Visual Studio等工具来创建。

FEKO提供了控件集主要包括:按钮(formButtons),组合框(formComboBox),复选框(FormCheckBox),单选按钮(FormRadioButtonGroup),文本编辑框(FormLineEdit),选项卡(FormLabel),文件夹浏览(FormDirectoryBrowser),文件浏览(FormFileBrowser),文件另存为(FormFileSaveAsBrowser),控件分组容器(FormGroupBox)等。详细的内容可以参考软件自带的UserManual.pdf第10.3.67~10.3.91节所列的内容。

在POSTFEKO中,打开Script editor,并把下述代码复制到脚本编辑区域;或直接在脚本编辑器中单击打开按钮,打开“../scripts/controls/form_controls.lua”,单击“Run script”按钮或按〈Ctrl+R〉快捷键运行该脚本,显示如图4-40所示的界面(在该脚本中读取链接资源中自带的Horn.fek文件和图片文件horn.png)。

978-7-111-56144-6-Chapter04-67.jpg

978-7-111-56144-6-Chapter04-68.jpg

978-7-111-56144-6-Chapter04-69.jpg

图4-40 显示的界面

4.其他主要模块

FEKO安装完成后,包含大量的LUA模块,默认情况下可以直接使用下列模块。

1)math:一个数学类库,包含常用的函数方法,见表4-15。

2)string:一个字符串处理库。

3)table:一个表数据处理库。

4)os:方便用户访问操作系统环境和文件的类库。

5)io:一个读写文件的输入/输出模块。

6)debug:脚本调试模块。

4-15 常用函数

978-7-111-56144-6-Chapter04-70.jpg

FEKO安装完后,有些广泛应用的LUA模块(也包括网上下载得到的模块)在默认情况下会包含进来,如果要应用这些模块,则必须使用函数require()进行加载,例如,require('luacom')。下面介绍的几个模块均为FEKO安装自带的模块,应用时必须重新进行加载。

1)luacom:在Windows系统中安装完FEKO后,会包含“luacom”模块,该模块是一个非常强大的模块,它使用户可以使用各种com组件,如Office的Word、Excel等。下述示例说明了如何使用该模块来控制Excel。

--COM example 1

require('luacom')

excel=luacom.CreateObject("Excel.Application")

excel.Visible=true

wb=excel.Workbooks:Add()

ws=wb.Worksheets(1)

for i=1,20 do

ws.Cells(i,1).Value2=i

end

--COM example 2

require"luacom"

excel=luacom.CreateObject("Excel.Application")

local book=excel.Workbooks:Add()

local sheet=book.Worksheets(1)

excel.Visible=true

for row=1,30 do

sheet.Cells(row,1).Value2=math.floor(math.random()*100)

end

local chart=excel.Charts:Add()

chart.ChartType=4

local range=sheet:Range("A1:A30")

chart:SetSourceData(range)

2)LuaFileSystem:该模块提供便携的方式访问底层的目录结构和文件属性。模块名称必须包括“lfs”。

3)LuaXml:一个处理XML数据的精简函数集,必须采用名称“luaxml”来调用该模块。

4)PenLight:LUA的扩展模块,一个包含表、数组、字符串、路径和目录、数据和函数的集合,必须采用名称“pl”来调用该模块。

5)winapi:该模块是视窗操作系统应用程序接口,提供了一些基本的工具,用于Windows系统,如访问注册表、找出系统资源,并让用户更多地控制进程的创建。

FEKO的LUA脚本也提供了特殊的功能函数集,这里列出一部分:

1)Complex——复数运算函数集。

2)Matrix——矩阵运算函数集。

3)ComplexMatrix——快速矩阵复数运算。

下述脚本演示了矩阵的复数运算,参见链接资源“../scripts/math/matrix_complex.lua”。为了保证该脚本在CADFEKO和POSTFEKO中都可以直接运行,而不用修改代码,这里加入了一行特殊的命令——“feko=cf or pf”。

--Create a default 2×2 complex matrix of zeros

feko=cf or pf

cm1=feko.ComplexMatrix.Zeros(2)

--Assign values to each element of the matrix

cm1[1][1]=1+j

cm1[2][1]=2+2*j

cm1[1][2]=3+3*j

cm1[2][2]=4+4*j

--Create a 2×2 complex matrix with a fill value of 2+j

cm2=feko.ComplexMatrix(2,2,2+j)

--Determine the transpose and determinant of the matrix

transpose=cm1:Transpose()

determinant=cm1:Determinant()

--Some of the valid operators for 'ComplexMatrix'

cm3=cm1*2

cm4=cm2*(3+j)

cm5=cm1+2

cm6=cm1-1

cm7=cm1+cm2

cm8=cm1-cm2

本部分的内容主要针对LUA脚本的初学者,通过本节的学习,能够快速掌握FEKO的LUA脚本的使用以及最基本的函数和结果处理功能,为以后灵活应用LUA脚本解决工作中的任意功能需求打下坚实的基础。