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

 穷且益坚,不坠青云之志。——王勃 《滕王阁序 》

# 前言

这是oommf软件教程《OOMMF User’s Guide》的中文翻译文章,由于本人水平有限,有些翻译可能有错误,望见谅。

在前面的翻译文章和这里的第10章中,“步进”和“步长”两个词出现的频率有点高,本人在翻译过程中也感觉很困惑╮(╯﹏╰)╭,,遇到这些情况请参阅原文。本人翻译的“步进”对应原文中的“step”单词,“步长”对应原文中的“step size”单词,这两个单词的出现频率如下:

“step”单词除了显而易见的“第几步“的意思外,我理解为一个步进,做动词时表示在某个过程中前进或后退一步;“step size”理解为一个步长,表示过程的多少,例如“时间步长”表示一个指定范围内的时间段,“距离步长”表示一个确定了长度的距离段。


目录

10 2D微磁求解器

10.1 2D微磁交互求解器:mmSolve2D。

10.2 OOMMF 2D微磁求解器批处理系统。

10.2.1 2D微磁求解器批处理界面:batchsolve。

10.2.2 2D微磁求解器批处理系统。

11数据表显示:mmDataTable

12数据图显示:mmGraph

13矢量场显示:mmDisp

14数据存储:mmArchive

15文档查看器:mmHelp


######

本文链接:https://blog.csdn.net/qq_43572058/article/details/123093178

CSDN@搬砖工人_0803号

######

10 2D微磁求解器

OOMMF 2D微磁计算引擎mmSolve能够求解在二维网格上定义的三维自旋的问题。与Oxs求解器相比,它更古老,灵活性和可扩展性更低,因此鼓励用户尽可能使用Oxs求解器。

mmSolve提供了两个接口:mmSolve2D和可与OOMMF批处理系统结合使用的,使用命令行驱动的batchsolve。

mmSolve的求解的微磁问题定义在MIF 1.1格式的输入文件中。请注意,此格式与Oxs求解器使用的较新的MIF 2.x格式不兼容,但是,可利用mifconvert程序把文件从MIF 1.1格式转换为MIF 2.1格式。

mmSolve还接受MIF 1.2格式的文件,前提是CellSize条目满足x和y尺寸相同且z尺寸等于(样品)零件厚度的限制。

关于Tk依赖性的注意事项:如果加载了使用位图掩码文件的微磁问题,若该掩码文件不是PPM P3(文本)格式,则mmSolve2D将启动any2ppm子程序来转换该文件的格式。由于any2ppm需要Tk支持,因此在读取掩码文件时,必须提供有效的显示程序。参考any2ppm文档了解详细信息。

10.1 2D微磁交互求解器:mmSolve2D。

概述

mmSolve2D程序是一个微磁计算引擎,能够解决在二维网格上定义的三维自旋的问题。在OOMMF架构中,mmSolve2D既是服务器又是客户端程序。mmSolve2D是微磁问题服务器程序、数据表显示程序和存储程序以及矢量场显示和存储程序的客户端。mmSolve2D是求解器的控制服务的服务器,其唯一的客户端是mmLaunch。正是通过这项服务,mmLaunch为mmSolve2D提供了一个界面窗口(如上图所示)。

启动

可以通过mmLaunch上的mmSolve2D按钮启动mmSolve2D,也可以通过命令行启动:

tclsh oommf.tcl mmSolve2D [standard options] [-restart <0|1>]

- restart<0 | 1> 在加载新的微磁问题时控制求解器的行为,默认值为0。使用-restart 1启动时,求解器将查找basename.log和basename*.omf文件,从最后一次保存的状态中重新运行。(其中basename是MIF 1.1微磁问题文件中指定的“Base Output Filename”)。如果找不到这些文件,则会发出警告,求解器会从头求解微磁问题(-restart 0)。指定的-restart设置会应用到求解器的所有微磁问题,而不仅仅是第一个微磁问题。(目前没有手动方式来更改此参数的值。)

由于mmSolve2D本身不提供任何用户界面窗口,因此它依赖mmLaunch为其提供界面。mmLaunch的Threads列中正在运行的所有mmSolve2D实例旁都有一个复选按钮,此按钮用于切换界面窗口的显示开关,用户可以通过该窗口控制mmSolve2D程序实例,它的用户界面窗口为mmSolve2D的输入(Inputs)、输出(Outputs)和控制(Controls)提供控制面板。

输入

通过切换Inputs复选框,可以打开和关闭用户界面窗口的顶部面板。打开时,Inputs面板显示两个子面板,左侧子面板包含mmSolve2D所需输入的列表。列表中只有一项:ProblemDescription,选中ProblemDescription后,右侧子面板(名为Source Threads)将显示可提供微磁问题的子程序列表,用户需要从列出的子程序中选择一个提供微磁问题给mmSolve2D。

输出

当mmSolve2D有可控制的输出时,用户界面窗口中会出现“Scheduled Outputs”复选框,切换Scheduled Outputs(计划输出表)复选框可在用户界面窗口中打开和关闭底部面板。打开时,“Scheduled Outputs”面板包含三个子面板,“Outputs”子面板中列出了mmSolve2D在计算微磁问题时可以生成的输出类型,此列表中的三个选项是:“TotalField”表示总有效场的矢量场输出;“Magnetization”表示当前磁化状态的矢量场输出;“DataTable”用于表格方式输出数据值,该表格包含mmSolve2D计算的其他的结果值。

从Outputs中选择一种输出类型后,Destination Threads子面板中会出现一个程序列表,里面列出了为所选输出类型提供显示或存储的子程序,用户可以从该列表中选择接受所选输出类型的程序。

对于选定的每个子程序,将在Schedule子面板中显示最终界面。通过该界面,用户可以设置输出计划,将指定类型的数据发送到选定的程序以显示或存储。输出计划是基于mmSolve2D中的事件描述的,求解ODE的每一步都会产生一个Iteration(迭代)事件,每当求解器确定到达控制点时,就会产生ControlPoint(控制点)事件。(控制点事件在第17.1节MIF 1.1文件的Experiment parameters中介绍,它由求解器平衡态、模拟时间和迭代次数触发。)每当在运行时单击“Interactive Outputs”控制面板中的输出类型按钮时,就会产生Interactive事件。Interactive输出计划能使用户以手动方式强制将数据发送到选定的显示和存储程序。对于Iteration和ControlPoint事件,输出的次数由用户控制。例如,用户可以选择以每迭代ODE 25次后将描述当前磁化状态的矢量场数据发送到mmDisp来显示。

mmSolve2D生成的DataTable输出中包含的结果值有:

•Iteration:ODE求解器的迭代次数。

•Field Updates:ODE求解器计算有效场的次数。

•Sim Time (ns):经过的模拟时间。

•Time Step (ns):ODE求解器的上一个步进的模拟时间(时间步长)。

•Step Size:ODE求解器的上一个步长的归一化后的大小。(即当前的时间步长(以秒为单位),乘以旋磁比,乘以阻尼系数,乘以Ms。)

•Bx、By、Bz(mT):外加磁场的x、y和z分量。

•B(mT):外加磁场的大小(始终为非负)。

•|m x h |:所有自旋中 ||M\times H_{eff}||/M_s^2 的最大值。该“转矩”值用于测试收敛到平衡状态(并引起控制点的–torque事件)。

•Mx/Ms、My/Ms、Mz/Ms:样品中有磁性的区域内的平均磁化强度的x、y和z分量。

•Total Energy(J/m^3):样品中有磁性的区域内的总平均能量密度。

•Exchange Energy(J/m^3):样品中有磁性的区域内的平均能量密度的交换能分量。

•Anisotropy Energy(J/m^3):样品中有磁性的区域内的平均能量密度的各向异性能分量。

•Demag Energy(J/m^3):样品中有磁性的区域内的平均能量密度的退磁能分量。

•Zeeman Energy(J/m^3):样品中有磁性的区域内的平均能量密度的塞曼能分量。

•Max Angle:网格中任意一对相邻自旋之间的最大角度(以度为单位)。(自旋的邻域与计算交换能定义的邻域相同。)

此外,求解器会自动保存一个日志文件,用于记录输入的问题和其他运行时信息。此日志文件的名称为basename.log,其中basename是输入的问题中指定的“Base Output Filename”。若该文件已经存在,则会将新日志追加到该文件的末尾。

控制

用户界面窗口的中间面板包含一系列按钮,供用户控制求解器。当指定微磁问题服务器子程序后,单击LoadProblem按钮会从所选服务器获取微磁问题,可以随时单击LoadProblem按钮从当前选定的服务器(重新)加载微磁问题。加载新问题后,求解器会自动进入暂停状态。(如果在未指定微磁问题服务器程序时单击LoadProblem按钮,则不会发生任何事情。)Reset按钮的操作类似,不过它是继续使用当前的微磁问题。

加载问题后,可以让求解器处于三种状态中的任意一种:“Run”、“Relax”、“Pause”。“Relax”会使求解器处于“弛豫”状态,在该状态下,求解器将一直运行,直到到达控制点,然后求解器暂停。如果在到达控制点后重新点击“Relax”按钮,则求解器将立即重新暂停,用户必须单击Field+或Field–按钮来更改外加磁场的状态。“Run”的不同之处在于,当到达控制点时,求解器会自动将外加磁场步进到下一个状态值,并继续运行。在“Run”模式下,求解器将持续运行,直到微磁问题中没有外加磁场的更多状态。可以随时单击“Pause”按钮来暂停求解器,求解器将保持此状态,直到用户重新单击“Run”或“Relax”按钮。用户界面窗口中心面板的Status中显示求解器的当前状态。

微磁问题(MIF 1.x格式)使用一个固定计划的外加磁场,该计划定义了一个有序的外加磁场列表,求解器在“Run”模式下按顺序在列表中步进。按钮Field–和Field+允许用户以手动方式调整外加磁场的顺序,每次单击Field+按钮都会在指定的计划中向前步进一步,而Field–按钮则相反。通常,步进方向与外加磁场的幅度无关。还要注意,点击这些按钮不会生成“控制点”事件。特别是,如果正在手动加速求解器通过循环外加磁场的进度,并且希望在更新磁场之前将非控制点数据发送到显示或存储程序,则必须恰当的使用“Interactive Output”中按钮。

控制面板中的第二行按钮TotalField、Magnetization和DataTable允许用户随时查看求解器的当前状态。这些按钮使求解器将相应类型的数据发送到所有已选中“Interactive”复选框的程序,如上面的输出部分所述。

面板最右侧是Exit按钮。要终止求解器,必须按Exit按钮。

细节

给定一个微磁问题,mmSolve2D集成了Landau-Lifshitz方程

其中,M是该点的磁化强度(A/m),Heff是该点的有效场(A/m),\bar{\gamma } 是朗道-利夫希兹旋磁比(m/(A·s)),α是阻尼系数(无量纲)。有效场的定义为:

平均能量密度E是布朗方程中M的函数,包括各向异性能、交换能、自静磁(退磁)能和外加磁场(塞曼)能项。

微磁问题表示在规则的2D正方形网格上,3D磁化自旋位于单元格的中心。请注意,“用方形组成网格”的约束条件优先于网格请求的大小,计算中使用的网格实际大小将是单元格的大小与请求大小的最小整数倍。比较具有不同单元格大小的网格要考虑整个网格大小的可能变化。

各向异性和外加磁场能量项是在假设每个单元格中的磁化强度都是恒定的情况下计算的。利用参考文献[6]中所述的八邻双线性插值法,并结合Neumann边界条件,来计算交换能。更常见的四邻法的方案可在编译时指定。详细信息可在源代码文件oommf/app/mmsolve/magelt.cc中找到。

自静磁场是磁化强度与描述单元格之间静磁相互作用的内核的卷积计算的,卷积使用快速傅里叶变换(FFT)进行计算。支持多个内核,这些内核是MIF 1.x格式描述的微磁问题的一部分,有关详细信息,请参考第17.1.2节:Demag specification。每个内核代表了不同的离散磁化,推荐使用的模型是ConstMag,它假设每个单元格中的磁化强度是恒定的,并使用参考文献[23]和[2]中的公式计算穿过单元格的平均退磁场。

Landau-Lifshitz ODE(10.1)是采用Adams类型的二阶预测-校正技术集成的。方程(10.1)的右端在当前和上一个步进中是以线性方式演化的,并在新的时间区间内积分,以获得下一时间步进里M的二次预测。在计算能量和有效场之前,每个阶段的自旋都被重新归一化为Ms。使用预测的M对方程(10.1)的右端进行计算,然后将预测的M与当前步进里的值相结合,并在新区间内产生dM/dt的线性插值,然后对其进行积分,以获得新步进中M的最终估计值。此方法的局部(一个步进)误差是 O(\Delta t^3)

如果系统总能量降低,且预测的与最终的M值之间的最大误差小于标称值,则可接受该步进。如果步进被拒绝,则减小步长并重复积分过程。如果步进被接受,则预测的和最终M之间的误差用于调整下一步进的大小。假设上一个时间步长和当前时间步长没有固定的比值。

四阶Runge-Kutta求解器用于初始化预测-校正求解器,并在预测-校正器未能找到有效步进时作为备选方法。在运行时不能选择Runge-Kutta求解器作为主求解器,但可以在编译时通过定义宏RUNGE_KUTTA_ODE来选择使用该求解器。参考oommf/app/mmsolve/grid.cc了解详细的集成过程。

对于给定的一个外加磁场,将持续积分到一个控制点。ODE迭代次数、经过的模拟时间或 ||M\times H_{eff}||/M_s^2 的最大值下降到指定控制点(——转矩值)以下(表示已达到平衡状态),这些都会产生控制点事件。

根据磁体系的大小,mmSolve2D运行时可能需要大量的内存。确切的数量取决于许多因素,大约为5 MB+每个单元格1500字节,例如,用5nm单元格离散的1µm×1µm样品将大约需要62MB。

已知的Bugs

mmSolve2D要求阻尼系数为非零。参考MIF 1.1文档中阻尼系数的详细说明。

当使用多个mmLaunch副本时,每个副本都有自己的界面显示运行中的mmSolve2D。当在一个mmLaunch副本的界面中设置mmSolve2D的输出计划时,这些设置不会同步到其他mmLaunch副本的界面。例如,只在第一个mmLaunch界面里设置了一个输出计划,每隔三次迭代将数据表数据发送到mmGraph,但在第二个mmLaunch界面中没有向用户显示该计划。通常很少同时运行多个mmLaunch副本,但是,当使用一个mmLaunch副本加载问题并启动求解器,然后使用第二个mmLaunch副本监视正在运行的求解器的状态时,也会出现此错误(即两个界面不同步)。

10.2 OOMMF 2D微磁求解器批处理系统。

OOMMF批处理系统(OBS)以和mmSolve2D相同计算引擎的三个Tcl程序(batchmaster、batchslave和batchsolve)为复杂的计算调度提供了支持。所有OBS脚本文件都位于OOMMF的app/mmsolve/scripts目录中。

与大多数OOMMF包不同,OBS主要由命令行或shell(批处理)脚本驱动。OBS程序使用引导程序从命令行启动。

10.2.1 2D微磁求解器批处理界面:batchsolve。

概述

batchsolve程序为OOMMF 2D 微磁计算引擎提供了一个简单的命令行界面。

启动

batchsolve程序由命令行启动:

tclsh oommf.tcl batchsolve [standard options]

[-end_exit <0|1>] [-end_paused] [-interface <0|1>] \

[-restart <0|1>] [-start_paused] [file]

-end_exit <0|1> 是否在batchsolve.tcl运行结束后退出该程序。从命令行启动时,默认情况是file中的微磁问题求解完成后再退出的。当batchsolve是另一个脚本启动的,比如batchslave.tcl,默认情况下是等待调用程序的指示。

-interface <0|1> 是否向帐户服务目录程序注册,以便mmLaunch可以提供交互界面。默认值=1(注册),这将根据需要自动启动帐户服务目录和主机服务目录程序。

-start_paused 加载微磁问题后暂停求解器。

-end_paused 暂停求解器,并在batchsolve.tcl运行结束后进入事件循环。(其效果取决于Tk是否加载)

-restart <0|1> 确定加载新微磁问题时求解器的行为。如果为1,则求解器将查找basename.log和basename*.omf文件,从最后一次保存的状态重新运行。(其中basename是MIF 1.1微磁问题文件中指定的“Base Output Filename”)。如果找不到这些文件,则会发出警告,求解器会从头开始求解微磁问题(-restart 0)。指定的-restart设置适用于输入到求解器的所有微磁问题文件,而不仅仅是第一个微磁问题文件。

file 立即加载并运行指定的MIF 1.x文件。

输入文件file应该是包含1.x格式的微磁问题,如mmProbEd生成的文件。批处理求解器会为该文件搜索多个目录,包括当前工作目录、data和scripts子目录,以及与app/mmsolve和app/mmpe相关的目录。参考batchsolve.tcl文件中的mif_path变量查看完整的目录列表。

如果将-interface设置为1(已启用),batchsolve将在帐户服务目录程序注册,并且mmLaunch会提供一个手动交互界面,batchsolve的界面和mmSolve2D有类似的控制方式,允许用户暂停、取消暂停和终止当前模拟,以及添加监控求解器进度的显示程序。如果需要更多手动控制,则应使用mmSolve2D。

如果-interface为0(已禁用),则batchsolve不会注册,于是它没有手动交互界面。如果batchsolve是由另一个脚本程序(如batchslave.tcl)启动的,那么它将为batchsolve提供一个界面。

使用选项-start_paused将从模拟一开始就监视batchsolve的进度。使用此选项,在加载指定的MIF文件后,求解器将立即暂停,因此用户可以在模拟开始之前打开交互界面并分配显示程序,在交互界面单击Run按钮来启动模拟。如果禁用了-interface,则无法使用此选项。

-end_paused 选项确保求解器在完成指定的模拟后不会自动终止。该功能通常用处不大,但可用于Tcl包装器脚本中启动batchsolve时帮助它找到该程序。

关于Tk依赖性的注意事项:如果加载了使用位图掩码文件的微磁问题,若该掩码文件不是PPM P3(文本)格式,则batchsolve将启动any2ppm子程序来转换该文件的格式。由于any2ppm需要Tk支持,因此在读取掩码文件时,必须提供有效的显示程序。参考any2ppm文档来了解详细信息。

输出

Tcl包装器脚本可以更改输出,但batchsolve的默认输出行为是为每个外加磁场步进到控制点处写入表格文本数据和磁化状态。表格数据会被追加到basename.odt文件中,其中basename是输入MIF 1.x文件中指定的“Base Output Filename”。参考batchsolve.tcl文件中的GetTextData例程了解详细信息,目前的输出包括求解器迭代次数、外加磁场B、归一化平均磁化强度m和总能量,输出为ODT格式。

磁化数据会被写入到一系列的OVF(OOMMF矢量场)文件中,名称为basename.fieldnnnn.omf,其中nnnn从0000开始,并在每个外加磁场步进处递增。(每个文件内的ASCII文本标题记录了该步进中的外加磁场。)这些文件可以使用mmDisp查看。

求解器还会自动将输入的微磁问题和其他运行时信息追加到日志文件basename.log。

Programmer’s interface

除了从命令行直接启动batchsolve,batchsolve.tcl也可以被其他提供额外控制的Tcl脚本启动。在OBS系统的调度中,batchsolve.tcl可以被batchslave调用,batchslave由batchmaster调度控制。batchsolve.tcl文件里面有些变量和函数可以被包装器脚本访问和重新定义,以增强它的功能。

Global variables(全局变量)

mif 即mms_mif全局对象的Tcl句柄,持有输入MIF 1.x文件定义的微磁问题。

solver 即mms_solve对象的Tcl句柄。

search_path 即FindFile函数使用的搜索路径。

有关操作这些变量的详细信息,请参考源代码和示例脚本。

Batchsolve procs(Batchsolve的函数)

以下Tcl函数是为了被外部使用或重新定义而设计的:

SolverTaskInit 在每个任务开始时调用。

BatchTaskIterationCallback 在模拟中的每次迭代后调用。

BatchTaskRelaxCallback 在模拟中到达每个控制点后调用。

SolverTaskCleanup 在每个任务结束时调用。

FindFile 在全局变量search_path指定的目录中搜索指定的文件。默认的SolverTaskInit函数使用此方法寻找请求的输入MIF文件。

SolverTaskInit和SolverTaskCleanup接受任意的参数列表(args),接着会把args复制到batchsolve.tcl文件中的BatchTaskRun和BatchTaskLaunch函数。通常,用户会将默认函数(根据需要)复制到任务脚本中,并进行适当的修改。用户可以在使用batchsolve.tcl文件之前或之后(重新)定义这些函数。参考10.2.2.4节的示例脚本。

10.2.2 2D微磁求解器批处理系统。

概述

OBS支持使用batchmaster和batchslave两个程序对多个批处理计算进行复杂的调度。用户启动batchmaster并为其提供任务脚本,该任务脚本是一个Tcl脚本,描述了batchmaster要完成的一组任务。这些任务实际上是由batchmaster启动的batchslave完成的,任务脚本可以参考simpletask.tcl或者multitask.tcl示例脚本。

OBS用于控制多个连续和并发微磁模拟,但batchmaster和batchslave是通用的,可用于调度其他类型的计算。

10.2.2.1主调度控制:batchmaster

从命令行启动batchmaster程序:

tclsh oommf.tcl batchmaster [standard options] task_script \

[host [port]]

task_script 是用户定义的任务(作业)Tcl脚本,

host 指定主机要使用的网络地址(默认为localhost),

port 是主机的端口地址(默认为0,即使用任意一个打开的端口)。

运行batchmaster时,它会获取任务脚本,在任务脚本中使用Tcl命令修改全局对象$TaskInfo,以通知主机要执行哪些任务,以及如何启动从机来执行这些任务。创建任务脚本的最简单方法是修改第10.2.2.4节中的一个示例脚本。更多详细说明见第10.2.2.3节。

在获取任务脚本后,batchmaster启动所有指定的从机,并用从机初始化脚本来初始化每个从机,然后按顺序将任务从任务列表传递给从机。当从机完成一项任务时,它会向主机报告,并获取下一个未处理的任务。如果没有任务了,则从机将被关闭。当所有任务都完成后,主机会打印任务摘要并退出。

当任务脚本请求在本地计算机上启动和控制作业,而从机在远程计算机上运行时,则必须将命令行参数host设置为本地计算机的网络名称,并且需要从任务脚本内部调用$TaskInfo对象的AppendSlave和ModifyHostList方法。此外,OOMMF目前不提供任何在远程计算机上启动作业的方法,因此请求在远程机器上启动作业的任务脚本需要一个可用的ssh命令或等效命令。参考10.2.2.3节了解详细信息。

10.2.2.2任务控制:batchslave

可以通过命令行启动batchslave程序:

tclsh oommf.tcl batchslave [standard options] \

host port id password [auxscript [arg ...]]

host, port 即用于提供服务的主机和端口。

id, password 即发送给主机进行识别的ID和密码。

auxscript arg ... 即可选脚本的名称(该脚本实际执行从机分配的任务)及其所需的参数。

在正常操作中,用户不会启动batchslave,batchslave是由batchmaster按照任务脚本的指示启动的。尽管batchmaster可以启动由任务脚本所请求的任意类型的从机,但默认情况下,它会启动batchslave。

batchslave的功能是连接主机,获取auxscript,并将参数列表aux_arg传递给auxscript。。。。然后,它从主机接收命令,利用auxscript提供的工具对其进行解析并执行。执行每个命令通常需要很长的时间,如完整的求解一个微磁问题。每个命令完成后,batchslave会向其主机报告,并请求获取下一个命令。当主机没有发送更多命令时,从机将终止。

在batchmaster内部,batchslave的每个实例都是通过Tcl命令来启动的,该命令称为spawn命令,可以由任务脚本重新定义,以便完全控制启动哪些从机以及如何启动。需要启动batchslave时,使用的spawn命令为:

exec tclsh oommf.tcl batchslave -tk 0 -- $server(host) $server(port) \

$slaveid $passwd batchsolve.tcl -restart 1 &

Tcl命令exec用于启动子进程,若exec的最后一个参数为&时,则子进程将在后台运行。spawn命令的其余部分对应由命令行启动batchslave的语法。

然而,上面示例任务脚本的spawn命令是不完整的,因为命令的一部分参数只有batchmaster知道,因此,任务脚本应该使用“百分号变量”替换有关变量来定义spawn命令。即任务脚本的spawn命令为:

exec %tclsh %oommf batchslave -tk 0 %connect_info \

batchsolve.tcl -restart 1

batchmaster会用tclsh的路径替换%tclsh,用oommf引导程序的路径替换%oommf。它还将%connect_info替换为从 --到$password的五个参数,这些参数为batchslave提供了batchmaster的主机名和端口,以及它应该传回的ID和密码。在本例中,任务脚本指示batchslave启动batchsolve.tcl并将参数-restart 1传递给它。最后,batchmaster总是将参数&附加到spawn命令,以便在后台启动所有从机。

batchmaster和batchslave之间的通信协议正在更新,此处不作描述。查看源代码以了解最新的详细信息。

10.2.2.3批处理任务脚本

程序batchmaster创建一个名为$TaskInfo的BatchTaskObj对象,任务脚本调用此对象的方法来设置要执行的任务。必须调用的方法是AppendTask,例如,

$TaskInfo AppendTask A "BatchTaskRun taskA.mif"

这个方法需要两个参数,一个是任务的标签(这里是“A”),另一个是完成任务的脚本。脚本将通过网络套接字从batchmaster传递到从机,然后由从机解释脚本,注意,脚本看到的文件系统是运行从机的机器上的文件系统。

本例使用batchsolve.tcl中的默认函数运行taskA.mif文件,如果需要动态更改MIF文件的内容,则需要修改默认函数,这可以通过调用创建的从机初始化脚本来完成:

$TaskInfo SetSlaveInitScript { <insert script here> }

从机的初始化脚本会进行全局初始化,并且通常会重新定义SolverTaskInit函数,也可以选择重新定义BatchTaskIterationCallback、BatchTaskRelaxCallback和SolverTaskCleanup函数。在每个任务开始时,SolverTaskInit被BatchTaskRun调用(在batchsolve.tcl里面),在每次迭代后调用BatchTaskIterationCallback,在每个控制点调用BatchTaskRelaxCallback,在每个任务结束时调用SolverTaskCleanup。BatchTaskRun会给SolverTaskInit和SolverTaskCleanup传递参数。一个简单的SolverTaskInit函数:

proc SolverTaskInit { args } {

global mif basename outtextfile

set A [lindex $args 0]

set outbasename "$basename-A$A"

$mif SetA $A

$mif SetOutBaseName $outbasename

set outtextfile [open "$outbasename.odt" "a+"]

puts $outtextfile [GetTextData header \

"Run on $basename.mif, with A=[$mif GetA]"]

}

此函数的参数列表接受此任务的变量A(交换系数),并使用了全局变量mif和basename。(二者都应该在SolverTaskInit函数之外的从机初始化脚本中初始化。)接着把A值保存在mif对象中,设置用于输出的基本文件名称,并打开一个文本文件,把表格数据追加到该文件中。此文本文件的句柄保存在全局变量outtextfile中,该文件默认由SolverTaskCleanup函数关闭。相应的任务脚本将A设置为 13\times 10^{-12} J/m:

$TaskInfo AppendTask "A=13e-12 J/m" "BatchTaskRun 13e-12"

本例取自第10.2.2.4节中multitask.tcl文件。(有关mif对象接受的命令,请参考文件mmsinit.cc。另一个可以进行更多操作的对象是solver,它在solver.tcl中定义)

如果希望一次运行多个任务,则必须调用对象$TaskInfo的AppendSlave方法。即如下形式:

$TaskInfo AppendSlave <spawn count> <spawn command>

其中,<spawn command>是启动从机的命令,<spawn count>是使用此命令启动的从机数量。(通常<spawn count>不多于目标系统上的处理器数量。)<spawn count> 和<spawn command>的默认值(第一次调用$TaskInfo AppendSlave时会覆盖该值)为:

1 {Oc_Application Exec batchslave -tk 0 %connect_info batchsolve.tcl}

Tcl命令Oc_Application Exec是OOMMF提供的,该命令和OOMMF引导程序具有相同的程序启动功能。<spawn command>使用Oc_Application Exec而不是exec %tclsh %oommf可以避免生成额外程序。默认的<spawn command>会启动batchslave程序,并附带batchmaster提供的连接信息。将附加脚本auxscript选项设置为batchsolve.tcl。

在命令<spawn command>执行之前,batchmaster在启动从机的脚本中使用了几个百分号样式的变量:%tclsh, %oommf, %connect info, %oommf root, 和%%。第一个是要使用的Tcl shell程序,第二个是主机上OOMMF引导程序的绝对路径,第三个是batchslave程序所需的连接信息,第四个是主机上OOMMF根目录的路径,最后一个为单个百分号。batchmaster会自动将参数&附加到<spawn command>中,以便让从机在后台启动。

若要在远程主机上启动batchslave,需要在spawn命令中使用ssh,例如:

$TaskInfo AppendSlave 1 {exec ssh foo tclsh oommf/oommf.tcl \

batchslave -tk 0 %connect_info batchsolve.tcl}

本例假设tclsh位于远程机器foo的执行路径中,并且它的OOMMF安装在home目录之外。此外,必须使用以下命令将foo添加到主机连接列表中:

$TaskInfo ModifyHostList +foo

batchmaster必须使用指定的网络接口运行,并作为服务器(不是默认的localhost),例如:

tclsh oommf.tcl batchmaster multitask.tcl bar

其中bar是本地机器的名称。

这似乎有点复杂,详细信息请看下一节中的示例。

10.2.2.4任务脚本示例

# FILE: simpletask.tcl

#

# This is a sample batch task file. Usage example:

#

# tclsh oommf.tcl batchmaster simpletask.tcl

#

# Form task list

$TaskInfo AppendTask A "BatchTaskRun taskA.mif"

$TaskInfo AppendTask B "BatchTaskRun taskB.mif"

$TaskInfo AppendTask C "BatchTaskRun taskC.mif"

Figure 10.1: Sample task script simpletask.tcl.

第一个任务脚本示例(Figure 10.1),它运行3个MIF 1.x格式的微磁文件taskA.mif, taskB.mif及taskC.mif,它是通过命令启动的:

tclsh oommf.tcl batchmaster simpletask.tcl

本例使用默认的从机启动脚本,因此在当前机器上只会启动一个从机,3个模拟将按顺序运行。此外,没有提供从机初始化脚本,因此使用batchsolve.tcl中的默认函数。输出将是每个控制点的磁化状态和表格数据,这些数据保存在本地机器上的文件中,这些文件的名称为MIF文件中指定的基本名称。

# FILE: octrltask.tcl

#

# This is a sample batch task file, with expanded output control.

# Usage example:

#

# tclsh oommf.tcl batchmaster octrltask.tcl

#

# "Every" output selection count

set SKIP_COUNT 10

# Initialize solver. This is run at global scope

set init_script {

# Text output routine

proc MyTextOutput {} {

global outtextfile

puts $outtextfile [GetTextData data]

flush $outtextfile

}

# Change control point output

proc BatchTaskRelaxCallback {} {

MyTextOutput

}

# Add output on iteration events

proc BatchTaskIterationCallback {} {

global solver

set count [$solver GetODEStepCount]

if { ($count % __SKIP_COUNT__) == 0 } { MyTextOutput }

}

}

# Substitute $SKIP_COUNT in for __SKIP_COUNT__ in above "init_script"

regsub -all -- __SKIP_COUNT__ $init_script $SKIP_COUNT init_script

$TaskInfo SetSlaveInitScript $init_script

# Form task list

$TaskInfo AppendTask A "BatchTaskRun taskA.mif"

$TaskInfo AppendTask B "BatchTaskRun taskB.mif"

$TaskInfo AppendTask C "BatchTaskRun taskC.mif"

Figure 10.2: Task script with iteration output octrltask.tcl.

第二个任务脚本示例(Figure 10.2)建立在前一个示例的基础上,它在从机的初始化脚本中定义BatchTaskIterationCallback和BatchTaskRelaxCallback函数。第一个函数表示每10次迭代写入表格数据,第二个函数表示在每个控制点事件上写入表格数据。数据被写入到由输入MIF文件中的Base Output Filename指定的输出文件。注意,本例中没有磁化矢量场输出。此任务脚本的启动方式与上一个示例相同:

tclsh oommf.tcl batchmaster octrltask.tcl

第三个任务脚本(Figure 10.3)是在两台机器上并发运行的更复杂示例。此脚本通过命令运行:

tclsh oommf.tcl batchmaster multitask.tcl bar

其中bar是本地机器的名称。

在multitask.tcl脚本的顶部定义了几个Tcl变量(从RMT_MACHINE 到A_list);这些变量在脚本的下面部分使用。用变量RMT_MACHINE表示远程机器foo,在$TaskInfo AppendSlave 和$TaskInfo ModifyHostList命令中用到了该变量。

接着脚本里使用了两个AppendSlave命令,一个用于在本地机器上运行两个从机,另一个用于在远程机器(foo)上运行一个从机。后者在远程机器上启动batchslave程序之前会按要求更改工作目录。(要使其正常工作,必须正确配置ssh。)

接着定义了从机初始化脚本。Tcl命令regsub用于将任务脚本中定义的BASEMIF的值放入初始化脚本中。当第一次启动从机时,会在从机上运行初始化脚本。它首先将MIF文件读入到新创建的mms_mif对象中。(MIF文件需要从机获取,无论从机在哪台机器上运行。)然后重定义SolverTaskInit和SolverTaskCleanup函数。新的SolverTaskInit函数的第一个参数表示交换常数A的值,注意,这与默认的SolverTaskInit函数不同,后者的第一个参数表示要加载的MIF 1.X文件的名称。使用此任务脚本,在启动从机时读取一次MIF文件,然后每个任务仅需要重新定义模拟的交换常数A的值(以及更改相应的输出文件的名称和数据表标题)。

最后是Tcl循环结构:

foreach A $A_list {

$TaskInfo AppendTask "A=$A" "BatchTaskRun $A"

}

用于建立一个任务列表,列表中的每个任务的A取值为A_list(在任务脚本的顶部定义的)中对应的值。例如,A的第一个值是10e-13,因此第一个任务的标签是A=10e-13的,相应的脚本是BatchTaskRun 10e-13。BatchTaskRun函数会把值10e-13传递给SolverTaskInit函数,SolverTaskInit函数已被重新定义,会把本函数的参数作为A的值,如上所述。

总共有6个任务和3个从机,因此前三个任务将在3个从机中同时运行。当每个从机完成时,它将被分配下一个任务,直到所有任务都完成。

# FILE: multitask.tcl

#

# This is a sample batch task file. Usage example:

#

# tclsh oommf.tcl batchmaster multitask.tcl hostname [port]

#

# Task script configuration

set RMT_MACHINE foo

set RMT_TCLSH tclsh

set RMT_OOMMF "/path/to/oommf/oommf.tcl"

set RMT_WORK_DIR "/path/to/oommf/app/mmsolve/data"

set BASEMIF taskA

set A_list { 10e-13 10e-14 10e-15 10e-16 10e-17 10e-18 }

# Slave launch commands

$TaskInfo ModifyHostList +$RMT_MACHINE

$TaskInfo AppendSlave 2 "exec %tclsh %oommf batchslave -tk 0 \

%connect_info batchsolve.tcl"

$TaskInfo AppendSlave 1 "exec ssh $RMT_MACHINE \

cd $RMT_WORK_DIR \\\;\

$RMT_TCLSH $RMT_OOMMF batchslave -tk 0 %connect_info batchsolve.tcl"

# Slave initialization script (with batchsolve.tcl proc

# redefinitions)

set init_script {

# Initialize solver. This is run at global scope

set basename __BASEMIF__ ;# Base mif filename (global)

mms_mif New mif

$mif Read [FindFile ${basename}.mif]

# Redefine TaskInit and TaskCleanup proc's

proc SolverTaskInit { args } {

global mif outtextfile basename

set A [lindex $args 0]

set outbasename "$basename-A$A"

$mif SetA $A

$mif SetOutBaseName $outbasename

set outtextfile [open "$outbasename.odt" "a+"]

puts $outtextfile [GetTextData header \

"Run on $basename.mif, with A=[$mif GetA]"]

flush $outtextfile

}

proc SolverTaskCleanup { args } {

global outtextfile

close $outtextfile

}

}

# Substitute $BASEMIF in for __BASEMIF__ in above script

regsub -all -- __BASEMIF__ $init_script $BASEMIF init_script

$TaskInfo SetSlaveInitScript $init_script

# Create task list

foreach A $A_list {

$TaskInfo AppendTask "A=$A" "BatchTaskRun $A"

}

Figure 10.3: Advanced sample task script multitask.tcl.

11数据表显示:mmDataTable

概述

程序mmDataTable为其客户端程序提供数据显示服务。它接受来自客户端的数据,这些数据以表格样式在顶级窗口中显示。mmDataTable常用于显示由微磁求解器计算得到的值。

启动

可以通过单击mmLaunch上的mmDataTable按钮启动mmDataTable,也可以从命令行启动mmDataTable:

tclsh oommf.tcl mmDataTable [standard options] [-net <0|1>]

-net<0 | 1> 禁用或启用服务,该服务允许由另一个程序更新mmDataTable显示的数据。默认情况下,服务处于开启状态。当服务被禁用时,只有当mmDataTable嵌入到另一个程序中时,才可以使用mmDataTable。

输入

客户端程序将数据发送到mmDataTable进行显示,客户端程序控制着数据流。用户可以通过与mmDataTable窗口交互,以便控制数据的显示方式。启动时,mmDataTable仅显示一个菜单栏。根据用户请求的数据,菜单栏下方的显示窗口将显示请求数据的值。

来自客户端的每条消息都包含一个由三元组(名称、值、单位)构成的列表,mmDataTable根据这个列表来显示数据。例如,列表中的一个元素是{Magnetization 800000 A/m}。mmDataTable会保存每个名称接收的最新值,当来自客户端的新数据到达时,早期的值将被丢弃。

输出

mmDataTable不支持任何数据输出或存储工具。要保存表格数据,需要使用mmGraph或mmArchive程序。

控制

菜单Data包含一个mmDataTable所有已接收数据的名称的列表。开始时,mmDataTable没有从客户端接收到任何数据,因此此列表为空。当客户端的数据到达时,会填充数据名称列表。列表中的每个数据名称旁边都有一个复选按钮,当复选按钮从off切换到on时,相应的数据名称及它的值和单位将在显示窗口的底部显示。当复选按钮从on切换到off时,相应的数据名称将从显示窗口中删除。这样,用户可以从所有接收数据中选择要显示的内容。单击菜单Data顶部的虚线可将菜单Data从菜单栏中分离,以便用户可以轻松单击多个复选按钮。

通过鼠标左键单击显示的数据条目,可以单独选择(或取消选择)显示的数据条目,当前选择的数据条目会用高亮来显示。菜单Options还包含选择或取消选择所有显示数据的命令。可以使用CTRL-c组合键或Options|Copy菜单命令将选定的数据复制到剪贴板中。

这种选择数据的机制还用于对数据值格式的控制。Options|Format菜单命令会弹出一个Format格式对话框,包含数据值的对齐和格式化显示的规范。格式化显示需要Tcl的format命令,该命令使用C printf格式代码。如果激活Adjust:Selected单选按钮,则该规范将仅应用于当前选定(高亮显示)的数据值。若激活Adjust:All,则该规范将应用于所有数据值,并且该规范将成为默认的数据显示规范。

在显示数据条目上单击鼠标右键将选中该条目,并打开Format格式对话框,其中包含所选条目的对齐方式和格式化显示规范,这些规范可以在修改后应用于所有选中的条目。

如果某个值无法使用所选格式规范进行显示,例如,如果对包含小数点的字符串应用了“%d”整数格式,则该值不使用其他任何格式,就只以mmDataTable接收到的格式并用红色显示。

菜单File|Reset会把mmDataTable重新初始化为其原始状态,清除显示的数据和Data菜单。收到求解器的数据集结束消息后,再次收到新数据时,也会自动调用重置操作。菜单File|Exit会终止mmDataTable。菜单Help提供了常用的帮助工具。

12数据图显示:mmGraph

概述

程序mmGraph提供的数据显示服务类似于mmDataTable,它的数据源通常是正在运行的求解器,mmGraph生成的不是mmDataTable的文本输出,而是2D点线图。mmGraph可以存储它接收到的数据,因此它可以生成数据的多个视图,并可以将数据保存到磁盘。mmGraph还支持Postscript输出。

启动

可以通过单击mmLaunch上的mmGraph按钮或通过命令行启动mmGraph:

tclsh oommf.tcl mmGraph [standard options] [-net <0|1>] [loadfile ...]

-net<0 | 1> 禁用或启用服务,该服务允许由另一个程序更新mmGraph显示的数据。默认情况下,服务处于开启状态。当服务被禁用时,mmGraph只能从文件中获取输入数据。

loadfile . . .要预加载的数据文件(ODT)列表。

输入

mmGraph的输入可以是ODT格式的文件,或当使用选项-net 1(默认值)时,输入可以来自客户端程序(通常是正在运行的求解器)。菜单File|Open显示的对话框用于选择输入文件。从客户端程序接收数据与在mmDataTable的情况一样。在这两种情况下,输入数据都会追加到之前保存的数据中。

从文件读取数据时,mmGraph会把“Nb InputFilter decompress”选项添加到Oc_Option(参考第2.3.2节本地化)来解析数据。有关详细信息,请参阅第13章mmDisp文档中输入部分的文件转化。

Curve breaks(曲线中断)(即,将曲线分割为不相交的段)通过curve break records在数据存储缓冲区中记录。每当mmGraph检测到新数据表时,或当用户使用mmGraph的菜单Options|Break Curves时,都会生成这些记录。

输出

与mmDataTable不同,mmGraph会把发送给它的数据缓存起来。可以通过菜单File|Save As打开的对话框把这些数据写入磁盘,如果指定的文件已经存在,则mmGraph会把输出数据追加到该文件,格式为ODT表格格式。数据在每条曲线中断记录处被分段,每段数据对应一个Table Start/Table End块。

默认情况下,mmGraph当前持有的所有数据都将被写入,但File|Save As菜单打开的对话框里有Save: Selected Data选项可以限制保存的内容,可以保存当前显示的曲线。无论哪种情况,图像显示的限制不会影响输出。

在菜单File|Save As打开的对话框里点击OK按钮时,会保存由mmGraph持有的记录。此外,此对话框中的Auto Save选项可用于把mmGraph接收到每个新数据记录自动追加到指定的文件中。追加的字段将是在保存操作时选择的字段,也就是说,更改后续显示的曲线不会影响自动保存操作。自动保存操作将一直持续,直到指定新的输出文件、使用菜单Options|Stop Autosave或终止mmGraph程序。

菜单File|Print打开的对话框用于生成当前图形的Postscript文件。在Unix系统上,可以使用适当的pipe命令(例如| lpr)填充Print to:条目,将输出直接发送到打印机。(具体形式取决于系统。)

控制

通过从X轴菜单中选择任意一项,以及从Y1轴和Y2轴菜单中选择任意数量的条目来构建图形,y1轴在图形的左侧,y2轴在右侧,可以通过选择列表顶部的虚线来从菜单栏分离这些菜单,示例如本节开头的图所示。

首次启动mmGraph时,所有轴菜单均为空,轴菜单是基于mmGraph接收到的数据动态构建的。默认情况下,会根据数据自动设置图形的范围和标签。使用所选条目数据的标签和测量单位(如果有)来设置x轴标签。y轴标签是第一个选定的y轴条目对应的测量单位。

用户可以在菜单Options|Configure打开的对话框里覆盖默认设置。若要更改图形的标题,只需在Title中输入所需的标题。若要设置轴的标签,则需要取消选择此对话框中的Auto Label选项,并根据需要填写X标签、Y1标签和Y2标签。轴的限制可以用类似的方式设置。此外,如果轴限制为空,将使用默认值(基于所有选中的数据)。选择Auto Scale选项,会自动调整轴的范围以显示传入的数据。

使用Auto Offset Y1 和Auto Offset Y2将沿着指定轴自动向上或向下平移绘制的每条曲线,以便曲线上第一个点的y值为0(线性轴)或1(对数轴)。此功能对于比较不同能量曲线之间的变化特别有用,因为对于这些曲线来说,用户通常感兴趣的是值的变化过程,而不是能量值本身。

默认情况下,每个轴的缩放是线性的。Log scale axes复选框可对选定的轴使用对数缩放。如果选择了对数缩放,则会删除任何具有零值的点,并将负值替换为其相应的正绝对值。

自动计算图形周围区域的页边距大小。可以填写Margin Requests中的相应字段来指定更大的页边距,单位是像素,且会忽略小于自动计算得到的值(默认值)的请求值。

初始曲线宽度由config/options.tcl 和config/local/options.tcl文件中的Ow_GraphWin default_curve_width确定,用户可以遵循第2.3.2节本地化的常用方法进行修改。当前曲线宽度可以通过菜单Options|Configure打开的对话框中的Curve Width来修改,单位是像素。如果Curve Width设置为1,则长曲线的渲染速度会更快,尤其是在Windows系统中。

如前所述,mmGraph将接收到的所有数据缓存在内存中。从长远来看,存储的数据量可能会增长到兆字节。用户可在菜单Options|Configure打开的对话框中,为Point buffer size指定正值(>0)来限制它的存储,则会根据需要删除最旧的记录,使存储的记录总数保持在指定的限制下。若Point buffer size为0,则表示没有存储限制。(单个记录的存储大小取决于几个因素,包括记录中的条目数和使用的Tcl版本。)数据的擦除可能不会立即影响图形的显示。在任何时候,缓存在内存中的所有数据都可以使用菜单命令Options | clear Data完全清空。如果当前处于自动保存状态,菜单命令Options|Stop Autosave将关闭自动保存功能。

菜单Options|Rescale,可根据所选数据自动缩放图形的轴。此命令会忽略但不重置菜单Options|Configure打开的对话框中的Auto Scale条目。按键盘上的Home键也可以调用Rescale命令。

菜单Options|Break Curves将一个曲线打断记录插入到点缓冲区,会打断当前点之后的每条曲线。如果mmGraph有多个数据来源,则此选项可能很有用。

菜单Options|Key可打开和关闭key(图例)的显示。也可以通过拖动鼠标左键来重新放置该key。如果从y1和y2菜单中同时选择了曲线,则key中会用水平线将两组曲线分开,y1曲线的标签会位于顶部。

如果启用了Options|Auto Reset,则当检测到新表格时,所有不在新数据集的列表中的旧的轴菜单中的标签及其关联数据将被删除。当收到新的结果数据或从文件中输入数据时,mmGraph将检测新表格,如果未启用Options|Auto Reset,则不会删除数据或轴菜单中的标签,轴菜单将显示旧的列标签列表和新的列标签列表的并集。如果轴菜单过长,用户可以手动使用菜单命令File|Reset来清除它们。

Options菜单上的最后一个选项是Options|Smooth。如果禁用平滑,则数据点之间通过直线段连接。如果启用平滑,则每条曲线将渲染为抛物线曲线,这样的曲线通常没有穿过数据点。曲线平滑功能是在Tcl的 canvas create line命令中使用--smooth 1选项实现的;有关详细信息,请查阅该文档。

mmGraph的少部分控制功能只有通过鼠标才能使用。如果鼠标指针位于图形中绘制的曲线上,按住Control键和鼠标左键将显示该点y1轴的坐标。同样,按住Control键和鼠标右键,或者按住鼠标左键的同时按住Control+Shift键,将显示该点y2轴的坐标。显示的坐标是绘制的曲线上某个点的坐标,而不一定是数据点的坐标。(在每条线段的端点上绘制数据点。)当按住Control键并不按鼠标按钮时,会清除坐标显示。

mmGraph还提供了一个垂直和一个水平标尺(线)。开始时,这些标尺分别隐藏在左侧和底部的坐标轴上,可以使用鼠标左键或右键拖动它们来重新放置,拖动标尺时会显示光标的坐标。如果使用鼠标左键拖动,则显示的y坐标对应于y1轴;如果使用鼠标右键或鼠标左键+Shift键,则显示的y坐标对应于y2轴。

用户可以通过鼠标选择“缩放框”来更改图形范围,有助于更详细地检查图形。点击并拖动鼠标左键或右键可激活此功能,拖动鼠标时,将显示一个大小会变化的矩形。如果使用鼠标左键拖动,则会重新调整x轴和y1轴的比例,使其与显示矩形的范围相匹配。如果使用鼠标右键或shift键+鼠标左键,则会重新缩放x轴和y2轴。矩形上有一个箭头,指示重新缩放哪个y轴。在释放鼠标按钮之前,可以通过拖动鼠标使之回到初始点,以便取消图形缩放。mmGraph的鼠标缩放控制功能和mmDisp类似,不过mmDisp没有“取消缩放”的功能。每次缩放的得到的坐标限制规则都存储在一个列表中,可以按Esc或Shift+Esc键分别在该列表中前后移动,按Enter/Return键会把当前坐标限制规则复制到列表中。指针将保持指向选定的显示配置状态,并在该点之后添加新状态,如果在列表内部添加了一个显示状态(在最后一个状态之前),则会删除新条目之后的所有配置状态,每当调用自动缩放时,整个列表都会被清空。

PageUp和PageDown键也可用于放大和缩小显示,与Shift键结合会使用更大的缩放步进,或与Control键结合可进行更精细的控制(即更小的缩放步进)。菜单命令Options|Rescale或在Options|Configure打开的对话框里也可重置图形范围。

如果使用mmGraph显示来自求解器的数据,并且选中了Options|Configure打开的对话框中的Auto Scale选项,则当接收到新数据时,会自动更改图形范围,这对于用户正在手动使用缩放功能来检查图形时很不方便。在这种情况下,用户可能更希望禁用自动缩放功能,并使用键盘上的方向键手动地平移图形。每按一次方向键都会将图形沿指示方向平移半帧,若结合Shift键使用,则会使平移步长加倍,若结合Control键则会使平移步长减半。

菜单File|Reset会将mmGraph重新初始化为其原始状态,清除所有数据和轴菜单。菜单File|Exit会终止mmGraph程序。菜单Help提供了常用的帮助工具。

细节

轴菜单会根据输入数据来配置。因此,这些菜单最初是空的。如果图形显示程序仅在求解器的控制点或阶段完成事件时接收数据,那么在求解器开始运行之后,可能需要很长时间才能配置图形显示程序。mmGraph将所有数据保持在点缓冲区大小(Point buffer size)的范围内,所以通常会丢失一些数据,更重要的是,在收到第一个数据之前,无法设置数据自动保存功能。不过,有一种解决方法,即在求解器的初始状态时,手动发送一个虚拟数据(dummy)到mmGraph,用于初始化轴菜单,接着在轴菜单中选择需要显示的量,并使用菜单命令Options|clear Data从mmGraph的内存中删除该虚拟数据,最后选中File|Save As打开的对话框里的Auto Save选项,这样就可以在文件中写入包含正确列标题信息的空表,随后的到达的数据也写入在文件中。

13矢量场显示:mmDisp

概述

程序mmDisp可以显示分布在三维空间的矢量场在二维空间的切片(平面图)。mmDisp目前支持显示一维(即标量)和三维矢量数据。它可以从各种数据格式的文件中加载数据,也可以从客户端程序(如正在运行的求解器)接收数据。mmDisp提供了丰富的界面来控制矢量场数据的显示,还可以将数据保存到文件或生成PostScript打印输出。

启动

可以单击mmLaunch上的mmDisp按钮来启动mmDisp,也可以通过命令行:

tclsh oommf.tcl mmDisp [standard options] [-config file] \

[-net <0|1>] [filename]

-config file 用户配置文件,里面有默认显示参数。下面将详细讨论该文件。

-net<0 | 1> 禁用或启用服务,该服务允许由另一个程序更新mmDisp显示的数据。默认情况下,服务处于开启状态。当服务被禁用时,mmDisp只能从文件中获取输入数据。

如果在命令行上设置了filename选项,则mmDisp将其视为要显示的矢量场文件的名称,该文件会在mmDisp启动时打开。

输入

mmDisp的输入可以来自文件,也可以来自客户端程序(通常是正在运行的求解器),矢量场数据的格式如第19章所述。如果格式转换的程序可用,也支持其他文件格式。

向mmDisp发送数据的客户端程序控制着输入数据流,用户可以通过与mmDisp窗口交互,以便控制矢量场数据的显示方式。

在File|Open打开的对话框里选择输入的文件,OOMMF的app/mmdisp/examples目录中包含了几个示例文件,启用该对话框里Browse按钮后,“Open File”对话框在加载文件后会保持打开的状态,以便用户顺序选择显示多个文件。在Auto栏目中可以将矢量子采样、数据刻度、缩放和切片设置为自动调整(基于文件中的数据和当前显示窗口大小),或在加载文件时保持其值不变(不勾选复选框)。

mmDisp允许本地自定义化,用于把其他文件格式自动转换为mmDisp可识别的矢量场格式之一,加载文件时,mmDisp会将文件名与列表里的扩展名进行比较。比如扩展名是 .gz,假设它是有特定格式的数据文件,对于列表中的每个扩展名,都有相应的转换程序,mmDisp把转换程序当做过滤器来使用,该过滤器从标准输入中获取一种格式的数据,并以mmDisp支持的一种格式将数据写进标准输出中。在默认配置中,mmDisp可以识别.gz、.z和.zip,并调用转换程序gzip -dc来执行“转换”,这样,在安装了gzip程序的任意平台上,mmDisp都相当于“内置”了读取压缩文件的功能。

支持两类转换:解压缩和格式转换。它们都可以通过第2.3.2节本地自定义中的常用方法进行修改,在自定义文件中控制解压缩的命令形式如下:

Oc_Option Add * Nb_InputFilter decompress {{.gz .zip} {gzip -dc}}

这个命令的最后一个参数是一个长度为偶数的列表。每个参数对的第一个元素是文件扩展名,每个参数对的第二个元素是用于启动相应转换程序的命令。若要添加对bzip2压缩文件的支持,则需将此行更改为:

Oc_Option Add * Nb_InputFilter decompress \

{{.gz .zip} {gzip -dc} .bz2 bunzip2}

此选项还影响其他支持“动态”解压缩的程序,如mmGraph。在任何情况下,解压缩程序都必须接受标准输入上的压缩输入,并将解压缩后的输出写到标准输出中。

对于外部的(即非OOMMF)文件格式,也提供输入转换支持。例如,假设程序foo可以把 .bar格式的文件转换为OVF文件格式,那么可以通过设置自定义命令使mmDisp调用该程序:

Oc_Option Add * Nb_InputFilter ovf {.bar foo}

程序foo接受标准输入上 .bar格式的输入,并将转换后的结果写进标准输出中。

输出

mmDisp显示的矢量场可以在菜单File|Save As打开的对话框里选择保存到磁盘,输出为OVF格式,在该对话框中可以选择OVF File Options栏目中的单选按钮来设置相应的OVF文件选项,可以在保存前编辑标题Title和描述Desc。选中Browse复选框可以保存多个文件,而不会关闭“Save File”对话框。

菜单File|Print打开的对话框用于生成当前图形的Postscript文件。在Unix系统上,可以使用适当的pipe命令(例如| lpr)填充Print to:条目,将输出直接发送到打印机。(具体形式取决于系统。)其他打印对话框的选项将在下面的配置文件部分介绍。

菜单File|Write config打开的对话框允许将包含当前显示参数的配置文件保存到磁盘,该文件可用于初始化mmDisp启动时的显示参数,或把该文件作为avf2ppm和avf2ps程序的输入,这两个程序分别将文件从OVF格式转换为位图图像和PostScript打印文件。(mmDisp不支持直接保存为位图文件。)后面将讨论配置文件的详细信息。

控制

菜单File|Clear会清除显示窗口。菜单File|Exit会终止mmDisp程序。菜单Help提供了常用的帮助工具。

菜单View控制矢量场在显示窗口中的视图设置。菜单View|Wrap Display会调整显示窗口的大小,使其仅包含由边距包围的整个矢量场视图。菜单View|Fill Display会调整矢量场视图的大小,直到矢量场视图填满当前大小的显示窗口。如果显示窗口的纵横比与矢量场视图的纵横比不匹配,则矢量场视图会在短边方向使用更大的页边距以弥补差异。菜单View|Center Display会平移矢量场视图,把矢量场视图放在显示窗口的中心。菜单View|Rotate ccw和View|Rotate cw分别把矢量场视图逆时针和顺时针旋转四分之一圈。如果矢量场视图的大小未锁定(参考下面的Options|Lock size),则显示窗口也会旋转,以便保留看到的矢量场和设置的所有页边距(控制栏的显示迫使显示窗口变宽的情况除外)。菜单View|reDraw允许用户重新绘制显示窗口。菜单View|Viewpoint的子菜单支持矢量场旋转,以便可以沿着不同的轴查看矢量场。

菜单Options|Configure会打开一个对话框,用户可以通过该对话框控制矢量场视图的许多显示参数。矢量场中的矢量可以显示为箭头、像素或两者都可以。使用该对话框左侧Plot type列中的Arrow和Pixel按钮可启用对应类型的显示方式。

配置对话框中的第2–4列控制颜色的使用。箭头和像素都可以单独着色,用于表示一定的数值。Color Quantity(颜色量)列控制箭头或像素的颜色所代表的标量数值。Color Quantity列中可代表的颜色量包括矢量的x、y和z分量、总矢量的幅度、切片的深度以及在平面内从固定轴测量的角度,若在规则的网格数据上,矢量场的散度也是可以显示的。

Colormap(颜色映射)决定一种颜色代表的(标)量。颜色映射表示把一系列颜色映射到指定的(标)量的范围内。例如,如果将颜色映射“Red-Black-Blue”应用于Color Quantity中的“z”,则指向xy平面(z<0)的矢量被渲染为红色,位于平面(z=0)中的矢量为黑色,指向平面外(z>0)的矢量为蓝色,极值之间的矢量则会用中间颜色着色,根据# of colors的值确定的离散化来分配中间颜色。# of colors的值限制了颜色资源的使用,并可用于实现某些特殊的着色效果。(注意:最好使用以相同颜色开始和结束的颜色映射平面内角度量,例如“Red-Green-Blue-Red”。译者注:即用色环(Colormap中最后两项分别是RGB和CMYK色环)来表示平面内的量(Color Quantity中xy/xz/yz-angle量)。)可以通过选择Reverse复选框反转颜色映射的顺序。例如,这会将“Red-Black-Blue”颜色映射更改为“Blue-Black-Red”。

在绘制类型pixel所在的行里,Reverse复选框的下面是一个Opaque复选框。如果勾选此项,则像素对象会覆盖像素切片范围下方的箭头。如果禁用此项,则像素对象是半透明的,下面的箭头对象是可见的。

当矢量场中有许多矢量时,同时显示所有矢量可能不太方便观察。Subsample列允许用户使用指定的采样率从矢量场中采样矢量,Subsample的值大致是矢量场中沿着一个空间维度映射到一个显示矢量(箭头或像素)的矢量数,显示的每个矢量都是矢量场中的实际矢量。从矢量场中选择要显示的矢量是一个采样过程,而不是平均或插值过程。箭头和像素的子采样率可以独立设置,若子采样率为0时,则表示显示所有数据。(这通常比较小的子采样率(例如0.1)快得多。)

箭头的长度表示矢量场的幅度大小,所有箭头的长度都在0到“满刻度”之间。默认情况下,满刻度箭头长度的计算方式是,在给定当前的子采样率的情况下,一个满刻度箭头会覆盖一个显示矢量的屏幕区域。按照此默认设置,箭头之间不会明显重叠,矢量场的所有非零部分的矢量也都能在屏幕中显示。类似地,在给定像素的子采样率的情况下,使用默认大小绘制像素,填充的区域为一个像素。Size列允许用户分别设置像素和满刻度箭头的默认大小,若为1,则表示默认大小。通过将Size设置为更大或更小的值,用户可以得到大于或小于默认大小的箭头或像素。

箭头的"Size”框下方是“View scale”选项。如果启用(默认),则调整箭头缩放,使得把Size设为1得到的平面内矢量的长度大约等于两个平面视图中视图单元较小的一个。(视图单元是单元格乘以子采样。)如果禁用“View scale”,则箭头大小将相对于三个视图单元中最小值进行缩放,这与视图轴无关。禁用自动子采样和View scale可以更容易比较不同视图轴的矢量场视图。

配置对话框里Arrow和Pixel的下面是几个额外的控制选项。Data Scale会影响数据值的比例,如上所述,显示的所有箭头的长度都在零和满刻度之间,满刻度箭头的长度和矢量场的幅度有关。Data Scale允许用户设置箭头的长度达到指定的满刻度值,矢量场中任何等于或大于Data Scale值的矢量都将用满刻度箭头绘制,其他矢量将由较短的箭头表示,其长度由零和Data Scale值之间的线性比列确定。类似地,Data Scale值控制着用于为像素着色的颜色映射的范围。Data Scale选项通常用于减少数据的值,以便可以看到更多的矢量场中幅值小于其他部分的矢量。如果增加Data Scale值,则图中箭头的长度会相应的减少。如果减小Data Scale值,则箭头的长度增加,直到达到满刻度。大于Data Scale值的矢量的则用一个箭头表示,视为被Data Scale值截断了。初始(默认)的Data Scale值通常为矢量场中的最大矢量的幅值,因此在默认设置下,箭头不会被截断。在Data Scale框中输入0,将会导致数据比例重置为默认值。(对于OVF文件来说,默认的数据比例值在ValueRangeMaxMag标题行设置的。它通常被设置为最大矢量的幅值。)对数据比例的控制主要用于变化的矢量场(例如,H场),但也可用于调整任意场的像素显示对比度。

Zoom 控制显示空间的缩放。该值大致对应于完全采样(即显示全部矢量)的矢量场中每个矢量的像素数量。(该值不受子采样率的影响。)

Margin 指定矢量场视图周围的页边距大小(以像素为单位)。

下一行控制选项是切片显示参数。切片允许根据距离垂直于视图轴的平面多远,来显示该数据子集(译者注:切片即矢量场沿着该视图轴前移或后移指定距离(即切片厚度,或者“视图深度”)得到的平面图)。该平面相对于视图轴的位置可以在X-slice center, Y-slice center 或Z-slice center条目中指定,具体取决于当前视图轴。在后面的Arrow span和Pixel span两个输入框中,对于箭头和像素显示来说,可以分别改变切片的厚度。这两个输入框有这些专用值:0表示将切片厚度重置为默认值,通常为一个单元格的厚度。任意负值都会将切片厚度设置为网格的完整厚度。所有切片控制选项的值都以基本的网格空间单位指定的,例如米。(参考第19章矢量场文件格式中有关网格空间单位的详细信息。)

切片控制选项的下面是用于指定是否显示边界框以及显示窗口的背景色的控制选项。

单击Apply或OK按钮,会把用户在菜单Options|Configure打开的对话框中的设置应用于显示窗口。如果单击了OK按钮,该对话框也将关闭。单击Close按钮会关闭对话框,但不会将对话框中的设置应用于显示窗口。

菜单Options|Configure的下方是一个Control Bar复选按钮,用于切换控制栏的显示。控制栏为Options|Configure打开的配置对话框和菜单View里面的一些控制选项提供了界面图标以便用户控制。控制栏的左端是坐标轴,坐标轴会和显示窗口中的矢量场一起旋转,以标识显示窗口的坐标系,坐标轴还会被染色,从而与像素或箭头的颜色一致。在坐标轴上单击鼠标左键会逆时针旋转坐标系。在坐标轴上单击鼠标右键会顺时针旋转坐标系。

坐标轴右侧有两行控制选项。第一行允许用户控制子采样率和显示箭头的大小,子采样率可以通过直接输入新的数值或通过移动滑块来修改。第二行控制当前数据比例和缩放,数据比例控制选项的滑块区域中的竖线表示默认的数据比例值,把数据比例值设置为0,则表示将把数据比例重置为默认值。

可以通过在控制栏的Zoom框中输入缩放值或在显示窗口内使用鼠标来放大空间。用鼠标左键单击并拖动会显示一个红色矩形,该矩形的大小会随着鼠标的拖动而变化,松开鼠标左键时,矢量场将重新缩放,并放大矢量场中位于红色矩形内的部分,直到到达显示窗口的边缘。两个方向上的缩放量相同,因此矢量场没有纵横失真。红色矩形里面的两个红色小箭头表示释放鼠标左键后,将放大哪个方向以填充显示窗口边界。重新缩放后,红色矩形将短暂停留在显示窗口中,包围住在新比例下矢量场的同一区域。

用鼠标右键单击并拖动会显示一个蓝色矩形,该矩形的大小会随着鼠标的拖动而变化,释放鼠标右键时,矢量场将重新缩放,以便显示窗口中当前可见的所有矢量场都在蓝色矩形内。两个方向上的缩放量相同,因此矢量场没有纵横失真。蓝色矩形里面的两个蓝色小箭头表示矢量场缩小的方向,用于把显示窗口的大小精确转换为蓝色矩形的大小。重新缩放后,蓝色矩形将短暂停留在显示窗口中,蓝色矩形会位于显示窗口的中心,包围住在新比例下矢量场的同一区域。

当缩放值足够大时,会让矢量场的一部分位于显示窗口之外,这时会出现可用于平移矢量场的滚动条,以便在显示窗口中看到其余部分的矢量场。在具有鼠标中键的系统上,在显示窗口中某个点上单击鼠标中键会平移矢量场,使该点位于显示窗口的中心。

mmDisp会记住以前的缩放值和数据比例值,若要恢复到前一个设置,用户可以按ESC键。不过这是一个受限的“撤销”功能。

在控制栏Data Scale和Zoom选项的下方是“切片中心选择”。这里可能为Z-slice、X-slice或Y-slice,具体取决于选择的视图轴。切片的厚度可以在菜单Options|Configure打开的对话框里设置。

菜单Options的最后一项是Options|Lock size复选按钮。默认情况下,当在平面内旋转图形时,会互换显示窗口的宽度和高度,以便仍保持显示相同部分的矢量场。勾选Options|Lock size复选按钮将禁用此行为,以及其他更改显示窗口的操作(例如,菜单View|Wrap Display)。

用户除了基于菜单或鼠标的控制选项外,还可以使用一些键盘快捷键。组合键的效果取决于mmDisp的哪个控制选项处于选中的状态,TAB键可用于切换正在选中的控制选项,SHIFT-TAB组合键会按相反顺序切换正在选中的控制选项。

在mmDisp中,以下组合键是可用的:

•CTRL-o–与菜单File|Open等效。

•CTRL-s–与菜单File|Save as等效。

•CTRL-p–与菜单File|Print等效。

•CTRL-c–与菜单Options|Configure等效。

•CTRL-v–打开Viewpoint选择菜单,与View|Viewpoint等效。

•CTRL-w–与菜单View|Wrap Display等效。

•CTRL-f–与菜单View|Fill Display等效。

•HOME–与先使用CTRL-f,再使用CTRL-w等效。(译者注:即先用矢量场视图填充满视图窗口,再裁剪视图窗口来包围住矢量场视图。)

•CTRL-space–与菜单View|Center Display等效。

•CTRL-r–与菜单View|Rotate ccw等效。

•SHIFT-CTRL-r–与菜单View|Rotate cw等效。

•INSERT–将Arrow Subsample值减1。

•DEL–将Arrow Subsample值加1。

•SHIFT-INSERT–将Arrow Subsample值减少2倍。

•SHIFT-DEL–将Arrow Subsample值增加2倍。

•PAGEUP–将Zoom值增加1.149倍。

•PAGEDOWN–将Zoom值减少1.149倍。

•SHIFT-PAGEUP–将Zoom值增加2倍。

•SHIFT-PAGEDOWN–将Zoom值减少2倍。

•ESC–将Data Scale和Zoom值恢复到以前的值。

当控制栏的坐标轴为激活状态时,以下组合键可使用:

•LEFT–与菜单View|Rotate ccw等效。

•RIGHT–与菜单View|Rotate cw等效。

当控制栏的任意数值输入选项(arrow subsample, size, data scale 和 zoom)处于选中状态时,以下组合键可使用:

•ESC–撤销未提交的值(用红色显示)。

•RETURN–提交输入的值。

当控制栏的任意滑块处于选中状态时(arrow subsample, data scale 和 slice),以下组合键可使用:

•LEFT–向左滑动(减小数值)。

•RIGHT–向右滑动(增大数值)。

•ESC–撤消未提交的值(用红色显示)。

•RETURN–提交当前值。

当显示焦点在对话框里面时(例如,File|Open或Options|Configure打开的对话框),快捷键CTRL- . 即CTRL键+“.”键将会把显示焦点移回mmDisp主窗口。

配置文件

各种初始的显示参数(例如,窗口大小、方向、颜色映射)由配置文件设置。先读取默认配置文件oommf/app/mmdisp/scripts/mmdisp.config,然后读取本地自定义文件(如果存在)oommf/app/mmdisp/scripts/local/mmdisp.config,最后读取命令行上的  -config选项指定的输入文件。显示配置文件必须是有效的Tcl脚本,其主要作用是设置plot_config和print_config数组的元素,默认配置文件如图13.1所示。(有关array set命令的详细信息,请参阅Tcl文档。)

配置文件中有几个指定颜色的地方。颜色可以使用oommf/config/colors.config中的符号名称来表示,也可以使用Tk支持的任何一种十六进制格式,例如#RRGGBB,或使用 “grayD”(或“greyD”)表示灰色阴影,其中D是0-100(包含0和100)的十进制整数。使用这两种格式表示颜色,例如用#FFFF00表示黄色,gray0表示黑色,gray100或#FFFFFF表示白色。

在讨论plot_config数组的每个元素时,请参考默认配置文件:

arrow,status 设置为1表示显示箭头,0则不绘制箭头。

arrow,autosample 如果为1,则忽略arrow,subsample的值,并自动确定子采样率。若为0则关闭此功能。

arrow,subsample 如果arrow,autosample为0,则在绘制箭头时按此采样率对输入矢量进行子采样。若arrow,subsample为0,表示为显示所有数据。

arrow,colormap 选择绘制箭头时要使用的颜色映射。取值对应菜单Options|Configure打开的对话框里的Colormap选项中的参数。

arrow,colorcount 颜色映射中的每一种颜色的离散化数量。若为0表示使用颜色映射中的第一种颜色为所有箭头着色。

arrow,quantity 箭头的颜色表示的标量。支持的标量包括x、y、z、xy-angle、xz-angle、yz-angle和slice。在Options|Configure打开的对话框里会显示支持的标量列表,标量列表与图像有关。

arrow,colorreverse 颜色反转的值应为1或0,分别表示反转或不反转。如果选择反转,则将反转颜色映射的顺序,例如将Blue-White-Red 改为Red-White-Blue。这对应于Options|Configure对话框里的Reverse控制选项。

arrow,colorphase 颜色相位是一个介于-1和1之间的实数,用于移动变换选定的颜色映射。对于颜色量xy-angle、xz-angle和yz-angle,设置的颜色相位会旋转颜色映射(色环),例如,将colorphase设置为0.333,会把颜色映射从Red-Green-Blue-Red改为Green-Blue-Red-Green。对于其他颜色量,它只是移动颜色映射中的显示宽度,使颜色会在一端达到饱和。例如,将colorphase设置为0.5,会把颜色映射Blue-White-Red改为White-Red-Red。如果同时设置了颜色反转和颜色相位,则首先使用颜色反转。

arrow,size 箭头相对于默认值(1.0)的大小。

arrow,viewscale 启用由视图单元确定的箭头的自动缩放。

pixel,. . .大多数的像素配置选项都和箭头配置选项类似,内容都是差不多的,除了pixel,opaque选项,下面会讨论它。还要注意的是,自动子采样的像素的比箭头更密集。

pixel,opaque 如果opaque为1,则以实心方式绘制像素,并隐藏绘制在像素下面的箭头。如果opaque为0,则仅绘制部分填充的像素,因此可以识别像素下方的箭头。

misc,background 指定背景颜色。

misc,drawboundary 如果为1,则根据输入矢量场文件绘制边界框。

misc,boundarycolor 指定边界框的颜色。(如果绘制边界的话)。

misc,boundarywidth 边界框的宽度,以像素为单位。

misc,margin 边框页边距的大小,以像素为单位。

misc,defaultwindowwidth, misc,defaultwindowheight 初始显示窗口的宽度和高度,以像素为单位。

misc,width, misc,height 显示区域的宽度和高度。若存在滚动条,则它们会小于显示窗口的尺寸。这些值在mmDisp初始化期间被忽略,但可通过菜单命令File|Write config将这些值传递给avf2ppm程序。

misc,rotation 逆时针旋转的角度;取值0、90、180或270。

misc,zoom 显示空间的缩放比例因子。该值与mmDisp控制栏中Zoom框中的值相同,大致对应于(原始、完全采样)矢量场中每个矢量的像素数量。如果设置为0,则会缩放到图像(包括边距)正好适合显示窗口的尺寸。

misc,datascale 箭头大小和颜色映射范围的数据比例;相当于Data Scale控制选项。通常,它应该是一个正实数值,但零值或空值会Data Scale还原为默认值。

misc,centerpt 如果指定了该项,该值应该是一个三个实数构成的列表,指定显示的中心点。{x y z}使用文件中网格的单位(例如米)。

misc,relcenterpt如果指定了该项,该值应为[0,1]范围内的三个实数构成的列表,指定在相对坐标中的显示中心点。如果同时指定了misc,relcenterpt和misc,centerpt选项,则优先使用misc,centerpt选项。

viewaxis 选择视图轴,取值:+z、+z、+y、+x或-x中的一个。该选项与菜单View|Viewpoint等效。

viewaxis,xarrowspan, viewaxis,yarrowspan, viewaxis,zarrowspan显示箭头的切片的厚度。例如,如果视图轴为+z或-z,则只有viewaxis,zarrowspan是可用的。列表中每个元素的值应该是实数值或空字符串,如果为零或空字符串,则切片的厚度被设置为默认值,通常为一个单元格的厚度。如果为正值,则指定的切片范围会使用文件中网格的单位,例如,以米为单位。如果为负值,则切片的厚度将设置为该视图方向上整个网格的厚度。

viewaxis,xpixelspan, viewaxis,ypixelspan, viewaxis,zpixelspan 与在上面介绍的相应的arrowspan类似,不过该选项用于配置像素显示。

print_config数组控制打印的默认值,即在菜单File|Print打开的对话框中的选项:

orient 确定纸张方向,landscape(横向)或portrait(纵向)。

paper 纸张类型:letter、legal、A4或A3。

hpos, vpos 打印页面上的水平和垂直位置。hpos可取值:left, center, 或 right。vpos可取值:top, center, 或 bottom。

units 页边距和打印区域尺寸的测量单位;单位为in(英寸)或cm(厘米)。

tmargin, lmargin 顶部和左侧页边距大小,使用上面选定的单位。

pwidth, pheight 输出的打印区域的宽度和高度,使用上面选定的单位。会缩放输出来满足更严格的尺寸要求,特别是,x/y的比例保持为1:1。

croptoview 布尔值,0或1。如果为1(true),则裁剪打印区域,只打印在显示窗口中可见的矢量场部分。如果为0,则会缩放显示区域以便打印整个矢量场。

如果在多个配置文件中同时设置了上述的任何元素,则优先使用最后读取的文件中的值。

细节

由Subsample值确定显示的矢量取决于数据是否位于规则网格上。如果位于规则网格上,则Subsample使用整数值,并确定数据点与显示点的比率。例如,Subsample值为5,表示网格上每间隔五个矢量显示一个矢量,这意味着显示的矢量数比网格上的矢量数少25倍。

对于不规则的网格,先计算平均单元格的大小,接着Subsample以平均单元格大小的0.1倍为单位取值,使用这种大小的方形网格覆盖在不规则网格上,对于方形网格中的每个单元格,将选择距离方形网格的中心单元格最近的不规则网格中的矢量进行显示。矢量显示在不规则网格中的真实位置,而不是在方形网格中心的单元格。随着Subsample的变化,所显示的矢量也会发生变化,这在某些情况下会显著的改变所显示矢量场的外观。

已知的Bugs

切片功能在不规则网格中无法正常使用。

14数据存储:mmArchive

概述

程序mmArchive提供矢量场和数据表的自动存储服务。尽管用户也可以在mmDisp和mmGraph中保存此类数据,但在某些情况下,mmArchive可以无需手动控制地、更方便地将数据写入磁盘。

mmArchive本身不提供用户界面窗口,与Oxs求解器类似,它依赖于mmLaunch为其提供界面。由于mmArchive不需要窗口,所以在Unix系统上可以关闭X服务器,并让mmArchive在后台保持运行。

启动

mmArchive可以通过单击mmLaunch中的mmArchive按钮来启动,也可以在Oxsii/Boxsi收到MIF 2文件中的Destination命令时启动,或通过命令行启动:

tclsh oommf.tcl mmArchive [standard options]

当单击mmLaunch中的mmArchive按钮时,表示会使用-tk 0选项启动mmArchive,如果X服务器被关闭,mmArchive也会继续运行。-tk 1选项仅在启用-console选项进行调试时有用。

如上所述,mmArchive依赖于mmLaunch为其提供界面。mmLaunch的Running Applications栏中有正在运行的mmArchive程序实例,在每个实例的旁边都有一个复选按钮,此按钮用于切换用户界面窗口的显示开关,用户可以通过该界面窗口控制mmArchive。

输入

mmArchive在其网络(socket)接口上接受来自客户端程序(通常是运行的求解器)的矢量场和数据表样式的输入数据。

输出

向mmArchive发送数据的客户端程序控制着数据流,mmArchive将接收到的数据复制到客户端指定的文件中,用户不可以手动地更改这些输出文件的名称。mmArchive有一个简单的状态行,用于显示最近的矢量文件的保存和数据表文件的打开/关闭事件。

对于数据表输出,如果输出文件已存在,则新数据将追加到文件的末尾。每个会话的数据放在“Table Start”和“Table End”之间。参考第18章ODT格式文档了解数据表文件的结构。用户需要确保多个数据流不会同时指向同一数据表文件。

对于矢量场输出,如果输出文件已存在,则会删除旧数据并替换为当前的数据。参考第19章OVF文档了解有关矢量场输出格式的信息。

控制

mmArchive窗口内的显示区域会显示它的活动日志。菜单File|Close interface会关闭mmArchive的窗口界面,但不会终止mmArchive。菜单File|Exit mmArchive或窗口右上角的关闭按钮会终止mmArchive。

选中菜单Options|Wrap lines,则每个日志条目可以多行显示。若没有选中,则每个日志条目都在一行上显示,并且在显示窗口的底部出现一个水平滑块,用于滚动显示。菜单命令Options|Clear buffer会清除日志显示,它仅清除mmArchive显示窗口中的日志,如果重新打开同一个mmArchive的显示窗口,则新的显示窗口将显示全部备份存储的日志。菜单Options的最后两项,Enlarge font 和Reduce font,用于调整日志显示的字体大小。

已知的Bugs

mmArchive将数据表输出追加到客户端程序(源程序,如正在运行的求解器)指定的文件中。如果有多个源程序同时指定了同一个文件,或者若同一个源程序向多个mmArchive实例发送数据表输出,那么对同一个文件的并发写入可能会损坏该文件中的数据。因此用户需要确保不会发生这种情况,目前OOMMF没有文件锁定机制来防止这种情况。

15文档查看器:mmHelp

概述

程序mmHelp管理帮助文件(HTML)的显示和导航。mmHelp只可以简单的显示所需的OOMMF帮助页面。它没有现代浏览器的许多高级功能,但OOMMF软件可以自定义使用其他程序来显示HTML帮助文件。

启动

mmHelp可以通过以下方式从命令行启动:

tclsh oommf.tcl mmHelp [standard options] [URL]

参数URL是要显示的第一个页面(主页)的URL。若未指定URL,默认情况下,mmHelp会显示OOMMF User’s Guide页面。

控制

每个超文本页面都在mmHelp的主窗口中显示。带下划线和蓝色的文本是mmHelp可跳转的超链接。带下划线和红色的文本是mmHelp不能跳转的超链接。将鼠标移到超链接上,会在Link:栏显示它的链接地址,Link:栏位于窗口上方。单击蓝色超链接将跳转到该超链接并显示新的超文本页面。

mmHelp会按查看顺序保存已查看页面到一个列表中。使用Back和Forward按钮,用户可以在页面列表中前后移动。Home按钮会显示第一页,即从头开始。在Navigate菜单中也有这三个按钮。

使用菜单File|Open可直接从文件系统中选择mmHelp显示的文件。

菜单File|Refresh或Refresh按钮可使mmHelp重新加载并重新显示当前页面。如果文件显示异常,或者重复加载正在编辑的超文本文件,可尝试使用该功能。

当mmHelp遇到无法解析的超文本元素时,它会尝试解决,然而,在某些情况下,若mmHelp依然无法解析超文本时,它会显示一条错误消息。文档作者应注意在文档文件中仅使用mmHelp支持的超文本元素,确保用户看不到这样的错误消息。

mmHelp可在两种窗口里显示错误消息:在主显示窗口中,或在单独的窗口中。在主显示窗口中会只显示错误消息,而不会显示超文本页面。这种情况通常表示无法检索超文本页面,或其内容不是超文本。文件权限错误也会以这种方式报告。

在单独窗口中显示的错误通常是由于超文本页面中的格式错误造成的。单击该窗口里的Continue按钮,mmHelp会尝试避开错误并继续显示超文本页面。单击Abort按钮则不会继续显示更多内容。

菜单Options|Font scale会打开一个对话框,用户可以在该对话框里选择要在显示的字体大小相对于其初始大小的比例。

菜单File|Exit或Exit按钮会终止mmHelp程序。菜单Help提供了常用的帮助工具。

已知的Bugs

mmHelp的显示速度很慢。推荐用户使用第2.3.2节本地化方法,用另一个更强大的HTML浏览器替换mmHelp。此外,我们注意到,在某些平台上,斜体带下划线的文本在某些字体大小下不会显示(或显示为空格)。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
半导体自旋电子学是指利用半导体材料中电子的自旋自由度进行信息处理和存储的研究领域。自旋是电子的一种内禀属性,类似于旋转角动量,可以分为上旋和下旋两种状态。与传统的电子信息处理系统依赖于电子的电荷进行信息传递和存储不同,自旋电子学利用电子的自旋来实现信息的读写与处理。 半导体材料是自旋电子学的重要载体之一,因为它具有良好的电子运输性能和光电特性。通过在半导体材料中引入磁性材料或特殊的晶格结构,可以控制电子的自旋状态,实现自旋的操纵和传输。 半导体自旋电子学在信息存储方面具有潜在的优势。相比传统的电荷存储器,自旋存储器具有更高的信息存储密度和更低的功耗。自旋存储器可以通过改变电子的自旋方向来表示不同的二进制状态,实现信息的存储和读取。此外,自旋信息可以在半导体材料中传输,可以实现自旋电子的远距离传输和相干操控。 半导体自旋电子学在信息处理方面也有广阔的应用前景。利用自旋电子的非线性相互作用,可以实现自旋逻辑门等基本逻辑操作,开拓了新的信息处理方式。自旋电子学还可以与光学、超导等领域相结合,实现多功能的信息处理和量子计算。此外,半导体自旋电子学还可以应用于磁性存储器、磁传感器、自旋激元学等领域,具有广泛的应用前景。 总而言之,半导体自旋电子学是一门综合性的学科,涉及物理学、材料科学、电子工程等多个领域。它利用半导体材料中电子的自旋自由度进行信息处理和存储,具有很高的科学研究和应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖工人_0803号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值