本节是关于Python API接口相关设置和用法的介绍。
SimWorks提供了名为simworks的Python的应用程序编程接口模块(API),允许用户通过Python脚本与SimWorks仿真软件(如FDTD、FDE、FDFD)进行交互,实现:
这个Python API接口,使得数据处理、自动化执行仿真、参数优化、高性能计算等具有更高自由度,满足用户的二次开发等高级需求。
下面介绍如何配置Python环境,使其能够正确加载SimWorks仿真软件的本地 DLL 和 Python API模块。
import os, sys
os.add_dll_directory(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\bin")
sys.path.append(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\api\python")
import simworks
import numpy as np
chmod +x appimage_file.AppImage
--appimage-extract
选项解压./appimage_file.AppImage --appimage-extract
import sys, os
sys.path.append("squashfs-root/api/usr/api/python/")
Contents/api/python/
。Contents/api/python/
。
import os
import sys
os.add_dll_directory(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\bin")
sys.path.append(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\api\python")
import simworks
import numpy as np
if __name__ == "__main__":
with simworks.FD() as fd:
# Add fdtd solver
fd.addfdtd()
fd.set("x",0)
fd.set("x span", 8e-6)
fd.set("y",0)
fd.set("y span",3e-6)
fd.set("z",0)
fd.set("z span",3e-6)
fd.set("boundary conditions x max","PML")
fd.set("boundary conditions x min","PML")
fd.set("boundary conditions y max","periodic")
fd.set("boundary conditions y min","periodic")
fd.set("boundary conditions z max","PML")
fd.set("boundary conditions z min","PML")
# Add rectangle structure
fd.addrect()
fd.set("x", 0)
fd.set("x span", 0.5e-6)
fd.set("y", 1e-6)
fd.set("y span", 2e-6)
fd.set("z", 0)
fd.set("z span", 2e-6)
# Set the material of rectangle
fd.set("material", "Ag (Silver)_CRC")
# Save project
fd.saveproject('F:\\pythondebug\\runfdtd.mpps')
# Source
fd.addplane()
fd.set('direction', 'Forward')
fd.set('incident axis', 'x')
fd.set('x', -2e-6)
fd.set('y', 0)
fd.set('y span', 6e-6)
fd.set('z', 0)
fd.set('z span', 6e-6)
fd.set('central wavelength', 1550e-9)
fd.set('wavelength span', 0)
# Monitor
fd.addpowermonitor()
fd.set("name", "T")
fd.set("spatial type", "2D X normal")
fd.set("x", 2e-6)
fd.set("y", 0)
fd.set("z", 0)
fd.set("y span", 6e-6)
fd.set("z span", 6e-6)
# Run FDTD
fd.run()
# Obtain the simulation results
Ex = fd.getdata("FDTD::T", "E", "Ex")
f = fd.getdata("FDTD::T", "E", "f")
sp = fd.getdata("FDTD::Plane", "sourcepower", "sourcepower")
print("done")
下面介绍SimWorks和Python在simworks接口上的数据传递。用Python API启动SimWorks Finite Difference Solutions的仿真软件时,建立了两者环境之间的联系,彼此的工作空间不共享,而是在变量传递过程中创建一个相同的副本,根据getv( )和put( )函数中定义的转换类型来进行前传和后传。
SimWorks API支持的数据类型为:Real/Complex/Sring/Matrix/Struct/Cell/Dataset(matrixdataset and unstructureddataset),具体实现请见下面的代码:
import os
import sys
os.add_dll_directory(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\bin")
sys.path.append(r"C:\Program Files\SimWorks\SimWorks FD Solutions beta\api\python")
import simworks
import numpy as np
if __name__ == "__main__":
with simworks.Simworks('fd') as fd:
# Run the defined scripts in the SimWorks GUI
fd.eval("addpoly;")
# Generate various data types
fd.eval("str = 'test string content';")
fd.eval(f"mdmds = reshape({[str(i) + str(i + 1) for i in range(3*4*5)]}, [3, 4, 5]);")
fd.eval("mdc = [1+2j, 3+4j; 5+6j, 7+8j];")
fd.eval("C = {1, 2, 3; 'text', rand(5,10,2), {11; 22; 33} };")
fd.eval("E2=struct()")
fd.eval("E2.x=1;E2.y=2;E2.f=1.55e-6;E2.Ex=rand(5,5);")
# Generate the combination of allowed data types
fd.eval("{0} = struct;".format(field_result_name) +
"{0}.E = getdata('{1}','E');".format(field_result_name, monitor_name))
# Get variables from SimWorks FD Solutions
var_str = fd.getv("str")
var_mdmds = fd.getv("mdmds")
var_mdc = fd.getv("mdc")
var_cellA=fd.getv("C")
var_E=fd.getv("E2")
# Put variables from Python back to SimWorks FD Solutions
fd.putv("num", np.array([12, 13]))
fd.putv("putcomplex_np_mat", np.array([[1 + 2j, 3 + 4j], [5 + 6j, 7 + 8j]]))
fd.putv("put_mdmdr", np.arange(3 * 4 * 5).reshape([3, 4, 5]))
fd.putv("putstrmat", np.array([["123", "45678", "6789"], ['9101112', '13141516171819', '1457']], order='F'))
fd.putv("putemptystrmat", np.array([], dtype=np.str_))
fd.putv("putcell",var_cellA)
fd.putv("putstruct",var_E)
fd.savematlabmatfile('Y:\\pythondebug\\struct.mat')
print("done")