学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章

士不可以不弘毅,任重而道远。——曾子《论语·泰伯章》

# 前言

这是oommf软件教程《OOMMF User’s Guide》的中文翻译文章,由于本人水平有限,有些翻译可能有错误,望见谅。后续章节的翻译正在进行,以大约2万字为节点上传一次。 

第7章是本手册最重要的章节,由于本人水平是在很低,很多地方我都是凭借“想象力”硬凑的,所以翻译的有些句子可能词不达意,遇到这种情况请参阅原文,特别是7.3.4演化器部分的错误可能较多。

将Word复制到CSDN时发现一个问题:这里不能正确显示字母的上面的字符,它表示为字母(字符),OK,就这样注意一下吧。

目录

7 OOMMF可扩展求解器

7.1 OOMMF可扩展求解器交互界面:Oxsii。

7.2 OOMMF可扩展批处理求解器界面:boxsi。

7.3标准的Oxs_Ext子类。

7.3.1容器。

7.3.2网格。

7.3.3能量。

7.3.4演化器。


7 OOMMF可扩展求解器

Oxs(OOMMF可扩展求解器)是一个可扩展的微磁计算引擎,能够解决包含三维网格上定义的自旋问题。Oxs有两个工具程序:Oxsii主要通过图形界面与用户交互,和具有扩展命令行的批处理工具Boxsi,它适合在shell脚本中使用。

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。

学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章_第1张图片

概述

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>是否在完全解决问题后退出。默认情况下,需要等待手动的选择解决另一个问题。

-logfile logname将日志和错误信息写入logname文件。默认的日志文件是oommf/oxsii.errors。

-loglevel level控制日志信息的详细级别,值越大,输出信息越多。默认值为1。

-nice<0 | 1>如果启用(即1),则程序将在启动后降低其调度优先级。默认值为1,即将优先级让给其他程序。

-nocrccheck<0 | 1>在模拟重新启动时,通常将原始MIF文件的CRC与重新启动文件中的CRC进行比较。如果CRC不匹配,则会抛出一个错误,提醒用户MIF文件已更改。如果此选项已启用(即1),则CRC将被禁用。

-numanodes 此选项在具有NUMA功能的计算机上可用。nodes参数必须是以逗号分隔的、0以上的节点数字列表、或“auto”或“none”。在第一种情况下,这些数字指的是内存节点,这些数字作为单个参数在命令行上传递,因此要么确保参数列表中没有空格,要么使用引号包裹空格,例如,-numanodes 2,4,6或-numanodes“2,  4,  6”。线程按顺序以循环方式分配给节点调度。用户可以将所有系统节点分配给Oxsii进程,也可以将Oxsii限制在内存节点的子集上运行,这样,用户可以为其他进程(或Oxsii的其他实例)保留特定的处理核心,因系统而异,通常每个内存节点都有多个处理核心。如果参数选择了“auto”,则线程将被分配给整个内存节点列表中的固定序列节点。如果参数选择 “none”,则线程不会通过Oxsii绑定到节点,而是由操作系统分配。在最后一种情况下,随着时间的推移,操作系统可以在处理器之间自由分配线程。在另外两种情况下,在Oxsii实例的生命周期内,每个线程都绑定到一个特定节点。另请参见Boxsi文档中关于线程注意事项的讨论。

nodes的默认值是“none”,它允许操作系统根据系统总体使用情况分配线程,这也是计算机不支持NUMA时的行为。另一方面,如果一台机器主要用于运行一个Oxsii实例,那么如果线程数设置为机器上处理核心的数量,并且节点设置为“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应该是一个包含偶数个参数的列表,对应名称+值对。每个“名称”必须在输入文件里面的参数语句中出现,必须引用整个名称+值列表,以便作为命令行上的单个参数传给Oxsii。例如,如果A和Ms出现在MIF文件的参数语句中,那么可以这样设置参数:

-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参数是要运行的线程数,默认数值由config/platforms/平台名称 中的oommf_thread_count设置,但可能会被环境变量OOMMF_THREADS或有关的命令参数选项覆盖。在大多数情况下,线程默认数值等于系统上处理核心数量,可以通过命令tclsh oommf.tcl +platform查询。

miffile加载并解决miffile中的问题,该文件必须为MIF 2格式,或通过mifconvert程序转换为该格式。

以上所有参数选项都是可选的。

由于Oxsii本身不提供任何用户界面窗口,因此它依赖于mmLaunch为其提供界面。mmLaunch的Threads列中正在运行的所有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命令的输出信息。File|Close Interface将删除界面窗口,但求解器保持运行。在mmLaunch中取消选择Threads列表中的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”将设置求解器的四种运行状态之一。在暂停状态下,求解器处于空闲状态,等待进一步的指示。如果选择了步进,则求解器将向前迭代一次,然后暂停。在弛豫模式下,求解器至少运行一个步进,然后运行直到到达阶段的末尾,此时求解器将暂停。在运行模式下,求解器将运行直到问题结束。手动输出在所有模式下都可用;计划输出会随着步进和阶段数的推进而输出。

进度控制按钮正下方有两个显示框,分别显示输入文件的名称和当前运行状态。Status栏下方是阶段显示和控制栏。通过拖动滚动条或在滚动条左侧的文本显示框中键入所需的阶段数字,就可以随时更改模拟阶段。有效的阶段数字是从0到N−1的整数,其中N是MIF文件指定的阶段数字。

细节

模拟模型由输入文件中的指定块Specify控制。因此,模拟的所有方面都由Oxs_Ext类设置,有关模拟和计算的详细信息,请参阅相应的Oxs_Ext类的文档。

7.2 OOMMF可扩展批处理求解器界面:boxsi。

学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章_第2张图片

概述

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终止时,向其他程序发送关闭请求。tags参数应该是输入MIF文件中的目标列表(由目标命令Destination声明),或是参数all,表示所有目标标签。

-logfile logname将日志和错误信息写入logname文件。默认的日志文件是oommf/boxsi.errors。

-loglevel level控制日志信息的详细级别,值越大,输出越多。默认值为1。

-nice<0 | 1>如果启用(即1),则程序将在启动后降低调度优先级。默认值为0,即保留其原始调度优先级。

-nocrccheck<0 | 1>在模拟重新启动时,通常将原始MIF文件的CRC与重新启动文件中的CRC进行比较。如果CRC不匹配,则会抛出一个错误,提醒用户MIF文件已更改。如果此选项已启用(即1),则CRC将被禁用。

-numanodes此选项在具有NUMA功能的计算机上可用。nodes参数必须是以逗号分隔的、0以上的节点数字列表、或“auto”或“none”。在第一种情况下,这些数字指的是内存节点,这些数字作为单个参数在命令行上传递,因此要么确保参数列表中没有空格,要么使用引号包裹空格,例如,-numanodes 2,4,6或-numanodes“2,  4,  6”。线程按顺序以循环方式分配给节点调度。用户可以将所有系统节点分配给Boxsi进程,也可以将Boxsi限制在内存节点的子集上运行,这样,用户可以为其他进程(或Boxsi的其他实例)保留特定的处理核心,因系统而异,通常每个内存节点都有多个处理核心。如果参数选择了“auto”,则线程将被分配给整个内存节点列表中的固定序列节点。如果参数选择“none”,则线程不会通过Boxsi绑定到节点,而是由操作系统分配。在最后一种情况下,随着时间的推移,操作系统可以在处理器之间自由分配线程。在另外两种情况下,在Boxsi实例的生命周期内,每个线程都绑定到一个特定节点。另请参见Boxsi文档中关于线程注意事项的讨论。

nodes的默认值是“none”,它允许操作系统根据系统总体使用情况分配线程,这也是计算机不支持NUMA时的行为。另一方面,如果一台机器主要用于运行一个Boxsi实例,那么如果线程数设置为机器上处理核心的数量,并且节点设置为“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应该是一个包含偶数个参数的列表,对应名称+值对。每个“名称”必须在输入文件里面的参数语句中出现,必须引用整个名称+值列表,以便作为命令行上的单个参数传给Boxsi。例如,如果A和Ms出现在MIF文件的参数语句中,那么可以这样设置参数: -parameters "A 13e-12 Ms 800e3"

-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参数是要运行的线程数,默认数值由config/platforms/平台名称 中的oommf_thread_count设置,但可能会被环境变量OOMMF_THREADS或有关的命令参数选项覆盖。在大多数情况下,线程默认数值等于系统上处理核心数量,可以通过命令tclsh oommf.tcl +platform查询。

miffile加载并解决miffile中的问题,该文件必须为MIF 2格式,或通过mifconvert程序转换为该格式。该参数是必须指定的。

虽然从mmLaunch无法启动Boxsi,但mmLaunch为Boxsi提供了受限的图形交互界面,方式与Oxsii相同。每个正在运行的Boxsi程序实例都包含在mmLaunch的Threads列表中,并带有一个复选按钮,此按钮用于切换用户界面窗口的显示开关。

输入

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中取消选择Threads列表中的Boxsi按钮来实现此效果。File|Clear Schedule将禁用当前所有的输出计划,就像用户手动单击output 和destination,并禁用每个计划输出复选框一样。最后一个File | Exit Oxsii将终止Oxsii求解器并关闭界面窗口。请注意,没有File|Load菜单项,必须在Boxsi命令行上指定问题文件。

Help菜单提供了常用的帮助工具。

菜单栏下方有一行控制模拟进度的按钮。一旦加载问题文件后,“Run”、“Relax”、“Step”和“Pause”按钮就会被激活,这些按钮允许用户更改求解器的运行状态。在暂停状态下,求解器处于空闲状态,等待进一步的指示如果选择了步进,则求解器将向前迭代一次,然后暂停。在弛豫模式下,求解器至少运行一个步进,然后运行直到到达阶段的末尾,此时求解器将暂停。在运行模式下,求解器将运行直到问题结束。当问题结束时,求解器将暂停或退出,具体取决于-exitondone命令行选项的设置。

通常,求解器会自动从初始化进入运行模式,但这可以通过-pause命令行参数选项进行更改。手动输出在所有模式下都可用;计划输出会随着步进和阶段数的推进而输出。状态控制按钮正下方有三个显示框,显示输入文件的名称、当前运行状态和当前阶段/最大阶段数目,两个阶段数均从0开始。

细节

和Oxsii一样,模拟模型由输入文件中的指定块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启动两个计算程序,“auto”选项会将线程分配给从固定序列的内存节点,因此两个计算程序将分配给相同的节点。相反,用户应该手动分配节点,为每个计算程序分配不同的节点集合。例如,可以使用-numanodes 0,1启动第一个计算程序,使用-numanodes 2,3启动第二个计算程序。在分配节点时需要记住的一点是,一些节点对比其他节点对“更好”(关于内存延迟和带宽)。例如,存储器节点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_ImageAtlas

Oxs_MultiAtlas                                        Oxs_ScriptAtlas

Oxs_EllipsoidAtlas

•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容器。

在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_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对象中使用,以指定多层结构中的区域。

image标签指定要使用的图像文件的名称。如果是相对文件路径,那么它将与包含该MIF文件的目录相关。图像文件格式可以是any2ppm识别的任何格式,如果文件是P3或P6 PPM格式,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” 区域除外,它包括由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,因此任两种颜色之间的距离最多为√3。

如上所述,如果两种颜色之间的距离小于指定的matcherror值,则认为它们是匹配的。如果“最大颜色距离”(max_color_distance)足够小,则容易导致像素的颜色与colormap指定的任何颜色都不匹配的情况,从而该像素将被指定给默认区域。另一方面,如果“最大颜色距离”(max_color_distance)大于√3,则将匹配所有颜色,并且不会为默认区域分配任何像素。如果未指定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, 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.

Oxs_EllipsoidAtlas

定义一个轴平行于坐标轴的椭圆体区域。这个功能可以通过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脚本的示例。

7.3.2网格。

网格定义了模拟的离散化单元格。在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)半个step。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类相同。周期轴值应该是由一个或多个字母“x”、“y”或“z”组成的字符串,表示周期方向。与Oxs PeriodicRectangularMesh不兼容的Oxs Ext对象将在运行时发出错误消息。特别是,Oxs Demag类支持无周期性或单向周期性,但不支持更多。此外,一些第三方扩展使用旧的Oxs RectangularMesh类而不是Oxs PeriodicRectangularMesh提供独立的周期性支持。

示例文件:pbcbrick.mif, pbcstripes.mif.

7.3.3能量。

以下小节描述了在微磁模拟中可用的能量项。为了在模拟中包含能量和场计算,每个能量项必须在自己的顶级Specify指定块中声明,不要在其他Oxs_Ext对象里边内联声明能量项,MIF文件中没有限制声明的能量项数量。这些能量项中有很多随空间变化的参数,这些参数是在其初始化块中通过field_object_spec设置。

输出:对于每种磁化配置,每个能量项都提供三个标准输出:标量输出“Energy”,即该能量项贡献的总能量(焦耳),标量场输出“Energy density”,即每个单元格的能量密度(J/m3),以及有三个分量的矢量场输出“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是晶体各向异性常数(单位:J/m3),Ha是各向异性场(单位:A/m)。无论哪种情况,axis都是各向异性的方向。K1、Ha和axis可以随单元格变化:K1和Ha使用标量场对象初始化,axis使用矢量场对象初始化。(通常,常量值表示具有该值的均匀场对象。)每个点的axis必须不为零,并且axis在使用前将标准化为单位大小。

如果K1(或Ha)大于0,则axis为易轴,在这种情况下,单元格的各向异性能量密度(单位:J/m3)由下式给出:

(mi是单元格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是晶体各向异性常数(单位:J/m3),Ha是各向异性场(单位:A/m)。无论哪种情况,axis1和axis2是各向异性的两个方向,第三个各向异性轴u3由矢量积u1×u2确定。对于每个单元格,如果K1(或Ha)大于0,则轴方向为易轴;如果K1(或Ha)小于0,则轴方向为难轴。这些参数都可以随单元格变化。K1和Ha使用标量场对象初始化,axis使用矢量场对象初始化。(通常,常量值表示具有该值的均匀场对象。)axis1和axis2必须相互正交,且在每个点处都不为零(u1和u2在使用前会自动缩放为单位大小)。单元格i的各向异性能量密度(单位:J/m3)由下式给出:

学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章_第3张图片

式中,a1=m·u1,a2=m·u2,a3=m·u3,单元格i处的约化(归一化)磁化强度m和正交的各向异性轴u1、u2和u3。在第二种形式中,Ms是单元格i中的饱和磁化强度。对于每个单元格,如果K1(或Ha)大于0,则计算的能量将为非负,若K1(或Ha)小于0,计算的能量将为非正。

示例文件:cgtest.mif, sample2.mif, grill.mif.

• Exchange Energy(交换能)

Oxs_Exchange6Ngbr

标准6邻域交换能。单元格i的交换能量密度由下式给出:

其中Ni是由离单元格i最近的6个单元格组成的集合,Aij是单元格i和j之间的交换系数,单位为J/m,△ij是单元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同样的值。其他未分配区域的Aij则使用默认交换系数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所述。

示例文件:sample.mif, cgtest.mif, stdprob3.mif.

Oxs_ExchangePtwise

交换系数Ai是在逐点(或逐单元格)的基础上指定的,而不是Oxs_Exchange6Ngbr使用的成对的指定方法。单元格i的交换能量密度是通过6个最近的Ni计算的,使用以下公式:

式中,△ij是从单元格i到单元格j的离散化步长,单位为米,以及

如果Ai和Aj为0,则Aij,eff  = 0。注意,Aij,eff  满足以下式子:

学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章_第4张图片

此外,如果Ai和Aj为非负,

用这个Aij,eff 的公式计算交换能,相当于在假设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 sign

}

surface2 { 

atlas atlas_spec

region region_label

scalarfield scalarfield_spec

scalarvalue fieldvalue

scalarside sign

}

}

sigma和sigma2是二次和四次界面(界面)交换能,单位为J/m2。两者都是可选的,默认值为0。

surface1和surface2块指定了两个相互作用的界面。每个界面的代码格式由5个名称-值对组成,顺序必须按所示的列出。在每个子块中,atlas_spec指定一个容器,region_label指定该容器中的一个区域,这两项限制了所需界面的范围。scalarfield、scalarvalue和scalarside项定义了边界区域内的离散化界面。scalarfield_spec引用标量场对象,fieldvalue是浮点数,sign是单个字符,可以是“-”或“+”。如果sign为“-”,若空间中一个点的标量场对象的值小于或等于scalarvalue,则该点被视为界面的“内部”。相反,如果sign为“+”,则标量场对象的值大于或等于scalarvalue的点都被视为界面的“内部”。定义的离散化界面是mesh网格上位于边界区域的所有点的集合,这些点要么位于界面上,要么位于界面的“内部”,并且有一个(最近的)邻点位于界面的“外部”。“邻点”由mesh网格确定;在典型的矩形网格中,每个单元格有六个相邻的单元格。

通过这种方式,可以获得代表两个界面的两个离散单元格列表。然后,第一个列表中的每个单元格(代表surface1)与第二个列表中最近的单元格(即surface2)匹配。注意这个匹配过程中的不对称性:第一个列表中的每个单元格恰好只有一个匹配,但第二个列表中可能有些单元格包含在多个匹配对中,或者没有匹配的单元格。如果两个界面的尺寸不同,那么在实践中,通常较小的界面将作为第一个界面,会减少单元格的多重匹配,但这个条件不是必须的。

一个界面上的单元格i与另一个界面上的匹配的单元格j产生的交换能密度如下所示:

其中σ和σ2分别是两个界面之间的二次和四次交换系数,单位为J/m2,mi和mj是单元格i和j归一化单位的自旋(即磁化方向),而△ij是从单元格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_TwoSurface Exchange还提供三个标量输出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对象的公式(1)计算交换能量。每对单元格的Aij值在问题初始化时确定,之后保持不变。A_lower_bound和A_upper_bound可以是任何实数,负值可以用来减弱由其它交换能项引起的交换作用。取值问题的唯一的限制是下限A_lower_bound不能大于上限A_upper_bound,linkprob概率值必须在[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,15]和通过快速傅里叶变换的卷积来计算每个单元格中的平均退磁场。如果MIF文件中的网格对象是Ox_RectangularMesh类,那么此类支持非周期模拟;如果是Oxs_PeriodicRectangularMesh类时,那么支持沿一个轴方向进行周期模拟,但不支持多个方向的周期模拟。Specify指定块的形式如下:

Specify Oxs_Demag:name { 

asymptotic_radius radius

}

用于计算退磁解析公式的核心计算量大,而且在大的偏移范围下不准确。在偏移量大于radius(以单元格为单位)时,将会使用渐近近似。如果未指定asymptotic_radius渐近半径,则使用默认值32。对于非周期模拟,将“radius”设置为-1会导致在所有偏移处使用解析公式。示例文件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(译者注:B=µ0*H)。

除了标准能量和场输出,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}的子列表。如果没有设置script_args脚本参数,则默认参数列表是按上述顺序排列的完整列表,即{ stage  stage_time  total_time}。时间参数的单位是秒。

脚本的返回值应该是有6个元素的列表,{Hx,Hy,Hz,dHx,dHy,dHz},表示外加磁场和外加磁场对时间的导数。对于模拟的每个阶段时间内,外加磁场作为时间的函数必须是可微的,但模拟的阶段之间可以不连续。对于模拟使用的是时间演化器的情况,需要外加磁场对时间的导数值很准确,否则演化器将无法正常工作。这个问题的导致的常见错误是时间演化步进错误。

外加磁场和外加磁场对时间的导数在使用前会乘以倍数multiplier,将会以A/m为单位;如果Tcl脚本返回的是以T为单位的磁场,那么用1/µ0的值multiplier(约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个元素的列表。

type 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}

}

使用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_offiles }

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方向上产生的磁场为2×104 A/m,其余方向为0。$stage是阶段索引,该处为0,1,…10。例如,如果$stage为5,则样本的左半部分将看到一个指向右侧的2×104 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-range。

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演化器。

演化器负责从一个步进(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是有效场,γ(—)是朗道-利夫希兹旋磁比,α是阻尼常数。吉尔伯特形式:

式中,γ是吉尔伯特旋磁比,在数学上的等价关系式为γ=(1+α2)γ(—)。

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(2)、(3)中的参数相同,其中γ(—)和γ的单位为m/A·s,α无量纲。只需指定γ(—)和γ其中的一个,如果两者均未指定,则默认值为γ=2.211×105。(由于(2)、(3)中的γ(—)和γ使用了绝对值,Specify指定块中gamma_LL 和gamma_G值是与符号无关的。)α的默认值为0.5,与实验值相比,虽然该值较大,但可以使模拟快速收敛到平衡状态。然而,对于精确的动力学研究,仍需要为α指定适当的值。

do_precess的值precess应为1或0,表示是否使用Landau-Lifshitz ODE中的进动项(即方程(2)中右侧的第一项)。如果precess为0,则将禁用进动项,模拟将沿着向平衡方向最陡的下降路径演化。precess默认值为1。

min_timestep和max_timestep参数为演化器使用的步进大小进行了软限制。如果需要更小的步长来满足基于时间的停止标准,那么驱动器可以覆盖最小值。如果该尺寸的步长会产生一个在数值上无法与前一状态区分的磁化状态,则最大值将被忽略。min_timestep最小时间步长和max_timestep最大时间步长的单位是秒。默认值分别为0和10−10。

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处的归一化(即单位)磁化强度mi(t),以及时间t+Δt处的磁化强度mi(t+△t),估计位置i处的误差:

其中,m(●)是使用Landau-Lifshitz ODE(2)对时间求导计算的。一阶方法假设m(●)在区间[t,t+△t]内基本上是常数;那么上述公式使用区间端点处的m(●)的差值来评估该假设的错误程度。

如果任意位置i处的最大误差小于absolute_step_error, error_rate ×∆t和relative_step_error × |m(●)max|∆t,则接受该候选步进,其中|m(●)max|是任意i在时间t时|m(●)i|的最大值。如果该步进不被接受,则重新计算出一个较小的步长直到通过上述测试,并利用较小的步长乘以step_headroom(步长余量)来得到一个新的候选步进。如果接受了该新的候选步进,则通过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:单元格里面的总能量密度,单位为J/m3。

矢量场输出:

•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(2)、(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参数用于模拟测试,仅供高级用户使用。文献中关于γ的符号并没有统一的规定,因此,上面(2,3)的Landau-Lifshitz-Gilbert方程使用了γ的绝对值。如果allow_signed_gamma为0(默认值),则表示使用γ的绝对值;如果将allow_signed_gamma设置为1,则表示Landau-Lifshitz-Gilbert方程不使用γ的绝对值,即γ带有符号,在这种情况下,γ的默认值为−2.211×105(单位为m/A·s)。在不使用γ的绝对值时,如果γ为正,则自旋将围绕有效场向后进动,阻尼项将迫使自旋远离有效场,并且总能量增加。如果用户试验中的γ>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方法,比较区间的中点和终点处的m(●)来管理步长控制,类似于Oxs_EulerEvolve类的步长控制。rk2方法的一个步进需要计算两次m(●)。

在rk4方法中,(nominal step)名义步进的一半由两个连续步进组成,并比较名义步进得到的终态与一个步进获得的终态之间的差异,使用这两种状态之间最大差值的1/15作为误差评估。rk4方法的一个步进需要计算11次m(●),最终结果需要两个一半大小的步进。

其余的rkf54、rkf54m和rkf54s方法,与由Dormand和Prince导出的Runge-Kutta-Fehlberg方法联系紧密。在有关论文中,rkf54实现RK5(4)7FC,rkf54m实现RK5(4)7FM,rkf54s实现RK5(4)7FS。以上的都是全局的五阶,四阶步长控制方法。这些方法中每个被接受的步进需要计算6次m(●),被拒绝的则需要计算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的默认值为10−10。若eprecision为-1,则会禁用energy_precision参数。Oxs_RungeKuttaEvolve类提供与Oxs_EulerEvolve相同的标量、标量场和矢量场输出。

示例文件:sample.mif, acsample.mif, varalpha.mif, yoyo.mif.

Oxs_SpinXferEvolve

时间演化器集成了带有自旋角动量项的Landau-Lifshitz-Gilbert ODE:

(与(3)相比),其中

学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7-7.3.4章_第5张图片

(译者注:reduced magnetization(约化磁场强度),Gilbert gyromagnetic ratio(吉尔伯特旋磁比),electron polarization direction(电子极化方向))

在β的式子中,电子的电荷e是以C为单位,电流密度J是以A/m2为单位,自由层厚度t是以米为单位,饱和磁化强度Ms是以A/m为单位。

Oxs_SpinXferEvolve的各种参数在Specify指定块中定义,它是Oxs_RungeKuttaEvolve类的扩展:

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的单位为A/m2。正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∂m/∂x,其中x是电流方向,△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和count的默认值分别为80度和50度。

一旦选择了一个最小化方向,首先需要在最小化路线上把最小值能量使用括号括起来,即在给定路线上选择一个起始点(上一条最小化路线上的最小值能量的位置)和该路线上的另一个点,使最小值能量位于这两个点之间。当其中一个点沿着最小化路线移动时,模拟的自旋会转动,其中一个自旋的转动比其他转动得快(或至少和其他转动得一样快)。如果起始点不是前一个正确的最小化路线的结果,那么将调整第一个括号设想的步进,以便让移动得最快的自旋来转动由参数minimum_bracket_step指定的角度。在更常见的情况下,起始点是前一个最小化路线阶段的能量最小值,于是把初始括号设想的步进设置为当前最小化路线的起始点和前一个最小化路线的起始点之间的距离。

在候选括号点处检查能量和能量梯度,以测试能量最小值是否在区间内。如果不在,将根据第一个括号设想的区间大小和区间端点处能量的导数来扩大区间。继续这一过程,直到能量最小值被括号括起来,或者移动得最快的自旋转动由参数maximum_bracket_step指定的角度。如果成功的将最小值能量使用括号括起来,则利用能量和能量导数在区间内得到一维最小化能量。此过程中的每个步进都会减小括号区间的宽度。继续该过程,直到路线方向和计算出的能量梯度之间的角度在参数line_minimum_angle_precision正交度范围内,并且相对于起点(即前一个路线最小化过程的停止点)的区间宽度小于line_minimum_relwidth。停止点,即有效最小值,被视为具有较小能量的最终区间的端点。min_prec_angle的默认值为1度,relwidth的默认值为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.

你可能感兴趣的:(自旋电子学(微磁学),自旋电子学,微磁学,OOMMF,oommf教程)