FDTD基本用法

本文详细介绍了Lumerical脚本语言在运行仿真软件、添加对象等方面的应用,包括模式转换、运行仿真文件、配置ResourceManager、证书检查、添加仿真区域和对象等关键步骤,并提供了丰富的代码示例,是学习Lumerical软件操作的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文主要介绍Lumerical脚本语言和fdtd的一些用法,后续会不断更新。


一、运行仿真软件

1.模式转换

语法描述
switchtolayout;从ANALYSIS模式转换到LAYOUT模式,用于修改仿真对象,会丢失ANALYSIS模式的结果
?layoutmode;LAYOUT模式返回1,ANALYSIS模式返回0

代码如下(示例):

load("test.fsp");
status = layoutmode;

if (status == 1) {
    addrect;
}
else {
    switchtolayout;
    addrect;
}
#首先,导入"test.fsp"文件,如果我们想要在仿真区域里加入一个长方形(addrect;);
#其次使用layoutmode判断仿真文件的状态,
#如果是ANALYSIS模式,那么调用switchtolayout进行状态切换进而添加结构;
#如果是LAYOUT模式则可直接执行addrect命令

2.运行仿真文件

语法 (FDTD)描述
run;按照resource manager的指定好的并行模式进行计算仿真
runparallel;按照resource manager的指定好的并行模式进行计算仿真
run(option1);Option1 (default: 3),可以选择1,2,3,分别代表不同的计算方式

代码如下(示例):

newproject;  # 创建一个新的方针文件
addfdtd;    # 添加fdtd仿真区域
adddipole;   # 添加一个偶极子光源
run;      # 运行

3.配置resource manager

语法描述
addresource(“solver”);用来选择计算方法,如addresource(“DGTD”); 选择时域不连续伽略金方法进行计算
deleteresource(“solver”,resource_num);从resource manager中删除resource

4.检查证书

语法描述
checkout(“licensefeature”);从license server中获得当前软件的licensefeature概况
checkout('heat_solver');
checkout('FDTD_Solutions_engine');
checkout('cml_compiler');

二、添加对象

1.仿真区域

语法描述
addfdtd;在仿真环境中添一个fdtd仿真区域

代码如下(示例):

addfdtd;
set("dimension",2);  #  1 = 2D, 2 = 3D
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
set("z span",10e-6);
run;#在以上的区域运用fdtd方法进行模拟计算

2.添加仿真对象

A.set命令

语法描述
?set;返回选择对象的一系列结构参数
set(“property”,value);如set(“radius”,1e-6);设置半径参数为1e-6;value值可以是数值或字符串(见示例)
set(“property”,value,i);和set(“property”,value);类似,当多个对象需要设置参数时,可使用此命令(i代表索引)
setnamed(“name”, “property”, value);和set(“property”,value);类似,‘name’参数为指定选择的对象

代码如下(示例):

select("circle");#选择所以的‘circle’结构
for (i=1:getnumber) {
 rad=get("radius",i);
 set("radius",rad+2e-6,i);
} #依次遍历,使所有的半径值增加2e-6
set("x min bc","PML");#设置x边界条件为PML(完美匹配层)
set("enabled",0);#删除一个结构
#选中一个结构对象,改变其参数
coordinates = {"x" : -3e-7,
               "x span" : 1e-6,
               "y" : 5e-6,
               "y span" : 1e-5,
               "z" : 1e-7,
               "z span" : 2.2e-7};

set(coordinates);

B.添加结构

语法描述
addcustom;个性化添加结构对象(见示例1)
addcircle;添加圆形结构(见示例2)
addpyramid;添加锥形结构(见示例3)
addlayerbuilder;添加层状结构(见示例4)
addlayer(“name”);添加层状结构(见示例4),同时声明层的名称

代码如下(示例1):

#生成一个半球,"revolution"代表旋转
addcustom;
set("create 3D object by","revolution");#  y = sqrt(0.5^2-(x-0.5)^2)
set("equation 1","sqrt("+num2str(0.5)+"^2-(x-"+num2str(0.5)+")^2)");   
set("x span",1e-6);
set("y span",1e-6);
set("z span",2e-6);
#生成一个半圆,"extrusion"代表沿着z方向压缩
addcustom;
set("create 3D object by","extrusion");#  y = sqrt(0.5^2-(x-0.5)^2)
set("equation 1","sqrt("+num2str(0.5)+"^2-(x-"+num2str(0.5)+")^2)");   
set("x span",1e-6);
set("y span",1e-6);
set("z span",2e-6);

代码如下(示例2):

addcircle;
set("name","new_circle");
set("x",1e-6);#圆形坐标
set("y",2e-6);#圆形坐标
set("radius",5e-6);
set("z",0);#圆形坐标
set("z span",10e-6);#设置z方向的厚度

代码如下(示例3):

addpyramid;
set("name","my_pyramid");
set("x span bottom",5e-6);
set("x span top",3e-6);
set("y span bottom",4e-6);
set("y span top",3e-6);
set("z span",1e-6);
set("material","Si (Silicon) - Palik");

代码如下(示例4):

addlayerbuilder;
# Layer 1 = 100 nm layer of silver
addlayer("layer_1");
setlayer("layer_1","thickness",100e-9);
setlayer("layer_1","material","Ag (Silver) - CRC");
# Layer 2 = 500 nm layer of silicon
addlayer("layer_2");
setlayer("layer_2","thickness",500e-9);
setlayer("layer_2","material","Si (Silicon)");

C.添加光源

语法描述
adddipole;添加偶极子光源,见代码示例1
addgaussian;添加高斯光源,见代码示例2
addplane;添加平面波,见代码示例3
addmode;添加波模,见代码示例3

代码如下(示例1):

adddipole;
set("x",0);
set("y",-1e-6);
set("z",5e-6);

代码如下(示例2):

#生成一个沿z负方向传播的高斯光束
addgaussian;
set("injection axis","z");
set("direction","backward");
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",10e-6);
set("use scalar approximation",1);
set("waist radius w0",0.5e-6);
set("distance from waist",-5e-6);

代码如下(示例3):

#生成一个沿z负方向传播的平面波
addplane;
set("injection axis","z");
set("direction","backward");
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",3e-6);
set("wavelength start",0.3e-6);
set("wavelength stop",1.2e-6);

代码如下(示例4):

addmode;
set("injection axis","x");
set("x",0);
set("y",0);
set("y span",5e-6);
set("z",0);
set("z span",10e-6);

3.添加监视器对象

语法描述
addindex;添加折射率监视器,见代码示例1
addeffectiveindex;添加有效折射率监视器,见代码示例2
addtime;添加时间监视器,见代码示例3
addmovie ;添加视频监视器,见代码示例4
addpower;添加能量监视器(用于获取频域中的能量信息),见代码示例5
addprofile;添加profile监视器,此监视器和上面的能量监视器相似,不同之处在于获取时profile监视器进行了差值运算,所以会降低数据的准确度,见代码示例6
R = getresult(“monitor_name”,“T”);添加完监视器获取数据的方法为getresult()命令,"T"为获取的数据,见代码示例7
?getresult(“monitor_name”);获取监视器的数据

代码如下(示例1):

addindex;
set("name","index_monitor");#指定监视器的名称
set("monitor type",2);  # 2D y=0平面二维监视器
set("x",0);
set("x span",5e-6);
set("y",0);
set("z",10e-6);
set("z span",5e-6);

代码如下(示例2):

addeffectiveindex;
set("name","neff");
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);

代码如下(示例3):

addtime;
set("name","time_1");
set("monitor type",1);  # 一维也就是一个点
set("x",0);
set("y",0);
set("z",10e-6);

代码如下(示例4):

addmovie;
set("name","movie_1");
set("monitor type",3);  # 1 = 2D x-normal,  2 = 2D y-normal,  3 = 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
set("lock aspect ratio",1);#此处用于锁定纵横比
set("horizontal resolution",240);#此处指定水平分辨率

代码如下(示例5):

addpower;
set("name","field_profile");
set("monitor type",2);  # 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);

代码如下(示例6):

addprofile;
set("name","field_profile");
set("monitor type",2);  # 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);

代码如下(示例7):

# 以获取电场数据为例说明
E=getresult("monitor","E");
# 输出E的数据集
?E;
# 这里为句点引用,即E数据集的某一个具体量(f,Ex等)
?size(E.f);
?size(E.Ex);
# 获得 |E|^2 最大值 
?max(E.E2);
# 可视化操作
visualize(E);
# 可视化操作
Ex = pinch(E.Ex,4,1); 
image(E.x*1e6,E.y*1e6,Ex,"x (um)","y (um)","Ex");
 E vs x, y, z, lambda/f
 result: 
 5 1 
 result: 
 343 255 1 5 
 result: 
 3.223651 

总结

未完待续!!!
<think>好的,用户遇到了Lumerical GUI的许可证错误,具体是FlexNet Licensing error -97,121,提示vendor daemon down。我需要根据提供的引用信息来分析解决方案。首先,这些错误通常与许可证服务未运行有关。引用[3]中提到重装后依然报错,但通过重新运行Ansys的证书解决了问题,这提示可能需要重启许可证服务。类似地,引用[4]建议检查许可证日志和文档。 接下来,我需要整理解决步骤。第一步应该是检查lmgrd的日志文件,因为错误信息里提到了这一点。日志文件可能有具体错误原因,比如端口冲突或许可证文件路径错误。然后,尝试使用lmreread命令重新加载许可证,而不中断服务。如果不行,可能需要完全重启许可证服务。此外,确保许可证文件中的主机名正确,比如localhost是否正确,或者是否需要使用实际的计算机名。防火墙设置也可能阻止端口通信,需要检查27000-27009端口是否开放。许可证文件路径是否正确,是否有重复或错误的条目,比如引用[3]中的路径有多个localhost条目,可能需要清理。如果问题依旧,重新生成并应用许可证文件,或者重新安装许可证管理工具可能有效。最后,如果所有方法都失败,联系技术支持是必要的。 还需要考虑用户是否在Windows或Linux系统上,因为步骤可能略有不同。比如,服务管理命令在Windows是服务管理器,而Linux可能是命令行。另外,用户是否有权限操作许可证服务,可能需要管理员权限。综合这些信息,整理出分步骤的解决方案,并生成相关问题,帮助用户进一步排查。</think>针对Lumerical GUI许可证报错$error\ -97,121$的解决方案分步说明如下: ### 一、核心问题定位 该错误表明许可证后台服务(vendor daemon)未正常运行,可能由以下原因导致: - 服务进程异常终止 - 许可证文件配置错误(如主机名或端口冲突) - 防火墙阻止端口通信[^1][^2][^3] ### 二、具体解决步骤 1. **检查日志文件** ```bash # Linux查看日志示例 tail -f /usr/local/flexlm/logs/debug.log # Windows日志位置 C:\Program Files\Lumerical\FlexNet\logs\lmgrd.log ``` 重点关注包含$ERROR$和$DENIED$的条目,例如端口$27000-27009$占用情况[^4] 2. **重新加载许可证** ```bash # 使用lmreread命令 lmreread -c 1055@localhost ``` 此命令可重新加载许可证配置而无需重启服务[^1] 3. **完整重启服务(需管理员权限)** ```bash # Linux系统 sudo systemctl restart lumerical-licensing # Windows服务管理 services.msc → 重启"Lumerical License Server" ``` 4. **验证许可证配置 检查许可证文件$license.lic$中是否包含正确的主机特征: ``` SERVER localhost HOSTID=ANY 1055 VENDOR lumericald port=1055 ``` 特别注意避免重复的$localhost$声明[^3][^4] 5. **端口强制释放(仅限Linux)** ```bash sudo fuser -k 1055/tcp sudo fuser -k 27000-27009/tcp ``` ### 三、高级排查方法 $$ \text{错误概率} = P(\text{配置错误}) \times 0.6 + P(\text{端口冲突}) \times 0.3 + P(\text{文件损坏}) \times 0.1 $$ 当重复出现相同错误代码时,建议按以下优先级处理: 1. 清理临时文件$C:\ProgramData\FLEXnet\*.tmp$ 2. 更新主机网卡MAC地址绑定 3. 重新生成许可证文件
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值