admin管理员组文章数量:1650766
士不可以不弘毅,任重而道远。——曾子《论语·泰伯章》
# 前言
这是oommf软件教程《OOMMF User’s Guide》的中文翻译文章,由于本人水平有限,有些翻译可能有错误,望见谅。
第7章是本手册最重要的章节,由于本人水平是在很低,很多地方我都是凭借“想象力”硬凑的,所以翻译的有些句子可能词不达意,遇到这种情况请参阅原文,特别是7.3.4演化器部分的错误可能较多。
目录
7 OOMMF可扩展求解器
7.1 OOMMF可扩展求解器交互界面:Oxsii。
7.2 OOMMF可扩展求解器的批处理界面:boxsi。
7.3 标准的Oxs_Ext子类。
7.3.1 Atlases 容器。
7.3.2 Meshes 网格。
7.3.3 Energies 能量。
• Anisotropy Energy(各向异性能)
• Exchange Energy(交换能)
• Self-Magnetostatic Energy(自静磁能)
• Zeeman Energy(塞曼能)
7.3.4 Evolvers 演化器。
Oxs_EulerEvolve
Oxs_RungeKuttaEvolve
Oxs_SpinXferEvolve
Oxs_CGEvolve
######
本文链接:https://blog.csdn/qq_43572058/article/details/122930983
CSDN@搬砖工人_0803号
######
7 OOMMF可扩展求解器
Oxs(OOMMF可扩展求解器)是一个可扩展的微磁计算引擎,能够求解在三维网格里的三维自旋问题。Oxs有两个相关子程序:主要通过图形界面与用户交互的Oxsii,和适合在shell脚本中使用的具有扩展命令行的批处理程序Boxsi。
Oxs的微磁问题文件是MIF 2格式,这是一种可扩展的格式,将在下文第7.3节介绍它的各个模块。Oxs也接受MIF 1.1和MIF 1.2格式的文件,不过需要先传给mifconvert程序转换为MIF 2格式。
关于Tk依赖性的说明:一些MIF 2格式的微磁问题文件会引用外部图像文件,如使用Oxs_ImageAtlas类,或使用MIF 2的 ReadFile来实现图像转化,如果图像文件不是PPM P3(文本)格式,则可以启动any2ppm程序来读取和转换该文件。由于any2ppm需要Tk支持,因此在读取图像文件时,必须提供有效的显示程序。参阅any2ppm文档来了解详细信息。
7.1 OOMMF可扩展求解器交互界面:Oxsii。
概述
Oxsii是Oxs微磁计算引擎的图形化、交互式窗口界面。在OOMMF架构中,Oxsii既是服务器又是客户端程序。Oxsii是数据表显示程序,存储程序以及矢量场显示和存储程序的客户端,Oxsii也是求解器的控制服务的服务器,它的唯一的客户端是mmLaunch,正是通过这项服务,mmLaunch为Oxsii提供了一个界面窗口(如上图所示)。
微磁问题通过MIF 2文件传给Oxsii,MIF 2文件定义了描述微磁问题的Oxs_Ext对象集合。问题描述包括将仿真周期分为几个阶段,阶段表示模型属性(如施加的磁场)的跳变,也用于表示模拟进度的尺度。Oxsii提供了用于控制模拟进度的控件,可以在迭代之间、阶段之间或仅在运行完成时停止。在整个模拟过程中,用户可以手动或者通过根据迭代次数和阶段数来灵活的保存和显示中间结果。
Oxsii的输入文件也可以是MIF 1.1和MIF 1.2格式的问题描述文件,这将自动传递给mifconvert用于隐式转换为MIF 2格式。
启动
可以通过mmLaunch上的Oxsii按钮启动Oxsii,或者通过tclsh从命令行启动:
tclsh oommf.tcl oxsii [standard options] [-exitondone <0|1>] \
[-logfile logname] [-loglevel level] [-nice <0|1>] [-nocrccheck <0|1>] \
[-numanodes nodes] [-outdir dir] [-parameters params] [-pause <0|1>] \
[-restart <0|1|2>] [-restartfiledir dir] [-threads count] [miffile]
其中-exitondone<0|1> 是否在模拟求解微磁问题结束后退出。默认为0,表示等待用户手动选择求解另一个问题。
-logfile logname 将日志和错误信息写入logname文件。默认的日志文件是oommf/oxsii.errors。
-loglevel level 控制日志信息的详细级别,值越大,输出信息越多,默认值为1。
-nice<0|1> 如果启用(即1),则程序将在启动后降低调度优先级,默认值为1,即将优先级让给其他程序。
-nocrccheck<0|1> 在模拟重新启动时,通常将原始MIF文件的CRC(记录在*.restart文件中)与重启文件中的CRC进行比较。如果CRC不匹配,则会抛出一个错误,提醒用户MIF文件已更改。如果此选项已启用(即1),则CRC将被禁用。
-numanodes <nodes> 此选项对包含NUMA功能构建的Oxs可用。nodes参数必须是以逗号分隔的0以上的节点数列表、或“auto”或“none”。在第一种情况下,这些数字指的是内存节点,这些数字必须作为单个参数在命令行上传递,因此要确保参数列表中没有空格,要么使用引号包裹含有空格的参数列表,例如,-numanodes 2,4,6或-numanodes “2, 4, 6”。线程是以循环方式按顺序分配给节点来调度的,用户可以将所有系统节点分配给Oxsii进程,也可以将Oxsii限制在内存节点的子集上运行,这样,用户可以为其他进程(或Oxsii的其他实例)保留特定的处理核心,这因系统而异,通常每个内存节点都有多个处理核心。如果参数选择了“auto”,则线程将被分配给整个内存节点列表中的固定序列节点。如果参数选择 “none”,则线程不会通过Oxsii绑定到节点,而是由操作系统分配。在最后一种情况下,随着时间的推移,操作系统可以在处理器之间自由分配线程。在另外两种情况下,在Oxsii实例的生命周期内,每个线程都绑定到一个特定节点。另请参见Boxsi文档中关于线程注意事项的讨论。
nodes的默认值是“none”,它允许操作系统根据系统总体使用情况分配线程,这也是适用于计算机不支持NUMA的情况。另一方面,如果一台机器主要用于运行一个Oxsii实例,且线程数设置为机器上处理核心的数量,且nodes设置为“auto”,那么Oxsii可能会运行得最快。如果要同时运行多个Oxsii副本,或与其他程序并行运行Oxsii,请将线程数设置为小于处理核心数量的数字,并使用-numanodes参数显式的将Oxsii限制在某些特定的内存节点。
该参数的默认行为由(按影响的优先级递增)oommf/config/platform的平台文件中的numodes和oommf/config/options.tcl文件中或者oommf/config/local/options.tcl文件中的numodes控制,和通过环境变量OOMMF_NUMANODES控制。不过,-numanodes参数(如果有)会覆盖它的默认值。
-outdir dir 指定mmArchive输出文件的目录。当默认输出目录不可访问或速度较慢时,此选项非常有用。环境变量OOMMF_OUTDIR设置默认的输出目录,如果OOMMF_OUTDIR设置为空字符串,或者没有设置,那么默认目录是MIF文件存放的目录。如果在命令行上指定了此参数,或者设置了OOMMF_OUTDIR,则在Oxsii的File|Load打开的窗口中将有一个用于更改输出目录的地方。
-parameters params 设置MIF 2文件里面所需要的参数。params应该是一个包含偶数个参数的列表,对应名称+值对。每个参数名称必须在输入文件里面的Parameter语句中出现,必须用引号引用整个名称+值列表,以便作为命令行上的单个参数传给Oxsii。例如,如果A和Ms出现在MIF文件的Parameter语句中,那么可以这样设置参数:
-parameters "A 13e-12 Ms 800e3"
这会将A设置为13e-12,将Ms设置为800e3。引号的使用机制与shell程序/操作系统有关,有关详细信息,请参阅系统文档。
-pause <0|1> 如果禁用(即0),则程序在加载指定文件后自动切换到“运行”模式。默认值为1,即加载问题后“暂停”。如果未指定miffile,则此参数无效。
-restart<0|1> 控制restart flag的初始设置,从而控制命令行上指定的任何MIF文件的加载重启行为。restart flag在下面部分中描述。默认值为0,即不重新启动。
-restartfiledir dir 指定写入重启文件的目录。默认值由环境变量OOMMF_RESTARTFILEDIR确定,如果未设置,则由OOMMF_OUTDIR确定。如果两个环境变量均未设置,则默认为存放MIF文件的目录,写入重启文件的目录需要写访问权限,此外,用户可能需要考虑是将重启文件写入本地临时目录还是网络目录。
-threads <count> 该选项对使用多线程构建的Oxs可用。count参数是要运行的线程数,默认数值由config/platforms/平台名称 中的oommf_thread_count设置,但可能会被环境变量OOMMF_THREADS或这个命令参数覆盖。在大多数情况下,线程默认数值等于系统上处理核心数量,可以通过命令tclsh oommf.tcl +platform查询。
miffile 加载并求解miffile中的微磁问题,该文件必须为MIF 2格式,或通过mifconvert程序转换为该格式。
以上所有参数选项都是可选的。
由于Oxsii本身不提供任何用户界面窗口,因此它依赖于mmLaunch为其提供界面。mmLaunch的“Running Applications”栏中正在运行的所有Oxsii实例旁都有一个复选按钮,此按钮用于切换界面窗口的显示开关,用户可以通过该窗口控制Oxsii程序实例。
输入
与mmSolve2D不同,Oxsii直接从磁盘加载微磁问题文件(通过菜单选择File|Load),而不是通过mmProbEd 或FileSource。Oxsii的输入文件必须是MIF 2格式,或通过工具mifconvert程序转化。oommf/app/oxs/examples目录中有MIF 2示例文件,MIF文件可以使用任意文本编辑器进行编辑。
输出
加载微磁问题文件后,输出栏下的滚动框内将显示可用输出的列表,此输出列表的内容将取决于输入文件中指定的Oxs_Ext对象的输出,有关具体细节,请参阅这些对象的文档。要将Oxsii的输出发送到另一个OOMMF子程序,需在输出栏下选中所需的输出,在目标栏下选择相应的目的地,然后在计划栏下指定输出频率。可按步进或阶段输出,也可按发送按钮以手动方式发送数据。初始输出是在输入文件中设置的。
输出分为两大类:标量(单值)输出和矢量场输出。标量输出需要选择输出栏中的DataTable,标量输出包括总能量和能量分量、平均磁化强度、阶段和迭代次数、最大转矩值等。当选择DataTable时,目标栏将列出所有可以接收DataTable样式输入数据的OOMMF子程序,即所有当前运行的mmDataTable,mmGraph,和mmArchive程序。
矢量场输出包括逐点的磁化、各种总磁场和部分磁场以及转矩。与标量输出不同,矢量场输出在输出栏中将单独列出,矢量场输出可选的目的地是mmDisp程序的实例和mmArchive程序的实例。在处理矢量场输出时,尤其是特别复杂的模型时,需要谨慎小心处理,因为输出数据可能会达到兆字节以上。
控制
打开File菜单将显示五项:加载、显示控制台、关闭界面、清除计划和退出Oxsii。File|Load将启动一个对话框界面,允许用户选择MIF文件。File | Show Console将打开一个运行在Oxsii实例下的Tcl shell控制台,此控制台主要用于调试目的,特别是可在此处查看MIF文件里Report命令的输出信息。File|Close Interface将隐藏界面窗口,但求解器保持运行,在mmLaunch中取消选择“Running Applications”列表中的Oxsii复选框也能达到同样的效果。File|Clear Schedule将禁用所有当前的输出计划,就像用户手动单击output 和destination,并禁用每个计划输出复选框一样。最后一个File | Exit Oxsii将终止Oxsii求解器并关闭界面窗口。
Options菜单包含两项:清除计划和重新启动标志。第一项将清除所有步进和阶段的输出计划,就像用户手动单击每一个output 和destination,并禁用每个计划输出复选框一样。加载微磁问题文件后,可以使用此菜单选项来覆盖MIF文件中任何Schedule命令。restart flag控制微磁问题文件的加载行为,在正常使用中,不会设置restart flag,文件会被加载并从头运行。相反,如果设置了restart flag,则在加载问题时,会检查重启(检查点)文件。如果未找到检查点,则会引发错误,检查点的信息将用于根据该文件中保存的状态来恢复模拟。可以从Options菜单、File|Load对话框界面或命令行设置restart flag,参见Oxs_Driver的文档,查看检查点文件的信息。
Help菜单提供了常用的帮助工具。
菜单栏正下方有一行控制模拟进度的按钮。一旦加载微磁问题文件后,这些按钮就会被激活。第一个按钮“Reload”,重新加载最新的MIF文件,重新初始化求解器,然后暂停。“Reset”与此类似,只是文件不会被重新加载。其余四个按钮“Run”、“Relax”、“Step”和“Pause”将分别设置求解器的四种运行状态。在Pause暂停状态下,求解器处于空闲状态,等待进一步的指示。如果选择了Step步进,则求解器将向前迭代一次,然后暂停。在Relax弛豫模式下,求解器至少运行一个步进,然后运行直到到达阶段的末尾,此时求解器将暂停。在Run运行模式下,求解器将运行直到模拟结束。手动输出在所有模式下都可用,计划输出会根据步进和阶段数而输出。
进度控制按钮正下方有两个显示框,分别显示输入文件的名称和当前运行状态。Status栏下方是阶段显示和控制栏。通过拖动滚动条或在滚动条左侧的文本显示框中键入所需的阶段数,就可以随时更改模拟阶段。有效的阶段数是从0到N−1的整数,其中N是MIF文件中指定的阶段数。
细节
模拟模型由输入文件中的指定块Specify控制。因此,模拟的所有内容都由Oxs_Ext类设置,有关模拟和计算的详细信息,请参阅相应的Oxs_Ext类的文档。
7.2 OOMMF可扩展求解器的批处理界面:boxsi。
概述
Boxsi为Oxs微磁计算引擎提供了批处理模式。它有着功能有限的图形界面,不过Boxsi主要是由命令行参数控制,由用户直接从shell程序或从批处理文件内部启动。
在OOMMF架构中,Boxsi既是服务器又是客户端程序。它是数据表显示和存储程序以及矢量场显示和存储程序的客户端。Boxsi是求解器控制服务的服务器,其唯一的客户端是mmLaunch,正是通过该服务,mmLaunch为 Boxsi提供了一个用户界面窗口(如上所示)。Boxsi通过在命令行上指定并从磁盘加载的MIF 2文件,它也可以接受MIF 1.x格式,但会自动调用mifconvert程序将其转换为MIF 2格式。
启动
用户必须从命令行启动Boxsi,语法是:
tclsh oommf.tcl boxsi [standard options] [-exitondone <0|1>] [-kill tags] \
[-logfile logname] [-loglevel level] [-nice <0|1>] [-nocrccheck <0|1>] \
[-numanodes nodes] [-outdir dir] [-parameters params] [-pause <0|1>] \
[-regression_test flag] [-regression_testname basename] \
[-restart <0|1|2>] [-restartfiledir dir] [-threads count] miffile
-exitondone<0|1> 是否在模拟求解微磁问题结束后自动退出,或通过手动选择菜单File|Exit退出。默认为1,即模拟结束后自动退出。
-kill tags Boxsi实例终止时,也会向其他子程序发送关闭请求。tags参数应该是输入MIF文件中的目标列表(由目标命令Destination声明),或是参数all,表示所有目标。
-logfile logname 将日志和错误信息写入logname文件。默认的日志文件是oommf/boxsi.errors。
-loglevel level 控制日志信息的详细级别,值越大,输出越多。默认值为1。
-nice<0|1> 如果启用(即1),则程序将在启动后降低调度优先级。默认值为0,即保留其原始调度优先级。
-nocrccheck<0|1> 在模拟重新启动时,通常将原始MIF文件的CRC(记录在*.restart文件中)与重启文件中的CRC进行比较。如果CRC不匹配,则会抛出一个错误,提醒用户MIF文件已更改。如果此选项已启用(即1),则CRC将被禁用。
-numanodes 此选项对包含NUMA功能构建的Oxs可用。nodes参数必须是以逗号分隔的0以上的节点数列表、或“auto”或“none”。在第一种情况下,这些数字指的是内存节点,这些数字必须作为单个参数在命令行上传递,因此要确保参数列表中没有空格,要么使用引号包裹含有空格的参数列表,例如,-numanodes 2,4,6或-numanodes “2, 4, 6”。线程是以循环方式按顺序分配给节点来调度的,用户可以将所有系统节点分配给Boxsi进程,也可以将Boxsi限制在内存节点的子集上运行,这样,用户可以为其他进程(或Boxsi的其他实例)保留特定的处理核心,这因系统而异,通常每个内存节点都有多个处理核心。如果参数选择了“auto”,则线程将被分配给整个内存节点列表中的固定序列节点。如果参数选择 “none”,则线程不会通过Boxsi绑定到节点,而是由操作系统分配。在最后一种情况下,随着时间的推移,操作系统可以在处理器之间自由分配线程。在另外两种情况下,在Boxsi实例的生命周期内,每个线程都绑定到一个特定节点。另请参见下面关于线程注意事项的讨论。
nodes的默认值是“none”,它允许操作系统根据系统总体使用情况分配线程,这也是适用于计算机不支持NUMA的情况。另一方面,如果一台机器主要用于运行一个Boxsi实例,且线程数设置为机器上处理核心的数量,且nodes设置为“auto”,那么Boxsi可能会运行得最快。如果要同时运行多个Boxsi副本,或与其他程序并行运行Boxsi,请将线程数设置为小于处理核心数量的数字,并使用-numanodes参数显式的将Boxsi限制在某些特定的内存节点。
该参数的默认行为由(按影响的优先级递增)oommf/config/platform的平台文件中的numodes和oommf/config/options.tcl文件中或者oommf/config/local/options.tcl文件中的numodes控制,和通过环境变量OOMMF_NUMANODES控制。不过,-numanodes参数(如果有)会覆盖它的默认值。
-outdir dir 指定mmArchive输出文件的目录。当默认输出目录不可访问或速度较慢时,此选项非常有用。环境变量OOMMF_OUTDIR设置默认的输出目录,如果OOMMF_OUTDIR设置为空字符串,或者没有设置,那么默认目录是MIF文件存放的目录。
-parameters params 设置MIF 2文件里面所需要的参数。params应该是一个包含偶数个参数的列表,对应名称+值对。每个参数名称必须在输入文件里面的Parameter语句中出现,必须用引号引用整个名称+值列表,以便作为命令行上的单个参数传给Boxsi。例如,如果A和Ms出现在MIF文件的Parameter语句中,那么可以这样设置参数: -parameters "A 13e-12 Ms 800e3" 这会将A设置为13e-12,将Ms设置为800e3。引号的使用机制与shell程序/操作系统有关,有关详细信息,请参阅系统文档。
-pause <0|1> 如果启用(即1),则程序在加载指定的微磁问题文件后自动暂停。默认值为0,即加载问题后自动进入“运行”模式。
-regression_test flag 用于运行oxsregression回归测试程序。默认值为0(无测试)。
-regression_testname basename 此选项由oxsregression回归测试程序使用,用于在回归测试期间控制临时文件名。
-restart<0 | 1 | 2> 如果restart选项设置为0(默认值),那么微磁问题文件将加载后从头运行。如果设置为1,则在加载问题时,会寻找已有的重启(检查点)文件,如果找到一个,将根据检查点的信息将模拟从该文件中保存的状态中恢复,如果未找到检查点文件,则会引发错误。如果设置为2,若找到检查点文件,则会使用检查点文件,若没有找到,则微磁问题文件会将加载后从头运行,而不会引发错误。参见Oxs_Driver的文档,查看检查点文件的信息。
-restartfiledir dir 指定写入重启文件的目录。默认值由环境变量OOMMF_RESTARTFILEDIR确定,如果未设置,则由OOMMF_OUTDIR确定。如果两个环境变量均未设置,则默认为存放MIF文件的目录,写入重启文件的目录需要写访问权限,此外,用户可能需要考虑是将重启文件写入本地临时目录还是网络目录。
-threads <count> 该选项对使用多线程构建的Oxs可用。count参数是要运行的线程数,默认数值由config/platforms/平台名称 中的oommf_thread_count设置,但可能会被环境变量OOMMF_THREADS或这个命令参数覆盖。在大多数情况下,线程默认数值等于系统上处理核心数量,可以通过命令tclsh oommf.tcl +platform查询。
miffile 加载并求解miffile中的微磁问题,该文件必须为MIF 2格式,或通过mifconvert程序转换为该格式。该参数是必须指定的。
虽然无法从mmLaunch直接启动Boxsi,但mmLaunch为Boxsi提供了功能有限的图形交互界面,操作方式与Oxsii相同。每个正在运行的Boxsi实例都包含在mmLaunch的“Running Applications”列表中,并带有一个复选按钮,此按钮用于切换用户界面窗口的显示开关。
输入
Boxsi根据命令行的参数直接从磁盘加载微磁问题文件。这些文件的格式是MIF 2格式,与Oxsii使用的格式相同。2D求解器mmSolve2D使用的MIF 1.1和MIF 1.2格式也可以输入到Boxsi,Boxsi将自动调用mifconvert将MIF 1.x格式转换为MIF 2格式。MIF 2文件示例可在oommf/app/oxs/examples目录中找到。
输出
Boxsi交互界面的下面显示Output, Destination, 和Schedule,这些子窗口显示当前的输出配置,并允许用户手动修改该配置。这些功能与Oxsii相同,详情请参阅Oxsii文档。Boxsi和Oxsii在输出方面的唯一区别在于,Boxsi主要依赖于输入文件中的Destination和Schedule命令的设置。手动式输出界面用于监视模拟过程。
控制
Boxsi交互界面提供的流程控制控件比Oxsii少,用户若发现Boxsi提供的控件不足以完成给定的任务,请考虑改用Oxsii。
File菜单包含4项:显示控制台、关闭界面、清除计划和退出Boxsi。File | Show Console打开一个运行在Boxsi实例下的Tcl shell控制台。此控制台主要用于调试目的。File|Close Interface将隐藏界面窗口,但求解器保持运行,在mmLaunch中取消选择“Running Applications”列表中的Boxsi复选框也能达到同样的效果。File|Clear Schedule将禁用所有当前的输出计划,就像用户手动单击每一个output 和destination,并禁用每个计划输出复选框一样。最后一个File | Exit Boxsi将终止Boxsi求解器并关闭界面窗口。请注意,Boxsi没有File|Load菜单项,这意味着必须在命令行上为Boxsi指定微磁问题文件。
Help菜单提供了常用的帮助工具。
菜单栏下方有一行控制模拟进度的按钮。一旦加载微磁问题文件后,“Run”、“Relax”、“Step”和“Pause”按钮就会被激活,这些按钮允许用户更改求解器的运行状态。在Pause暂停状态下,求解器处于空闲状态,等待进一步的指示。如果选择了Step步进,则求解器将向前迭代一次,然后暂停。在Relax弛豫模式下,求解器至少运行一个步进,然后运行直到到达阶段的末尾,此时求解器将暂停。在Run运行模式下,求解器将运行直到模拟结束。当问题结束时,求解器将暂停或退出,具体取决于-exitondone命令参数的设置。
通常,求解器会自动从初始化进入运行模式,但这可以通过-pause命令行参数进行更改。手动输出在所有模式下都可用,计划输出会根据步进和阶段数而输出。
状态控制按钮正下方有三个显示框,显示输入文件的名称、当前运行状态和当前阶段/最大阶段数,两个阶段数均从0开始。
细节
模拟模型由输入文件中的指定块Specify控制。因此,模拟的所有内容都由Oxs_Ext类设置,有关模拟和计算的详细信息,请参阅相应的Oxs_Ext类的文档。
线程注意事项
假设用户在一个有四个双核处理器的计算机上运行,其中每一个处理器都连接到一个单独的内存节点。也就是总共有八个内核,每对内核共享一个内存节点。进一步假设处理器通过点对点连接,如AMD的HyperTransport或Intel的QuickPath Interconnect。
用户如果希望快速运行Boxsi的单个实例,可以使用命令参数-threads 8,假设默认为-numanodes none,该选项将允许操作系统在系统的八个核心中调度八个线程。或者,可以减少线程数,为其他程序保留一个或多个内核。但是,如果长时间运行,用户可能会发现操作系统试图在单个内核上运行多个线程,这可能是为了让其他内核空闲,关闭它们以节省资源。或者,操作系统可能会将线程从已分配的内存节点上移开,从而有效地减少内存带宽。在这种情况下,用户可能希望使用-numanodes auto选项启动Boxsi,这会覆盖操作系统的默认方式,并在进程的生命周期中将线程与特定内存节点绑定。(在Linux上,还应该设置“huge page support”和“huge page support”)
如果要同时运行两个Boxsi实例,可以使用-threads 4选项启动每个实例,这样每个程序都有四个线程供操作系统调度。如果不需要操作系统的默认调度,可以使用-numanodes选项,但不要使用-numanodes auto启动两个Boxsi实例,“auto”选项会将线程分配给固定序列列表中的内存节点,导致两个Boxsi实例将有相同的节点。所以,用户应该手动分配节点,为每个Boxsi实例分配不同的节点集合。例如,可以使用-numanodes 0,1启动第一个Boxsi实例,使用-numanodes 2,3启动第二个Boxsi实例。用户在分配节点时需要记住,一些节点对比其他节点对“更好”(考虑内存延迟和带宽方面)。例如,存储器节点0和存储器节点1可以通过点对点连接,以便数据可以在单个“hop”中传输,但是从节点0向节点2发送数据可能需要两个hop(从节点0到节点1,然后从节点1到节点2)。在这种情况下,选择命令参数-numanodes 0,1可能会比-numanodes 0,2运行得更快。
只有在安装了“numactl”和“numactldevel”软件包的情况下,才能在Linux机器上使用-numanodes选项。numactl命令本身可用于将计算程序绑定到特定内存节点,类似于boxsi –numanodes命令,只是-numanodes绑定线程,而numactl绑定计算程序。numactl -hardware命令将告诉用户系统中有多少个内存节点,并报告节点之间的距离(内存延迟和带宽)。该信息可用于为boxsi -numanodes选择节点,但事实上,numactl报告的距离信息通常不可靠。为了获得最佳结果,应该使用不同的设置进行测试,或者使用不同的节点对来进行内存带宽测试。
批处理系统
OOMMF提交给批处理排队系统(例如Condor、PBS、NQS)的任务可能会因在同一计算节点上同时运行的不同OOMMF任务之间的交互而偶尔出现错误,这些问题可以通过使用OOMMF命令行程序launchhost来隔离每个任务解决。
7.3 标准的Oxs_Ext子类。
Oxs 的模拟由Oxs_Ext(Oxs Extension))对象的集合组成。这些是通过MIF 2文件中的Specify指定块定义的。该部分提供的文档和示例文件(图8)是对接下来文档的补充, MIF 2示例文件可在oommf/app/oxs/examples目录中找到。
本节介绍OOMMF标准发行版中可用的Oxs_Ext类,包括Specify指定块的初始化字符串,以及oommf/app/oxs/examples目录中使用该类的一些示例文件。在OOMMF发行版里面的标准Oxs_Ext对象,可以通过名称中的Oxs前缀来标识。可能系统上还有其他Oxs_Ext类,需查看本地文档了解详细信息。
在下面的介绍中,Oxs_Ext类分为8个种类:容器、网格、能量、演化器、驱动器、标量场对象、矢量场对象和MIF支持类,具体情况如下:
• Atlases
Oxs_BoxAtlas Oxs_EllipseAtlas
Oxs_EllipsoidAtlas Oxs_ImageAtlas
Oxs_MultiAtlas Oxs_ScriptAtlas
•Meshes
Oxs_RectangularMesh Oxs_PeriodicRectangularMesh
• Energies
Oxs_CubicAnisotropy Oxs_Demag
Oxs_Exchange6Ngbr Oxs_ExchangePtwise
Oxs_FixedZeeman Oxs_RandomSiteExchange
Oxs_ScriptUZeeman Oxs_SimpleDemag
Oxs_StageZeeman Oxs_TransformZeeman
Oxs_TwoSurfaceExchange Oxs_UniaxialAnisotropy
Oxs_UniformExchange Oxs_UZeeman
• Evolvers
Oxs_CGEvolve Oxs_EulerEvolve
Oxs_RungeKuttaEvolve Oxs_SpinXferEvolve
• Drivers
Oxs_MinDriver Oxs_TimeDriver
• Scalar Field Objects
Oxs_AtlasScalarField Oxs_LinearScalarField
Oxs_RandomScalarField Oxs_ScriptScalarField
Oxs_UniformScalarField Oxs_VecMagScalarField
Oxs_ScriptOrientScalarField Oxs_AffineOrientScalarField
Oxs_AffineTransformScalarField Oxs_ImageScalarField
• Vector Field Objects
Oxs_AtlasVectorField Oxs_FileVectorField
Oxs_PlaneRandomVectorField Oxs_RandomVectorField
Oxs_ScriptVectorField Oxs_UniformVectorField
Oxs_ScriptOrientVectorField Oxs_AffineOrientVectorField
Oxs_AffineTransformVectorField Oxs_MaskVectorField
Oxs_ImageVectorField
• MIF Support Classes
Oxs_LabelValue
7.3.1 Atlases 容器。
Oxs的模拟空间通过atlases容器定义,容器将其中的空间划分为一个或多个不相交的regions区域。每个容器都包含确定空间的边界范围的空间盒子,空间盒子是一个平行坐标轴的长方体,里面包含了所有的区域。还有一个特殊的universe普通区域,它由用户在容器中定义的区域之外的所有点组成。universe区域不是任何容器的一部分,universe关键字也不能被用于标识任何区域。
最常用,最简单的容器是Oxs_BoxAtlas。要组合多个容器,则需使用Oxs_MultiAtlas。
Oxs_BoxAtlas
是一个平行坐标轴的长方体,内部包含唯一的区域。Specify指定块的形式如下:
Specify Oxs_BoxAtlas:atlasname {
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
name regionname
}
其中xmin,xmax…是以米为单位的坐标值,表示定义的模拟空间的体积范围。regionname标签指定容器中包含区域的名称,该名称标签是可选的,如果未指定,则区域名称默认是对象实例名称,即atlasname。
示例文件:sample.mif, cgtest.mif.
Oxs_EllipseAtlas
定义一个自身的轴平行坐标轴的椭圆体形状的空间。它的功能可以通过Oxs_ScriptAtlas类结合适当的Tcl脚本来获得,但这个类更容易使用,运行速度更快。Specify指定块的形式如下:
Specify Oxs_EllipseAtlas:atlasname {
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
margin { margins }
axis axisdir
name { regions }
}
其中xmin,xmax…是以米为单位的坐标值,表示定义的模拟空间的边界范围,类似Oxs_BoxAtlas的设置。margin与边界范围共同确定椭圆体的范围,margins 是由一个、三个或六个值组成的列表,以米为单位。若指定了六个值{m0,m1,…,m5},则它们将椭圆体的范围限定在为[xmin+m0,xmax−m1]×[ymin+m2,ymax−m3]×[zmin+m4,zmax−m5]。若指定了三个值,则它们限定了x坐标、y坐标和z坐标的边距。若只有单个值,则该值用于限定六个面的边距。如果某一坐标方向两个边距值不相等,则椭圆体的中心将从容器的中心偏移。如果边距为负值,则椭圆体的一部分将在容器边界处剪裁。如果没指定margin,则它的默认值为0。
axisdir是x、y或z中的一个,指定椭圆体的对称轴。如果未指定,则默认值为z。
name 是包含一个或两个值的列表。单个值表示指定椭圆体内部的区域名称,此时,外部则会自动指定为“universe”区域。在两个值的情况下,第一个值是指定给椭圆体内部区域的名称,第二个值是分配给椭圆体外部区域的名称。如果需要,可以将其中一个值设置为“universe”,将相应的空间分配给universe区域。如果未指定name ,则默认情况下将其视为只有一个值的列表,使用atlas对象实例名称(即atlasname)作为椭圆体内部区域名称。
示例文件:ellipse.mif, ellipsea.mif.
Oxs_EllipsoidAtlas
类似于Oxs_EllipseAtlas,定义了一个轴平行于坐标轴的椭圆(柱)区域。这个功能可以通过Oxs_ScriptAtlas类结合适当的Tcl脚本来代替,但是这个类更容易使用,速度更快。Specify指定块的形式如下:
Specify Oxs_EllipsoidAtlas:atlasname {
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
name regionname
}
xmin,xmax…是以米为单位的坐标值,用于指定椭圆(柱)的边界。Specify指定块的内容与Oxs_BoxAtlas类似,只是在这种情况下,定义的区域不是整个长方体范围,而是位于长方体内部的椭圆(柱)空间,椭圆(柱)外部的点被分配给“universe”区域。与Oxs_BoxAtlas一样,regionname是可选的;如果缺少,则用对象实例名称表示区域名称,即atlasname。
示例文件:ellipsoid.mif。参考ellipsoid-atlasproc.mif和ellipsoid-fieldproc.mif有关使用Tcl脚本的示例。
Oxs_ImageAtlas
该类允许根据图像文件中图像颜色定义区域,通常与Oxs_AtlasScalarField和Oxs_AtlasVectorField类结合使用,以模拟少量不同种类(材料)的情况。该类是2D求解器掩码文件功能的升级版。
对于材料参数连续变化的情况,应把使用脚本定义的场类与ReadFile MIF命令结合使用,请参阅第17.3.2节ReadFile文档中的ColorField示例函数。
Oxs_ImageAtlas 的Specify指定块的形式如下:
Specify Oxs_ImageAtlas:name {
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
viewplane view
image pic
colormap {
color-1 region_name
color-2 region_name
. . .
color-n region_name
}
matcherror max_color_distance
}
xrange、yrange、zrange以米为单位指定了容器的范围。viewplane的值view应该是三个两坐标字母代码xy、zx或yz中的一个,表示将图像文件中的水平轴和垂直轴映射到模拟容器的轴,并且根据需要沿每个轴缩放图像,以匹配对应轴上的容器范围,图像将沿这viewplane中没有指定的轴填充整个空间范围。Oxs_ImageAtlas类可以在Oxs_MultiAtlas对象中使用,以指定多层结构中的区域,参考示例文件imagelayers.mif。注意,若图像的纵横比与定义范围的比例不匹配,则将沿一个轴拉伸或压缩图像,一种解决方法是在Oxs_ImageAtlas中定义匹配图像纵横比的空间范围,并使用单独的容器(可能是Oxs_BoxAtlas)来定义网格和模拟空间,这种方法也适用于相对模拟范围平移图像。请参考示例imageatlas2.mif。
image标签指定要使用的图像文件的名称。如果是相对文件路径,那么与存放该MIF文件的目录相关。图像文件格式可以是any2ppm识别的任何格式,若文件是PPM或者BMP格式,Oxs可以直接读取该文件,否则将自动启动any2ppm来转换。
colormap标签的值是颜色+区域名称对的列表(长度为偶数)。颜色可以用几种方式中的任何一种来指定,最简单的是使用Tk的数字代码表示颜色,#rgb、#rrggbb、#rrrgggbbb或#rrggggbbb,其中每个r、g和b是十六进制数字(即0-9或A-F),分别代表颜色的红、绿和蓝色分量。例如,#F00是亮红色,#800是深红色,#FF0和#ff00都是亮黄色。有关详细信息,请参阅Tk_GetColor文档。对于灰色,可以使用grayD或greyD,其中D是介于0和100之间的十进制数,例如,gray0是黑色,gray100是白色。或者,可以使用oommf/config/colors.config中定义的符号名称,例如red, white 和skyblue(红色、白色、天蓝色),忽略符号名称的空格和大小写。可以通过options.tcl中的“Color filename”选项添加其他文件来扩展符号名称列表。colormap列表中可以添加特殊关键字“default”,所有与其他指定颜色(由matcherror确定)不匹配的像素点都被指定给设置为该默认颜色对应的区域。
指定的颜色不允许重复,但允许重复指定区域名称。可以选择任意区域,“universe” 区域除外(“universe” 包括由xrange、yrange、zrange定义的区域边界外的所有点,但也可能包括该边界内的点)。
通过将图像中像素的颜色与colormap中指定的颜色列表进行比较,将图像中的像素分配给对应区域。如果像素颜色与colormap的距离比max_color_distance更小,则认为两者匹配,如果一个像素的颜色恰好与colormap的颜色匹配,那么该像素将被分配到相应的区域。如果像素颜色与多个colormap的颜色匹配,则将像素分配给与最近似的区域。如果像素颜色与colormap的任何颜色都不匹配,则会将该像素指定给默认区域,即与“default”配对的区域,如果colormap列表中没有显式指定默认区域名称,则universe为默认区域。
为了计算两种颜色之间的距离(近似度),首先将每种颜色转换为归一化的三个浮点数,即红色、绿色和蓝色值(r、g、b),每个分量在[0,1]区间,即(0,0,0)表示黑色,(1,1,1)表示白色。例如,(0,0,1)是亮蓝色。在这种表示法中,给定两种颜色,使用具有均匀权重的标准欧氏范数(standard Euclidean norm)计算距离,即(r1,g1,b1)和(r2,g2,b2)之间的距离为:
由于任一分量的差值最多为1,因此任两种颜色之间的距离最多为。
如上所述,如果两种颜色之间的距离小于指定的matcherror值,则认为它们是匹配的。如果“最大颜色距离”(max_color_distance)非常小,则容易导致像素的颜色与colormap的任何颜色都不匹配的情况,从而该像素将被指定给默认区域。另一方面,如果“最大颜色距离”(max_color_distance)大于,则将匹配colormap中所有的颜色,并且不会为默认区域分配任何像素。如果未指定matcherror,则“最大颜色距离”的默认值为3,这意味着匹配所有颜色。下面的例子有助于理解这些问题:
Specify Oxs_ImageAtlas:atlas {
xrange { 0 400e-9 }
yrange { 0 200e-9 }
zrange { 0 20e-9 }
image mypic.gif
viewplane "xy"
colormap {
blue cobalt
red permalloy
green universe
default cobalt
}
matcherror .1
}
图像中蓝色像素被分配到“钴”区域,红色像素被分配到“坡莫合金”区域。绿色像素被分配到“universe”,这意味着所有绿色像素被分配到容器之外,但在遇到Oxs_MultiAtlas组合边界重叠的容器时需要仔细考虑。那么橙色(orange)像素将被分配到哪个区域呢?橙色的归一化的三个浮点数为(1,0.647,0),到蓝色的距离为1.191,到红色的距离为0.647,到绿色的距离为1.06,因此,最接近的颜色是红色,但0.647超出了matcherror设置的0.1,因此橙色与任何颜色都不匹配,故被分配到默认区域,在本例中为“钴”区域。当matcherror设置为1,则橙色和红色将匹配,橙色像素将分配给坡莫合金区域。
颜色与colormap中的多个颜色等距且匹配的像素将被指定给最近的颜色区域。用户不能显式的自定义匹配过程。
示例文件:imageatlas.mif, imageatlas2.mif, imagelayers.mif, grill.mif.
Oxs_MultiAtlas
该容器是组合其他子容器的有序列表。Oxs_MultiAtlas定义的区域集合是包含的子容器的所有区域的并集。子容器可以是相交的,此时空间中的每个点会被分配给列表中包含它的第一个子容器的区域,因此Oxs_MultiAtlas定义的区域实际上是不相交的。
Oxs_MultiAtlas的Specify指定块的形式如下:
Specify Oxs_MultiAtlas:name {
atlas atlas_1_spec
atlas atlas_2_spec
...
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
}
每个atlas_spec可以是对先前定义的容器的引用,也可以是当前Specify指定块之外的容器,或者是内嵌定义的容器。xrange、yrange和zrange标签都是可选的,如果未指定,则根据包含所有子容器的最小边界范围限定自身的边界范围。
如果子容器是相交的,那么由Oxs_MultiAtlas定义的区域可能与单个子容器定义的区域有所不同。例如,假设regionA是atlasA中顶点在(5,5,0)和(10,10,10)的矩形区域,regionB是atlasB中顶点在(0,0,0)和(10,10,10)的矩形区域。当按照atlasA、atlasB顺序组成Oxs_MultiAtlas时,Oxs_MultiAtlas中的regionA将与atlasA的regionA相同,但Oxs_MultiAtlas中的regionB将是atlasB的regionB中不包含regionA的那些点组成的“L”形。如果Oxs_MultiAtlas由atlasB和atlasA的顺序组成,那么Oxs_MultiAtlas的regionB将与atlasB的regionB一致,但regionA为空。
注意:该类不支持attributes属性标签(参见第17.3.3.5)。
示例文件:manyregions-multiatlas.mif, spinvalve.mif, spinvalve-af.mif, yoyo.mif.
Oxs_ScriptAtlas
通过Tcl脚本定义区域的容器。Specify指定块的形式如下:
Specify Oxs_ScriptAtlas:name {
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
regions { rname_1 rname_2 . . . rname_n }
script_args { args_request }
script Tcl_script
}
xmin,xmax…是以米为单位的坐标值,定义与坐标轴平行的长方体范围,该长方体限定了总的空间体积。使用regions中给出的名称将该空间体积分为n个子区域。script用于将空间中的点分配到各个区域。script后面附加script_args,使用方式见第17.3.3.6节MIF 2文件格式中的用户自定义函数。args_request应该是{relpt rawpt minpt maxpt span}的子集。如果未指定script_args,则它的默认值是relpt。程序执行时,脚本的返回值应为1到n范围内的整数,表示空间中的点所在的区域,否则,如果点不在n个区域之一,返回值应为0,区域0隐式的表示“universe”区域。下面的例子有助于理解这些问题:
proc Octs { cellsize x y z xmin ymin zmin xmax ymax zmax } {
set xindex [expr {int(floor(($x-$xmin)/$cellsize))}]
set yindex [expr {int(floor(($y-$ymin)/$cellsize))}]
set zindex [expr {int(floor(($z-$zmin)/$cellsize))}]
set octant [expr {1+$xindex+2*$yindex+4*$zindex}]
if {$octant<1 || $octant>8} {
return 0
}
return $octant
}
Specify Oxs_ScriptAtlas:octant {
xrange {-20e-9 20e-9}
yrange {-20e-9 20e-9}
zrange {-20e-9 20e-9}
regions { VIII V VII VI IV I III II }
script_args { rawpt minpt maxpt }
script { Octs 20e-9 }
}
该容器将(−20,−20,−20)到(20,20,20)(nm)之间的矩形体积划分为八个子区域,对应区域名称I到VIII。Octs函数返回一个介于1和8之间的值,其中1对应于VIII,8对应于II。从I开始按照以下标准排序,I表示+x、+y、+z空间,在+z半空间中逆时针旋转表示其余3个区域,在−z半空间中,V在I的正下方,VI在II下方,等等。在Octs函数中计算的排序表示为−x、−y、−z空间的1,+x、−y、−z空间的2,−x、+y、−z空间的3,这两个表示方式的转换是通过regions的列表中区域名称的顺序来完成的。
示例文件:manyregions-scriptatlas.mif, octant.mif, tclshapes.mif, diskarray.mif, ellipsoid-atlasproc.mif.
7.3.2 Meshes 网格。
网格定义了模拟的离散化单元格。在MIF 2文件中只需声明一个网格,常用的网格类型是Oxs_RectangularMesh,对于沿一个或多个轴的周期性边界条件,可以使用Oxs_PeriodicRectangularMesh。
Oxs_RectangularMesh
网格由长方体形状的晶格构成,Specify指定块的形式如下:
Specify Oxs_RectangularMesh:name {
cellsize { xstep ystep zstep }
atlas atlas_spec
}
这将在atlas指定的空间中创建与坐标轴平行的矩形网格。每个坐标轴方向的网格数量与单元格大小cellsize(以米为单位)有关。网格是基于单元格的,第一个单元格的中心距离atlas_spec的最小点(xmin、ymin、ymax)半个步长(cellsize的一半)。name通常设置为“mesh”,在这种情况下,其他Oxs_Ext对象会使用简化名称“:mesh”来引用该网格对象。
示例文件:sample.mif, stdprob3.mif, stdprob4.mif.
Oxs_PeriodicRectangularMesh
与Oxs矩形网格一样,该网格也由长方体晶格组成。但是在这种情况下,它沿一个或多个轴方向具有周期性。Specify指定块的形式如下:
Specify Oxs_PeriodicRectangularMesh:name {
cellsize { xstep ystep zstep }
atlas atlas_spec
periodic periodic_axes
}
atlas和cellsize值与Oxs_RectangularMesh类相同。periodic_axes应该是由一个或多个“x”、“y”或“z”组成的字符串表示的周期方向。与Oxs_PeriodicRectangularMesh不兼容的Oxs_Ext对象将在运行时发出错误消息。特别是,Oxs_Demag类只支持无周期性或单向周期性,但不支持其他类型。此外,一些不支持周期性的第三方扩展使用旧的Oxs_RectangularMesh类而不是Oxs_PeriodicRectangularMesh。
示例文件:pbcbrick.mif, pbcstripes.mif.
7.3.3 Energies 能量。
以下小节描述了在微磁模拟中可用的能量项。为了在模拟中包含能量和场计算,每个能量项必须在自己的顶级Specify指定块中声明,不能在其他Oxs_Ext对象里边内联声明能量项,MIF文件中没有限制用户声明的能量项数量。这些能量项中有很多随空间变化的参数,这些参数是在其初始化块中通过field_object_spec设置。
输出:对于每个磁化配置,每个能量项都提供三个标准输出:标量输出“Energy”,即该能量项贡献的总能量(J焦耳),标量场输出“Energy density”,即每个单元格的能量密度(),以及包含三个分量的矢量场输出“Field”,即空间中每个点的场大小(A/m)。如果代码没有使用宏NDEBUG来编译,那么将有一个额外的标量输出“Calc count”,它统计在当前模拟中的计算次数,仅用于调试,该数字应与演化器的“Energy calc count”一致。
• Anisotropy Energy(各向异性能)
Oxs_UniaxialAnisotropy
磁晶单轴各向异性能。Specify指定块的形式如下:
Specify Oxs_UniaxialAnisotropy:name {
K1 K
Ha H
axis u
}
只需设置K1或Ha中的一个,其中K1是磁晶各向异性常数(单位:),Ha是各向异性场(单位:A/m)。无论哪种情况,axis都表示各向异性的方向。K1、Ha和axis可以随单元格变化:K1和Ha使用标量场对象初始化,axis使用矢量场对象初始化。(通常,常量值表示具有该值的均匀场对象。)每个单元格的axis必须不为零,并且会将它的值归一化为单位大小。
如果K1(或Ha)大于0,则axis为易轴,在这种情况下,单元格的各向异性能量密度(单位:)由下式给出:
或者
(是单元格i中的单位磁化强度,Ms是单元格i中的饱和磁化强度。)如果K1(或Ha)小于0,则axis是易平面的法线方向,单元格的各向异性能量密度由下式给出:
或者
这两种情况下(易轴与易平面)的公式相差一个恒定的偏移量,并且在每种情况下能量都是非负的。
示例文件:diskarray.mif, stdprob3.mif, grill.mif.
Oxs_CubicAnisotropy
磁晶立方各向异性能。Specify指定块的形式如下:
Specify Oxs_CubicAnisotropy:name {
K1 K
Ha H
axis1 u1
axis2 u2
}
只需设置K1或Ha中的一个, 其中K1是磁晶各向异性常数(单位:),Ha是各向异性场(单位:A/m)。无论哪种情况,axis1和axis2是各向异性的两个方向,第三个各向异性轴 u3 由矢量积 确定。对于每个单元格,如果K1(或Ha)大于0,则轴方向为易轴;如果K1(或Ha)小于0,则轴方向为难轴。这些参数都可以随单元格变化,K1和Ha使用标量场对象初始化,axis使用矢量场对象初始化。(通常,常量值表示具有该值的均匀场对象。)axis1和axis2必须相互正交,且在每个单元格中都不为零(u1和u2会自动归一化为单位大小)。单元格i的各向异性能量密度(单位:编辑)由下式给出:
或者
式中,,,,m表示单元格i的归一化磁化强度,u1、u2和u3表示正交的各向异性轴。在第二种形式中,Ms是单元格i的饱和磁化强度。对于每个单元格,如果K1(或Ha)大于0,则计算的能量是非负的,若K1(或Ha)小于0,计算的能量是非正的。
示例文件:cgtest.mif, sample2.mif, grill.mif.
• Exchange Energy(交换能)
Oxs_Exchange6Ngbr
标准6邻域交换能。单元格i的交换能量密度由下式给出:
其中 是由距离单元格i最近的6个单元格组成的集合, 是单元格i和j之间的交换系数,单位为J/m, 是单元i和单元j之间的距离(单位为米)。
Specify指定块的形式如下:
Specify Oxs_Exchange6Ngbr:name {
default_A value
atlas atlas_spec
A {
region-1 region-1 A11
region-1 region-2 A12
...
region-m region-n Amn
}
}
或者
Specify Oxs_Exchange6Ngbr:name {
default_lex value
atlas atlas_spec
lex {
region-1 region-1 lex11
region-1 region-2 lex12
...
region-m region-n lexmn
}
}
式中,lex表示静磁交换长度,单位为米,lex= 。
在第一种情况下,A块逐个区域设置Aij值,其中的区域是atlas_spec声明的。这允许在给定区域内(例如Aii)和区域之间(例如Aij)的界面指定A。
根据对称性,如果指定了Aij,那么也会自动分配给Aji同样的值。其他未分配区域则使用默认交换系数default_A。
在第二种情况下,可以指定静磁交换长度而不用交换系数A,内容是类似的。
尽管任一对区域i和j可以指定Aij(或lexij),但这仅在区域对接触时才是必需的和可用的。如果需要长程交换作用,请使用Oxs_TwoSurfaceExchange。
除了标准的能量和场输出外,Oxs_Exchange6Ngbr还提供三个涉及相邻单元格的自旋角度的标量输出:
–Max Spin Ang:当前磁化状态下相邻自旋之间的最大角度,以度数为单位。
–Stage Max Spin Ang:当前阶段Max Spin Ang的最大值。
–Run Max Spin Ang:模拟过程中Max Spin Ang的最大值。
示例文件:grill.mif, spinvalve.mif, tclshapes.mif.
Oxs_UniformExchange
与Oxs_Exchange6Ngbr类似,不同之处在于交换系数A(或交换长度lex)对于所有单元格都是一致的。Specify块非常简单,由A(以J/m为单位)标签和lex(以米为单位)标签组成。交换系数A(或交换长度lex)不随空间变化,用户需要用一个简单的常量值初始化该值。
除标准能量和场输出外,Oxs_UniformExchange还提供三个标量输出Max Spin Ang、Stage Max Spin Ang和Run Max Spin Ang,含义如前面的Oxs_Exchange6Ngbr所述,可以在MIF文件中通过 GetStateData命令获取这些值。
示例文件:sample.mif, cgtest.mif, stdprob3.mif.
Oxs_ExchangePtwise
交换系数Ai是逐点(即逐单元格)指定的,而不是Oxs_Exchange6Ngbr使用的成对的指定方法。单元格i的交换能量密度是根据6个最近的单元格()计算的,使用以下公式:
式中, 是从单元格i 到单元格j 的距离,单位为米,以及
若Ai和Aj为0,则 。注意, 满足以下式子:
此外,如果Ai和Aj为非负,则
用这个的公式计算交换能,相当于假设Ai和Aj在两个单元格中都是常数的情况下,找到单元格i和j之间可能的最小交换能。在计算二维厚度变化的模型的交换能时也考虑了类似的因素。
Oxs_ExchangePtwise 的Specify指定块的形式如下:
Specify Oxs_ExchangePtwise:name {
A scalarfield_spec
}
其中scalarfield_spec是返回以J/m为单位的交换系数的任意标量场对象。
除了标准能量和场输出外,Oxs_ExchangePtwise还提供三个标量输出Max Spin Ang、Stage Max Spin Ang和Run Max Spin Ang,含义如前面Oxs_Exchange6Ngbr所述。
示例文件:antidots-filled.mif.
Oxs_TwoSurfaceExchange
提供双线型和双二次型长程交换作用。通常用于模拟自旋阀中非磁层导致的RKKY型耦合作用。Specify指定块的形式如下:
Specify Oxs_TwoSurfaceExchange:name {
sigma value
sigma2 value
surface1 {
atlas atlas_spec
region region_label
scalarfield scalarfield_spec
scalarvalue fieldvalue
scalarside side
}
surface2 {
atlas atlas_spec
region region_label
scalarfield scalarfield_spec
scalarvalue fieldvalue
scalarside side
}
}
sigma和sigma2是双线型和双二次型表面(界面)交换能,单位为 ,两者都是可选的,默认值为0。
surface1和surface2块指定了两个相互作用的界面。每个界面的代码格式由5个名称-值对组成,顺序必须按所示的列出。在每个代码块中,atlas_spec指定一个容器,region_label指定该容器中的一个区域,这两项限制了可选择的界面范围。scalarfield、scalarvalue和scalarside项定义了边界区域内的离散化界面。scalarfield_spec引用标量场对象,fieldvalue是浮点数,side是“<”,“<=”,“>=”,“>”中的一个,表示标量场中每一个点的值分别小于,小于等于,大于等于,大于scalarvalue,则该点被视为界面的“内部”(side已过时的值“-”和“+”是<=和>=的同义词)。定义的离散化界面是mesh网格上所有位于边界区域的所有点的集合,这些点位于界面的“内部”,并且有一个(最近的)邻点位于界面的“外部”,“邻点”由mesh网格确定,在典型的矩形网格中,每个单元格有六个相邻的单元格。
通过这种方式,可以获得表示两个界面的两个离散单元格列表,第一个列表中的每个单元格(表示surface1)与第二个列表中最近的单元格(即surface2)匹配。注意这个匹配过程中的不对称性:第一个列表中的每个单元格恰好只有一个匹配,但第二个列表中可能有些单元格包含在多个匹配对中,或者没有匹配的单元格。如果两个界面的尺寸不同,那么通常把较小的界面作为第一个界面,从而减少单元格的多重匹配,但这种方式不是必须的。
一个界面上的单元格i与另一个界面上的匹配的单元格j产生的交换能密度如下所示:
其中σ和σ2分别是两个界面之间的双线型和双二次型交换系数,单位为 ,mi 和 mj 是单元格 i 和 j 归一化自旋(即磁化方向),而 是从单元格i 到单元格j 方向上的离散长度,单位为米。注意,如果σ为负,则界面将成为反铁磁耦合,如果σ2为负,则双二次型倾向于自旋正交排列。
下面的示例中,通过中间的“spacer”层,在“top”层的下界面和“bottom”层的上界面之间产生反铁磁交换耦合。这里使用简单的Oxs_LinearScalarField对象来指定与z轴正交的平面。在实践中,这个例子可能表示一个自旋阀,其中顶层和底层由铁磁性材料组成,中间层可以是一个铜间隔层。
Specify Oxs_MultiAtlas:atlas {
atlas { Oxs_BoxAtlas {
name top
xrange {0 500e-9}
yrange {0 250e-9}
zrange {6e-9 9e-9}
} }
atlas { Oxs_BoxAtlas {
name spacer
xrange {0 500e-9}
yrange {0 250e-9}
zrange {3e-9 6e-9}
} }
atlas { Oxs_BoxAtlas {
name bottom
xrange {0 500e-9}
yrange {0 250e-9}
zrange {0 3e-9}
} }
}
Specify Oxs_LinearScalarField:zheight {
vector {0 0 1}
norm 1.0
}
Specify Oxs_TwoSurfaceExchange:AF {
sigma -1e-4
surface1 {
atlas :atlas
region bottom
scalarfield :zheight
scalarvalue 3e-9
scalarside <=
}
surface2 {
atlas :atlas
region top
scalarfield :zheight
scalarvalue 6e-9
scalarside >=
}
}
除标准能量和场输出外,Oxs_TwoSurfaceExchange还提供三个标量输出Max Spin Ang、Stage Max Spin Ang和Run Max Spin Ang,含义如前面Oxs_Exchange6Ngbr所述。
示例文件:spinvalve-af.mif.
Oxs_RandomSiteExchange
随机交换能。Specify指定块的形式如下:
Specify Oxs_RandomSiteExchange:name {
linkprob probability
Amin A_lower_bound
Amax A_upper_bound
}
linkprob表示将每一对相邻的单元格i,j设置具有非零交换系数Aij的概率。这里的相邻表示如果两个单元格位于彼此的6邻域单元格中,那么它们是相邻的。如果一对单元格具有非零交换系数,那么会从[Amin,Amax]范围内均匀的取一个数作为Aij。使用Oxs_Exchange6Ngbr对象的公式计算交换能量。每对单元格的Aij值在微磁问题初始化时确定,模拟过程中保持不变。A_lower_bound和A_upper_bound可以是任何实数,负值可以用来减弱由其他交换能项引起的交换作用。取值的唯一的限制是下限A_lower_bound不能大于上限A_upper_bound,linkprob概率值probability必须在[0,1]范围内。
除标准能量和场输出外,Oxs_RandomSiteExchange还提供三个标量输出Max Spin Ang、Stage Max Spin Ang和Run Max Spin Ang,含义如前面Oxs_Exchange6Ngbr所述。
示例文件:randexch.mif.
• Self-Magnetostatic Energy(自静磁能)
Oxs_Demag
标准的退磁能,并且假设每个单元格的磁化强度是恒定的,它使用[2,23]中的公式和快速傅里叶变换的卷积来计算每个单元格中的平均退磁场。如果MIF文件中的网格对象是Ox_RectangularMesh类,那么此类支持非周期模拟;如果是Oxs_PeriodicRectangularMesh类时,那么支持沿一个轴方向的周期性边界条件,但不支持多个方向的周期性边界条件。Specify指定块的形式如下:
Specify Oxs_Demag:name {
asymptotic_order error_order
demag_tensor_error relerror
}
计算内核使用近场项的解析公式、远场项的高阶渐近公式和中间项的平均渐近公式的组合来计算退磁能,每对单元格之间的距离R决定了场的范围(基于[18]的扩展),选择合适的R值以得到最佳计算速度,同时满足relerror所要求的误差。计算内核在问题初始化期间执行一次性操作,所以计算时间通常较小,relerror默认值为1e-15,几乎是双精度的误差。
渐近公式用于计算每对单元格之间的距离R比较大的情况,公式展开的默认误差是 ,可以通过error_order控制误差阶数,它的有效值有5、7、9和11,其中error_order=5表示偶极近似。
该类也还支持过时的asymptotic_radius参数,该参数以单元格为单位来设置解析公式和渐近公式之间的临界值。若指定了asymptotic_radius参数,则会将其转换为近似等效的relerror值,特殊值0和-1分别映射到relerror=1和1e-16。
示例文件 demagtensor.mif 可用于提取计算指定几何形状的退磁张量系数,参见该文件内顶部的详细说明信息。
示例文件:sample.mif, cgtest.mif, pbcbrick.mif, demagtensor.mif.
Oxs_SimpleDemag
与Oxs_Demag相同,它不支持周期性模拟,也不使用渐近公式。Oxs_SimpleDemag不会利用退磁计算核心固有的对称性,也不会利用傅里叶变换对于实(非复)函数的特殊特性。因此,Oxs_SimpleDemag源代码比Oxs_Demag简单得多,但Oxs_SimpleDemag运行时性能和内存使用率较差。Oxs_SimpleDemag用于检查验证,并作为用户自定义退磁项的基础。 Oxs_SimpleDemag 的Specify初始化使用空字符串,即{}。
示例文件:squarecubic.mif.
• Zeeman Energy(塞曼能)
Oxs_UZeeman
外加均匀(各向同性)磁场的能量。该类常用于模拟磁滞回线。Specify指定块包含可选的倍数multiplier参数和必要的磁场范围列表Hrange。磁场范围列表是一个复合列表,每个子列表表示一个磁场范围,每个子列表由7个元素组成:前3个元素表示初始磁场的x、y和z分量,后3个元素表示终止磁场的x、y和z分量,最后一个元素表示初始和终止磁场范围内的(线性)步进数目。如果步进数目为0,则磁场范围仅包括初始磁场。如果步进数目大于0,则当且仅当上一个磁场范围(如果有)的终止磁场和当前磁场范围的初始磁场相同时,会跳过该初始磁场。
磁场范围中指定的磁场以A/m为单位,让这些值乘以倍数multiplier,可以用来改变磁场的单位。例如,
Specify Oxs_UZeeman {
multiplier 795.77472
Hrange {
{ 0 0 0 10 0 0 2 }
{ 10 0 0 0 0 0 1 }
}
}
外加磁场分为0 mT,5 mT,10 mT和0 mT四个阶段。如果第二个磁场范围子列表中的初始磁场与第一个磁场范围子列表中的终止磁场不同,则会在该磁场范围内增加一个步进,从而将有五个阶段。在本例中,795.77472=0.001/µ0(译者注:这表示转换磁场单位,即1 mT = 795.77472 A/m = 10 Oe = 10 Gs)。
除了标准能量和场输出,Oxs_UZeeman类还提供以下四种标量输出:
–B:外加磁场的大小,单位为mT,非负。
–Bx:外加磁场x分量的有正负号的大小,单位为mT。
–By:外加磁场y分量的有正负号的大小,单位为mT。
–Bz:外加磁场z分量的有正负号的大小,单位为mT。
示例文件:sample.mif, cgtest.mif, marble.mif.
Oxs_FixedZeeman
非均匀、非时变的固定外加磁场,可用来模拟偏置场。Specify块里面包含一个必要参数field和一个可选倍数参数multiplier。
Specify Oxs_FixedZeeman:name {
field vectorfield_spec
multiplier multiplier
}
multiplier的默认值为1,按multiplier默认值缩放后的磁场单位为A/m。
示例文件:spinvalve.mif, spinvalve-af.mif, yoyo.mif.
Oxs_ScriptUZeeman
由Tcl脚本定义的空间均匀的外加磁场,磁场的大小可随着时间和阶段而变化。 Specify指定块的形式如下:
Specify Oxs_ScriptUZeeman:name {
script_args { args_request }
script Tcl_script
multiplier multiplier
stage_count number_of_stages
}
script 表示要使用的Tcl脚本,每次迭代都会调用一次脚本。脚本后面附加了需要的script_args脚本参数,使用方式见第17.3.3.6节MIF 2文件格式中的用户自定义函数,它的值args_request应该是 {stage stage_time total_time base_state_id current_state_id}的子列表,其中时间参数的单位是秒, 后两个state_id是结合MIF文件中GetStateData命令使用的。若没有设置script_args脚本参数,则默认参数列表是{ stage stage_time total_time}。
脚本的返回值应该是有6个元素的列表,{Hx,Hy,Hz,dHx,dHy,dHz},表示外加磁场和外加磁场对时间的导数。对于模拟的每个阶段时间内,外加磁场作为时间的函数必须是可微的,但模拟的阶段之间可以不连续。对于使用时间演化器的模拟,需要确保外加磁场对时间的导数值是准确的,否则演化器将无法正常工作,这个问题的导致的常见错误是时间演化步长突然下降。
外加磁场和外加磁场对时间的导数在使用前会乘以倍数multiplier,并会以A/m为单位;如果用户需要Tcl脚本返回以T为单位的磁场,则需要把multiplier设为1/µ0的值(约795774.72)将结果转换为A/m。multiplier的默认值为1。
参数stage_count将通知Oxs_Driver关于Oxs_ScriptUZeeman对象需要的阶段数量, stage_count值为0(默认值)表示Oxs_ScriptUZeeman适用于任意阶段。此处的stage_count阶段数必须兼容在驱动器中的指定的阶段数。
以下示例程序将产生频率为1 GHz、振幅为800 A/m,沿x方向的正弦交变磁场:
proc SineField { total_time } {
set PI [expr {4*atan(1.)}]
set Amp 800.0
set Freq [expr {1e9*(2*$PI)}]
set Hx [expr {$Amp*sin($Freq*$total_time)}]
set dHx [expr {$Amp*$Freq*cos($Freq*$total_time)}]
return [list $Hx 0 0 $dHx 0 0]
}
Specify Oxs_ScriptUZeeman {
script_args total_time
script SineField
}
除了标准的能量和场输出外,Oxs_ScriptUZeeman类还提供以下四种标量输出:
–B:外加磁场的大小,单位为mT,非负。
–Bx:外加磁场x分量带正负号的大小,单位为mT。
–By:外加磁场y分量带正负号的大小,单位为mT。
–Bz:外加磁场z分量带正负号的大小,单位为mT。
示例文件:acsample.mif, pulse.mif, rotate.mif, varalpha.mif, yoyo.mif.
Oxs_TransformZeeman
该类本质上是Oxs_FixedZeeman和Oxs_ScriptUZeeman类的组合,它的外加磁场是通过对空间均匀,时间静止的磁场使用随时间和阶段变化的线性变换方法来生成的,变换方法由Tcl脚本指定。
Specify指定块的形式如下:
Specify Oxs_TransformZeeman:name {
field vector_field_spec
type transform_type
script Tcl_script
script_args { args_request }
multiplier multiplier
stage_count number_of_stages
}
在微磁问题初始化期间,将field的值设置为vector_field_spec,并在整个模拟过程中保持不变。在每次迭代中,都要调用Tcl脚本Tcl_script。script后面是script_args脚本参数,使用方式见第17.3.3.6节MIF 2文件格式中的用户自定义函数。args_request应该是{ stage stage_time total_time}的子列表。如果没有设置script_args脚本参数,则默认参数列表是按上述顺序排列的完整列表,即{ stage stage_time total_time}。时间参数的单位是秒。
脚本返回值应该是一个3x3的线性变换矩阵和矩阵的每个元素(变换式子)对时间的导数。变换式子每个阶段内必须是可微的,但允许在阶段之间是不连续的。正如Oxs_ScriptUZeeman中所说,导数的值必须是准确的。Oxs_TransformZeeman会对vector_field_spec指定的固定矢量场中逐点的使用该变换,该固定矢量场的幅度还通过倍数multiplier进行缩放,参数multiplier是可选的,默认值为1.0。
type transform_type标签规定了从Tcl脚本返回结果的格式。可用格式有identity, diagonal, symmetric 和general。general是最灵活的,它表示Tcl脚本返回的是一个包含18个元素的列表,里面有一个3x3矩阵和每个元素对时间的导数的3x3矩阵。矩阵按行序指定,即M1,1、M1,2、M1,3、M2,1、M2,2等。显然,该列表很长,如果所需的变换矩阵是对称的或对角的,那么可以改变type值以减小Tcl返回结果列表的长度。当type值为symmetric对称类型时,Tcl脚本返回一个包含12个元素的列表,即按行序排列的转换矩阵及其时间导数矩阵的6个上对角线元素,即M1,1、M1,2、M1,3、M2,2、M2,3、M3,3。当type值为diagonal,在这种对角矩阵情况下,Tcl脚本返回结果应该是包含6个元素的列表,即按行序排列的转换矩阵及其时间导数矩阵的3的住对角元素,即M1,1、M2,2、M3,3。
transform_type最简单的类型是identity,这是默认值,它的变换矩阵为单位矩阵,这意味着除了倍数变换multiplier起到变换作用之外,实际上不使用任何其他变换方式。对于identity类型,如果没有设置script和script_args标签,那么Oxs_TransformZeeman将会和Oxs_FixedZeeman类相同。
以下示例产生一个1000 A/m,在xy平面上以1 GHz的频率旋转的磁场:
proc Rotate { freq stage stagetime totaltime } {
global PI
set w [expr {$freq*2*$PI}]
set ct [expr {cos($w*$totaltime)}]
set mct [expr {-1*$ct}] ;# "mct" is "minus cosine (w)t"
set st [expr {sin($w*$totaltime)}]
set mst [expr {-1*$st}] ;# "mst" is "minus sine (w)t"
return [list $ct $mst 0 \
$st $ct 0 \
0 0 1 \
[expr {$w*$mst}] [expr {$w*$mct}] 0 \
[expr {$w*$ct}] [expr {$w*$mst}] 0 \
0 0 0]
}
Specify Oxs_TransformZeeman {
type general
script {Rotate 1e9}
field {0 1000. 0}
}
由于矢量场field 是空间均匀的,所以使用Oxs_ScriptUZeeman类也可以获得上述的特殊磁场,但该例子只是为了简单才使用的均匀矢量场。vector_field_spec可以是任何Oxs矢量场对象。例如,样品中心的磁场可以很大,并向边缘衰减,在这种情况下,上面的示例将生成一个旋转磁场,该旋转场集中在样本的中心。
参数stage_count将通知Oxs_Driver关于Oxs_TransformZeeman对象需要的阶段数量,stage_count值为0(默认值)表示Oxs_TransformZeeman适用于任意阶段。此处的stage_count阶段数必须兼容在驱动器中指定的阶段数。
示例文件:sample2.mif, tickle.mif, rotatecenter.mif.
Oxs_StageZeeman
Oxs_Stagezeman类提供每个阶段更新一次,空间变化的外加磁场。在它的一般形式中,每个阶段的磁场都由一个由Tcl脚本确定的Oxs矢量场对象表示。它还有一个简化的形式,会根据传入的矢量场文件名称列表,在每个阶段采用一个矢量场,以此表示外加磁场。
Specify指定块的形式如下:
Specify Oxs_StageZeeman:name {
script Tcl_script
files { list_of_files }
stage_count number_of_stages
multiplier multiplier
}
初始块应指定 script 或 files ,但不能同时指定两者。如果指定了 script,那么在模拟中每开始一个新阶段时,都会通过将该阶段数(0以上的整数)附加到Tcl_script来构成一个Tcl命令,此命令返回Oxs_VectorField矢量场对象的引用,该引用可以是MIF文件中的顶级指定块定义的矢量场对象的实例名称,也可以是由Oxs_VectorField类和它的初始化字符串组成的列表。在后一种情况下,Oxs_VectorField对象将通过内联的Specify块被创建为临时对象。
参见下面示例中参数script的用法:
proc SlidingField { xcutoff xrel yrel zrel } {
if {$xrel>$xcutoff} { return [list 0. 0. 0.] }
return [list 2e4 0. 0.]
}
proc SlidingFieldSpec { stage } {
set xcutoff [expr {double($stage)/10.}]
set spec Oxs_ScriptVectorField
lappend spec [subst {
atlas :atlas
script {SlidingField $xcutoff}
}]
return $spec
}
Specify Oxs_StageZeeman {
script SlidingFieldSpec
stage_count 11
}
SlidingFieldSpec函数用于为Oxs_ScriptVectorField 矢量场对象生成初始化字符串,该对象接着使用SlidingField函数按空间点的位置来定义外加磁场。对于x相对坐标大于$stage/10的所有点处,会在正x方向上产生 A/m的磁场,其余方向的磁场分量则为0。$stage是阶段索引,该处为0,1,…10。例如,如果$stage为5,则样本的左半部分将得到一个指向右侧的 A/m的磁场,而样本的右半部分则没有。在本例中,SlidingFieldSpec的返回值为:
Oxs_ScriptVectorField {
atlas :atlas
script {SlidingField 0.5}
}
其中 :atlas 是MIF文件中定义的Oxs_Atlas容器对象的引用。
参数stage_count将通知Oxs_Driver关于Oxs_StageZeeman对象需要的阶段数,stage_count值为0(默认值)表示Oxs_StageZeeman适用于任意阶段。此处的stage_count阶段数必须兼容在驱动器中定义的阶段数。
上面的示例使用了两个脚本,一个用于定义Oxs_ScriptVectorField对象,另一个在Oxs_ScriptVectorField对象内部使用。除此之外,也可以使用任意Oxs_VectorField类,如下例所示:
proc FileField { stage } {
set filelist { field-a.ohf field-b.ohf field-c.ohf }
set spec Oxs_FileVectorField
lappend spec [subst {
atlas :atlas
file [lindex $filelist $stage]
}]
return $spec
}
Specify Oxs_StageZeeman {
script FileField
stage_count 3
}
FileField函数规定了Oxs_FileVectorField对象对这三个文件的加载方式,field-a.ohf、field-b.ohf或field-c.ohf三个文件之一的加载具体取决于阶段数。
根据一系列文件来定义外加磁场很常见,而且方法简单。参数files的用法为:
Specify Oxs_StageZeeman {
files { field-a.ohf field-b.ohf field-c.ohf }
}
这与前面的示例基本相同,但有两个区别。首先,不需要stage_count,因为Oxs_Stagezeman知道文件列表的长度,用户虽然可以指定stage_count,但它的默认值是文件列表的长度,这与使用script参数时的stage_count默认值0不同。如果stage_count大于文件列表,则根据需要重复最后一个文件以达到指定的大小。
第二个区别是,在使用files参数时没有指定Oxs_Atlas。Oxs_FileVectorField对象会把从文件中读取到的磁场进行空间缩放,以匹配指定的空间体积。通常,空间体积是通过显式引用一个容器来指定的,但通过Oxs_Stagezeman的files参数,文件中的磁场会被隐式缩放以匹配整个网格化的模拟空间。通常情况下,要获得不同的空间缩放,则需要使用上述的script参数,并结合一个不同的容器或显式的x/y/z范围。
list_of_files是一个分组列表grouped list。参见第17.3.3.3节的有关分组列表的详细信息。
Oxs_Stagezeman还有的参数是multiplier。该参数的值作为缩放因子逐点的作用于磁场幅度。例如,如果用户需要Oxs_VectorField对象返回以Oe为单位的磁场,而不是A/m,则可以将multiplier设置为79.5775来转换。外加磁场的方向可以通过使用负的multiplier来反转。
除了标准能量和场输出外,Oxs_Stagezeman类还提供以下四种标量输出:
–B max:外加磁场逐点的最大幅度,单位为mT。非负,
–Bx max:外加磁场x分量带正负号的最大值,单位为mT。
–By max:外加磁场y分量带正负号的最大值,单位为mT。
–Bz max:外加磁场z分量带正负号的最大值,单位为mT。
示例文件:sliding.mif, slidingproc.mif, rotatestage.mif,rotatecenterstage.mif.
7.3.4 Evolvers 演化器。
演化器负责将磁化配置从一个步进(step)演化更新到下一个步进。有两种类型的演化器,跟踪Landau-Lifshitz-Gilbert动力学方程的time evolvers时间演化器和通过最小化技术定位能量表面局部极小值的minimization evolvers最小化演化器。演化器由驱动器控制,且必须与适当类型的驱动器匹配,即时间演化器必须与时间驱动器配对,最小化演化器必须与最小化驱动器配对。驱动器将磁化配置提交给演化器,并请求演化器将磁化配置演化更新一个步进(也称为iteration迭代)。驱动器决定每个模拟阶段和整个模拟是否完成,而不是演化器来决定。演化器的Specify 指定块中包含控制逐步进演化的所有参数,但停止条件是在驱动器的Specify 指定块中指定的。
目前在标准OOMMF中有三个时间演化器和一个最小化演化器。时间演化器有Oxs_EulerEvolve、Oxs_RungeKuttaEvolve和Oxs_SpinXferEvolve。最小化演化器是Oxs_CGEvolve。
Oxs_EulerEvolve
时间演化器对Landau-Lifshitz ODE(朗道-利夫希兹微分方程)实现了一种具有步长控制的简单一阶前向Euler(欧拉)法:
式中,M是磁化强度,Heff是有效场, 是朗道-利夫希兹旋磁比,α是阻尼常数。吉尔伯特形式:
式中, 是吉尔伯特旋磁比,在数学上的等价关系式为 。
Specify指定块的形式如下:
Specify Oxs_EulerEvolve:name {
alpha α
gamma_LL
gamma_G
do_precess precess
min_timestep minimum_stepsize
max_timestep maximum_stepsize
fixed_spins {
atlas_spec
region1 region2 . . .
}
start_dm ∆m
error_rate rate
absolute_step_error abs_error
relative_step_error rel_error
step_headroom headroom
}
所有参数都有默认值,首先列出最常调整的参数。
alpha、gamma_LL和gamma_G与Landau-Lifshitz-Gilbert ODE(7.2),(7.3)中的参数相同,其中 和 的单位为m/A·s,α无量纲。用户只需指定 和 中的一个即可,如果两者均未指定,则默认值为 。(由于(7.2),(7.3)中的 和 使用的是绝对值惯例,所以Specify指定块中gamma_LL 和gamma_G值是与符号无关的。)α的默认值为0.5,与实验值相比,虽然该值较大,但可以使模拟快速收敛到平衡状态。然而,对于精确的动力学研究,必须为α指定适当的值。
do_precess参数的值precess应为1或0,表示是否启用Landau-Lifshitz ODE中的进动项(即(7.2)右侧的第一项)。如果precess为0,则将禁用进动项,模拟将沿着向平衡方向的最陡下降路径演化,precess默认值为1。
min_timestep和max_timestep参数为演化器使用的步长大小进行了软限制。如果模拟过程中需要更小的步长来满足基于时间的停止标准,那么驱动器会自动使用更小的步长以满足停止标准。如果该尺寸的步长产生了一个在数值上无法与前一状态区分的磁化状态,则最大值将被忽略。min_timestep最小时间步长和max_timestep最大时间步长的单位是秒,默认值分别为0 和 。
fixed_spins参数允许指定区域的磁化一直保持为初始状磁化态。它的值应该是一个列表,列表的第一个元素要么是内联定义的容器(整个定义代码块作为列表的第一个元素),要么是之前已定义的容器的名称。列表的其余部分则是该容器中磁化状态需要保持固定的区域的名称,即表示指定区域中任意点在任意时间t 有M(t)=M(0),这些固定磁化区域的场和能量仍然是正常计算和导出的。尽管可以使用任意容器来指定磁化固定的区域,但通常创建一个特殊的专用容器,其中定义有专用于此目的特殊区域。
模拟中第一个候选的迭代步长会让 m(归一化(单位)磁化强度)的最大变化值处于start_dm范围内,start_dm的单位为度,默认值为0.01。
剩下的四项:error_rate(误差率)、absolute_step_error(绝对步长误差)、relative_step_error(相对步长误差)和step_headroom(步长余量)用于控制步长的精度,仅可在模拟前设置。给定在时间t 和位置i 处的归一化(单位)磁化强度 ,以及在时间t+Δt处的磁化强度 ,位置i 处的误差估计为:
其中, 是使用Landau-Lifshitz ODE(7.2)中 m 对时间求导得到的。一阶方法的本质上是假设在区间 [t,t+△t] 内是常数,使用上述公式来计算时间端点处 的差值来评估该假设的误差程度。
如果任意位置i 处的最大误差小于absolute_step_error, error_rate ×∆t 和 relative_step_error ×,则接受该候选步长,其中 是任意位置i 在时间t 时 的最大值。如果该步长不被接受,则重新计算出一个更小的步长尺寸直到通过上述测试,并利用这个小的步长尺寸乘以step_headroom来得到一个新的候选步长。如果接受了该新的候选步长,接着会利用误差信息以相同的方式修改来修正下一个步长的步长尺寸。
上面误差是根据单位磁化强度计算的,所以单位是弧度或弧度/秒。然而,在Specify指定块中,error_rate和absolute_step_error分别以 度/纳秒 和 度 为单位,在使用之前,应该在进行适当的单位转换。relative_step_error是无量纲的,范围是[0,1]。这三个参数都可以设置为-1,从而禁用由这些参数控制的误差检查。这三个参数都是可选的,error_rate默认值为-1,absolute_step_error默认值为0.2,relative_step_error默认值为0.2。
headroom的值在(0,1)范围内,表示控制步长尺寸选择的保守程度。如果headroom的值太大,那么将会消耗大量时间去计算未通过误差控制测试的候选步长。如果headroom的值很小,那么大多数候选步长将通过误差控制测试,但是在其他必要计算步骤中仍将消耗大量时间。headroom的默认值为0.85。
除了上述误差控制测试外,如果在调整任意时变的外场后,发现总能量增加,则该候选步长也不会被接受。在这种情况下,下一个候选步长会设置为被拒绝步长的一半。
Oxs_EulerEvolve模块提供五个标量、一个标量场和三个矢量场输出。标量输出:
•Max dm/dt:| dm/dt |的最大值,单位为 度/纳秒,m为单位磁化强度的方向。
•Total energy:单位为焦耳。
•Delta E:上一步进和当前步进之间的能量变化,单位为焦耳。
•dE/dt:能量对时间的导数,单位为焦耳/秒。
•Energy calc count:计算总能量的次数。
标量场输出:
•Total energy density:每个单元格的总能量密度,单位为 。
矢量场输出:
•Total field:总有效场 H(磁场强度)(以A/m为单位)。
•mxH(m叉乘H):转矩(以A/m为单位),m是单位磁化强度的方向,H是总有效场。
•dm/dt:m对时间的导数,单位为弧度/秒。
示例文件:octant.mif.
Oxs_RungeKuttaEvolve
时间演化器实现了几种Runge-Kutta(龙格-库塔)方法,集成了步长可控的Landau-Lifshitz-Gilbert ODE(7.2)、(7.3)。在大多数情况下,它比Oxs_EulerEvolve类优秀。Specify指定块的形式如下:
Specify Oxs_RungeKuttaEvolve:name {
alpha α
gamma_LL
gamma_G
do_precess precess
allow_signed_gamma signed_gamma
min_timestep minimum_stepsize
max_timestep maximum_stepsize
fixed_spins {
atlas_spec
region1 region2 . . .
}
start_dm ∆m
start_dt start_timestep
stage_start scontinuity
error_rate rate
absolute_step_error abs_error
relative_step_error rel_error
energy_precision eprecision
min_step_headroom min_headroom
max_step_headroom max_headroom
reject_goal reject_proportion
method subtype
}
Oxs_RungeKuttaEvolve中的大多数参数也出现在Oxs_EulerEvolve类中。两个类中重复的参数含义相同,默认值相同,但relative_step_error和error_rate除外,对于Oxs_RungeKuttaEvolve类来说,这两个参数的默认值分别为0.01和1.0。此外,Oxs_RungeKuttaEvolve类的alpha、gamma_LL和gamma_G参数可以使用标量场对象来初始化,以允许这些材料参数随空间而变化。
allow_signed_gamma参数用于模拟测试,仅供高级用户使用。文献中关于的符号并没有统一的规定,因此,上面(7.2,7.3)的Landau-Lifshitz-Gilbert方程使用了的绝对值。如果allow_signed_gamma为0(默认值),则表示使用的绝对值;如果将allow_signed_gamma设置为1,则表示Landau-Lifshitz-Gilbert方程不使用的绝对值,即带有符号,在这种情况下,的默认值为(单位为m/A·s)。在不使用的绝对值时,如果为正,则自旋将围绕有效场后向进动(precess backwards),阻尼项将迫使自旋远离有效场,并且总能量增加。如果用户研究中的>0,则应该设置α<=0以迫使自旋靠近有效场,或者禁用能量精度控制(下面讨论)。
min_step_headroom “最小步长余量”(默认值0.33)和max_step_headroom “最大步长余量”(默认值0.95)取代了Oxs_EulerEvolve中的step_headroom参数。演化器会在min_step_headroom和max_step_headroom之间自动调整并得到有效步长余量,并让观察到的拒绝比例接近reject_goal(默认值0.05)。
method参数表示选择一个特定的Runge-Kutta方法。method的值为rk2、rk4、rkf54、rkf54m或rkf54s中的一个,默认值为rkf54。rk2和rk4分别实现了规范的二阶和四阶全局Runge-Kutta方法。对于rk2,通过比较区间的中点和终点处的来管理步长尺寸,类似Oxs_EulerEvolve类的步长尺寸控制方式。rk2方法中的步进一次需要计算两次。
在rk4方法中,在标称步长(nominal step)的一半处分成两个连续步长,并比较端点与采用一整个步长尺寸的差异,使用这两种状态之间最大差值的1/15作为误差评估。rk4方法的一个步进需要计算11次,最终结果是两个半尺寸的步长。
其余的rkf54、rkf54m和rkf54s方法,与由Dormand和Prince推导出的Runge-Kutta-Fehlberg方法联系紧密。在有关论文中,rkf54实现RK5(4)7FC,rkf54m实现RK5(4)7FM,rkf54s实现RK5(4)7FS。这些都是全局五阶带四阶步长尺寸控制的方法。这些方法中每个被接受的步长需要计算6次,被拒绝的则需要计算7次。这些方法之间的差异涉及稳定性和误差最小化的权衡,RK5(4)7FS方法稳定性最好,RK5(4)7FM误差最小,RK5(4)7FC代表了两者的折中。Oxs_RungeKuttaEvolve使用的默认方法是RK5(4)7FC。
Oxs_RungeKuttaEvolve指定块中还有一个energy_precision参数,表示对能量计算的相对精度的预期估计。考虑到时变的外加磁场引起总能量变化后,LLG ODE的剩余能量从一个步进到下一个步进应该降低,若发现剩余能量的增加量超过eprecision值,那么Oxs_RungeKuttaEvolve将不接受该步长。eprecision的默认值为。若eprecision为-1,则会禁用energy_precision参数。Oxs_RungeKuttaEvolve类提供与Oxs_EulerEvolve相同的标量、标量场和矢量场输出。它还提供了可通过MIF文件中的 GetStateData命令访问的以下状态数据:
每一项状态数据的全名称为:Oxs_RungeKuttaEvolve:<instance_name>:<item_name>
其中,<instance_name>是实例对象名称(通常是一个空字符串或类似于“evolver”的字符串)。在阶段开始状态,只有Mx、My和Mz有效,这些以及对应的dMx/dt、dMy/dt和dMz/dt是整个模拟空间的平均值。
示例文件:sample.mif, acsample.mif, spinmag.mif, spinmag2.mif,varalpha.mif, yoyo.mif.
Oxs_SpinXferEvolve
集成了带有自旋角动量项的Landau-Lifshitz-Gilbert ODE的时间演化器:
(与(7.3)相比),其中:
(译者注:reduced magnetization(约化(归一化)磁场强度),Gilbert gyromagnetic ratio(吉尔伯特旋磁比),electron polarization direction(电子极化方向))
在β的式子中,电子的电荷e是以C为单位,电流密度J是以 为单位,自由层厚度t 以米为单位,饱和磁化强度Ms 以A/m为单位。
Oxs_SpinXferEvolve类的参数是 Oxs_RungeKuttaEvolve类的扩展,Specify指定块的形式如下:
Specify Oxs_SpinXferEvolve:name {
alpha α
gamma_LL
gamma_G
do_precess precess
allow_signed_gamma signed_gamma
min_timestep minimum_stepsize
max_timestep maximum_stepsize
fixed_spins {
atlas_spec
region1 region2 . . .
}
start_dm ∆m
stage_start scontinuity
error_rate rate
absolute_step_error abs_error
relative_step_error rel_error
energy_precision eprecision
min_step_headroom min_headroom
max_step_headroom max_headroom
reject_goal reject_proportion
method subtype
P polarization
P_fixed p_fixed_layer
P_free p_free_layer
Lambda Λ
Lambda_fixed Λ_fixed_layer
Lambda_free Λ_free_layer
eps_prime ep
J current_density
J_profile Jprofile_script
J_profile_args Jprofile_script_args
mp p_direction
energy_slack eslack
}
该类和Oxs_RungeKuttaEvolve类中的重复参数具有相同的含义和默认值,但error_rate参数除外,对于Oxs_SpinXferEvolve,error_rate默认值为-1(即禁用)。
P和Lambda的默认值分别为0.4和2。如果有需要,固定层和自由层的值可以通过P_fixed, P_free, Lambda_fixed和Lambda_free分别单独设置,否则将按照P_fixed=P_free=P和Lambda_fixed=Lambda_free =Lambda的关系式简单的设置固定层和自由层的值。Lambda必须大于或等于1,Lambda=1将消除 公式中的m·mp项。如果想要系数 非零,直接设置eps_prime参数的值即可。
参数电流密度J和单位极化方向mp是必需要的。J的单位为 。正J产生的转矩导致m将倾向平行于mp。
参数J、mp、P、Lambda和eps_prime在空间中都可以是逐点的变化,但相对于时间是固定的。然而,J可以乘以一个时变的“profile”,来模拟电流的上升时间、脉冲等,通过参数J_profile和J_profile_args来使用该功能。Jprofile_script是一个返回单个标量的Tcl脚本。Jprofile_script_args是{stage stage_time total_time}的列表,表示在每个时间步进附加到Jprofile_script的参数,默认值就是整个列表,即{stage stage_time total_time}。
Oxs_SpinXferEvolve类提供与Oxs_RungeKutta相同的五个标量输出和三个矢量输出,外加标量输出“average J”,矢量场输出“Spin torque”(即类阻尼矩|γ|βε(m×mp×m) 和矢量场输出“J*mp”。(开发说明:在启用propagate_mp的情况下,mp实际上等于 ,其中X是电流方向, 是该方向上的单元格尺寸。)
Oxs_SpinXferEvolve类不包含任何由电流诱导的奥斯特场。当然,用户可以单独添加任意场作为塞曼能量项来模拟奥斯特场,在spinxfer.mif示例文件中包含此情况。
该演化器没有考虑温度的影响,即它假设温度始终为T=0 K。
还要注意,mp是固定的。
对于该类的基本用法,Specify指定块可以简化:
Specify Oxs_SpinXferEvolve:evolve {
alpha 0.014
J 7.5e12
mp {1 0 0}
P 0.4
Lambda 2
}
该类的示例文件位于oommf/app/oxs/local,而不是oommf/app/oxs/examples。
示例文件:spinxfer.mif, spinxfer-miltat.mif, spinxfer-onespin.mif.
Oxs_CGEvolve
Oxs_CGEvolve是最小化演化器,它是一个无预处理的共轭梯度最小化演化器。Specify指定块的形式如下:
Specify Oxs_CGEvolve:name {
gradient_reset_angle reset_angle
gradient_reset_count count
minimum_bracket_step minbrack
maximum_bracke_step maxbrack
line_minimum_angle_precision min_prec_angle
line_minimum_relwidth relwidth
energy_precision eprecision
method cgmethod
fixed_spins {
atlas_spec
region1 region2 . . .
}
}
所有参数都有默认值。
能量演化到最小值需要计算一系列的最小化路线。每条路线表示可能磁化配置的3N维空间中的一维仿射子空间,其中N是模拟中的自旋数量。一旦沿着一条路线找到了一个能量最小值,就会得到这个理想中与前面的所有方向都正交的新方向,新方向与能量相对于磁化强度的梯度有关。在实践中,序列中路线方向的数量是有限的,参数gradient_reset_angle和gradient_reset_count控制着梯度重置过程。gradient_reset_angle会检查新方向和梯度之间的角度,如果该角度大于reset_angle(以度表示),则放弃这个选定的新方向,并使用梯度方向作为新的第一个方向并重新初始化共轭梯度过程。count表示在梯度重置过程之前选择的最大路线方向数。由于序列中第一个路线是沿着梯度方向选择的,所以将count设置为1可以将算法转化为最速下降法。reset_angle的默认值为80度,count默认值为50。
一旦选择了一个最小化方向,首先需要在最小化路线上把能量极小值使用括号括起来,即在给定路线上选择一个起始点(上一条最小化路线上的能量极小值的位置)和该路线上的另一个点,使最小值能量位于这两个点之间。当其中一个点沿着最小化路线移动时,模拟中的自旋会转动,其中一个自旋的转动比其他转动得快(或至少和其他转动得一样快)。如果起始点不是前一个正确的最小化路线的结果,那么将调整第一个括号设想的步长,以便让移动得最快的自旋来转动由参数minimum_bracket_step指定的角度。在更常见的情况下,起始点是前一个最小化路线阶段的能量最小值,于是把初始括号设想的步长设置为当前最小化路线的起始点和前一个最小化路线的起始点之间的距离。
在候选括号点处检查能量和能量梯度,以测试能量最小值是否在区间内,如果不在,将根据第一个括号设想的区间大小和区间端点处能量的导数来扩大区间,继续这一过程,直到能量最小值被括号括起来,或者移动得最快的自旋转动由参数maximum_bracket_step指定的角度。如果成功的将最小值能量使用括号括起来,则利用能量和能量导数信息可以在区间内得到一个维度的最小化能量。此过程中的每一步骤都会减小括号区间的宽度。继续该过程,直到路线方向和计算出的能量梯度之间的角度在参数 line_minimum_angle_precision 范围内,并且相对于起点(即前一个路线最小化过程的停止点)的区间宽度小于line_minimum_relwidth。停止点,即有效最小值,被视为具有较小能量的最终区间的端点。min_prec_angle默认为1度。relwidth默认为1,表示将让line_minimum_relwidth控制参数失效,即该参数通常只起到辅助控制作用。
如果不能将最小值能量使用括号括起来,即在参数maximum_bracke_step允许的最大括号区间里,检测括号中的最小值能量失败,则把最大括号的端点作为最小化迭代的下一个点。
一旦选择了路线的最小停止点,将会选择新的路线方向开始下一次迭代,如上所述,如果停止点不是真正的最小点,但满足参数maximum_bracket_step的约束。在这种情况下,以与触发gradient_reset_angle和gradient_reset_count控制参数时相同的方式重置正交路线序列,并且直接把能量梯度作为下一个路线方向。
在设置“minimum_bracket_step”、“maximum_bracket_step”和“line_minimum_relwidth”时,需要注意几点,如果minimum_bracket_step值太小,则可能需要多次迭代才能获得足够大的区间来将最小值括起来。如果minimum_bracket_step太大,那么括号的区间将不必要地变得很大,这可能需要多次迭代才能找到括号区间里的最小值。minimum_bracket_step仅在重置线路方向序列时起作用,因此需要将该参数的值设置得很小,该参数以度为单位,默认值为0.05。
如果maximum_bracket_step太小,那么大部分最小值将不会被括号括起来,于是最小化方法将退化为最速下降法。如果maximum_bracket_step太大,则最小化路线可能会让磁化强度远离局部能量最小值(即,在整个3N维磁化强度空间上的最小值),变成其他更远的能量最小值的磁化。maximum_bracket_step以度为单位,默认值为10。
line_minimum_angle_precision和line_minimum_relwidth决定了单个最小化路线的精度,而不是总的最小化过程的精度,后一个精度由驱动器Specify指定块中的停止标准来控制。但这两个参数也是重要的,因为最小化路线的精度影响路线方向序列的正交性。如果两参数指定的精度太低,则选定的路线方向将很快偏离相互正交的方向。相反,任意一个参数指定的精度太高,会产生额外的最小化路线迭代步骤,这些迭代步骤对于在整个3N维磁化空间中能量收敛到最小值没有任何作用。
参数energy_precision表示能量计算的相对精度。这用于在“括号过程”和路线最小化阶段的能量比较中引入松弛因子,也就是说,如果在两个点处计算能量值的相对误差小于eprecision,则它们被视为具有相同的能量。eprecision的默认值为1e-10。真实的精度主要取决于模拟中的自旋数量。对于大型模拟可能需要增加eprecision。
参数method可以设置为Fletcher-Reeves 或 Polak-Ribiere,表示选择共轭梯度方向的算法。默认设置为Fletcher-Reeves,它对内存的需求较小。
Oxs_CGEvolve的最后一个参数 fixed_spins和Oxs_EulerEvolve类中的该参数具有相同的作用。
Oxs_CGEvolve提供九个标量、一个标量场和两个矢量场输出。
标量输出:
•Max mxHxm:| m×H×m |的最大值,单位为A/m;m为单位磁化强度的方向。
•Total energy:单位为焦耳。
•Delta E:上一步进和当前步进之间的能量变化,单位为焦耳。
•Energy calc count:计算总能量的次数。
•Bracket count:在路线最小化的第一阶段,尝试将能量最小值括起来所需的总次数。
•Line min count:在路线最小化的第二阶段,总的最小化迭代数(即最小值被括起来之后的步进)。
•Cycle count:选择的路线方向数。
•Cycle sub count:自上次重置梯度方向后,选择的路线方向数。
•Conjugate cycle count:共轭梯度过程重置梯度方向的次数。
标量场输出:
•Total energy density:单元格里面的总能量密度,单位为J/m3。
矢量场输出:
•H:以A/m为单位的总有效场。
•mxHxm:以A/m为单位;m是单位磁化强度的方向。
示例文件:cgtest.mif, stdprob3.mif, yoyo.mif.
版权声明:本文标题:学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1725733658a1039482.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论