高山仰止,景行行止。——《诗经·小雅·车辖》
# 前言
这是oommf软件教程《OOMMF User’s Guide》的中文翻译文章,由于本人水平有限,有些翻译可能有错误,望见谅。后续章节的翻译正在进行,以大约2万字为节点上传一次。
第7章是本手册最重要的章节,由于本人水平是在很低,很多地方我都是凭借“想象力”硬凑的,所以翻译的有些句子可能词不达意,遇到这种情况请参阅原文。
将Word复制到CSDN时发现一个问题:这里不能正确显示字母的上面的字符,它表示为字母(字符),OK,就这样注意一下吧。
目录
7.3.5驱动器。
7.3.6场对象。
7.3.7 MIF支持类。
8微磁问题编辑器:mmProbEd
9微磁问题文件源:FileSource
演化器负责在各个步进中推进仿真,驱动器通过将步进分组为任务tasks、阶段stages和运行runs.,协调演化器在整个仿真中的行动。
任务是一小组的步进构成的,可以在不影响用户界面响应的情况下完成。阶段是在MIF文件中指定的更大的单位(即更多的步进),在一个阶段内,微磁问题的参数不会以不连续的方式变化。运行是一个从微磁问题开始到结束的完整的阶段序列。驱动器使用MIF文件中指定的条件检测阶段和运行完成的时间,并可以实施限制,例如确保阶段边界符合时间停止标准。
Oxs中有两个驱动器,Oxs_TimeDriver时间驱动器用于控制时间演进器(如Oxs_RungeKuttaEvolve),Oxs_MinDriver最小化驱动器用于控制最小化演进器(如Oxs_CGEvolve)。
Oxs_TimeDriver
Oxs时间驱动器是Oxs_TimeDriver。
Specify指定块的形式如下:
Specify Oxs_TimeDriver:name {
evolver evolver_spec
mesh mesh_spec
Ms scalar_field_spec
m0 vector_field_spec
stopping_dm_dt torque_criteria
stopping_time time_criteria
stage_iteration_limit stage_iteration_count
total_iteration_limit total_iteration_count
stage_count number_of_stages
stage_count_check test
checkpoint_file restart_file_name
checkpoint_interval checkpoint_minutes
checkpoint_disposal cleanup_behavior
start_iteration iteration
start_stage stage
start_stage_iteration stage_iteration
start_stage_start_time stage_time
start_stage_elapsed_time stage_elapsed_time
start_last_timestep timestep
normalize_aveM_output aveMflag
report_max_spin_angle report_angle
report_wall_time report_time
}
前四个参数evolver、mesh、Ms和m0分别引用时间演化器、网格、标量场和矢量场。Ms是逐点的饱和磁化强度,以A/m为单位。m0是单位的初始磁化配置,即每个点的| m |=1。这四个参数是必选的。
下一组的3个参数控制阶段停止标准。stopping_dm_dt(单位为度/纳秒)表示当所有自旋的| dm/dt |的最大值降至该值以下时,就认为一个阶段已完成。同样,stopping_time表示每个阶段允许的最大“模拟时间”,即LandauLifshitz-Gilbert ODE(2)、(3)在每个阶段允许的时间。例如,如果time_criteria为10-9,则任意阶段的演变时间都不会超过1ns。如果模拟中总共有5个阶段,那么总模拟时间将不超过5 ns。终止阶段的第三种方法是使用stage_iteration_limit,表示对每个阶段允许的演化器成功步进数的限制。当满足这三个标准中的任何一个时,阶段被视为完成。每个停止标准的值可以是单个数值,表示应用于每个阶段的停止标准都使用该数值,也可以是多个数值组成的分组列表(见17.3.3.3)。如果模拟中的阶段数量比分组列表中的阶段数量多,则把分组列表中的最后一个数值应用于所有其他阶段。这些停止标准参数的默认值都是0,这意味着没有停止标准的限制,但通常至少指定一个,否则会没有自动的阶段终止控制。对于准静态模拟,stopping_dm_dt在1到0.01范围内是合理的;在能量计算的精度下,获得的dm/dt不可能远低于0.001度/纳秒。
参数total_iteration_limit、stage_count和stage_count_check涉及模拟的运行完成条件。第一个参数的默认值为0,表示无限制,但可以通过为total_iteration_limit指定正整数来限制在模拟中执行的步进总数。更常见的运行完成条件是使用基于阶段计数来确定的。如果为stage_count指定了正整数,则当阶段数达到该值时,运行将被视为完成。如果未指定stage_count,或设置为0,则通过检查停止标准的分组列表的长度以及具有需要阶段数量的其他任意Oxs_Ext对象(如Oxs_UZeeman)来计算有效阶段数量。其中需要的最多阶段数量被视为阶段数量的极限值。通常,该最多阶段数量和参数stage_count的值是相同的,任何差异都表明MIF文件中存在错误。Oxs将自动测试此条件,前提是stage_count_check设置为1,这是默认值。在本测试中,忽略0个或1个阶段数,因为这些数量通常用于表示任意的阶段数量。有时指定一个小的阶段数量时,它会隐式的变大以匹配整个模拟的阶段数量。在这种情况下,test为0可以禁用阶段计数检查。
检查点参数用于将求解器状态保存到磁盘,oxsii和boxsi的重启功能需要使用这些保存状态。参数checkpoint_file表示保存求解器状态的文件的名称,默认值是base_file_name.restart。检查点文件的清理由checkpoint_disposal决定,可取值standard (默认值), done_only, 或 never。当取值为standard时,会在程序正常终止时自动删除检查点文件,这可能是因为求解器已经结束对微磁问题的计算,也可能是因为用户以手动方式提前终止了微磁问题。当取值为done_only时,则仅当到达微磁问题的终点时,才会删除检查点文件。当cleanup_behavior是never时,则OOMMF不会删除检查点文件,而用户自己可以删除该文件。
参数checkpoint_interval表示重写检查点文件的时间(以分钟为单位)。在时间过去了checkpoint_minutes之前,不会对检查点文件进行写入。检查点的写入发生在求解器迭代之间,因此实际间隔时间可能比指定时间稍长。如果checkpoint_minutes为0,则在每个步进都保存求解器状态。如果checkpoint_minutes为-1将禁用检查点功能。默认检查点间隔为15分钟。
6个start_*参数控制oxsii和boxsi运行的起点。这些参数主要在oxsii和boxsi的重启功能中自动使用,每个参数的默认值都是0。
参数normalize_aveM_output用于控制选择DataTable输出选项(包括输出到mmDataTable,mmGraph,和mmArchive)的平均磁化分量Mx、My和Mz的缩放和单位。如果aveMflag为真(1),则输出值被缩放至 [−1,1] 范围,仅在饱和时取到极值(即,所有自旋都是平行的)。如果aveMflag为假(0),则输出数据的单位为A/m。aveMflag默认为真(1)。
在MIF 2.1旧版格式中,驱动器的Specify指定块额外支持三个参数:basename、scalar_output_format和vector_field_output_format。在MIF 2.2格式中,这三个参数已移动到SetOptions块中。参见第17.4.2节SetOptions的详细说明文件。
Oxs_TimeDriver提供12个标量输出和2个矢量场输出。标量输出是
•Stage:当前的阶段数,从0开始计数。
•Stage iteration:当前阶段中演化器成功的步进数。
•Iteration:当前模拟中演化器成功的步进数。
•Simulation time:Landau-Lifshitz-Gilbert的演化时间,以秒为单位。
•Last time step:上一个时间步进的大小,以秒为单位。
•Mx/mx:x方向上的磁化分量,取整个模拟中的平均值,单位为A/m(Mx)或标准化单位(mx),具体取决于normalize_aveM_output参数。
•My/my:y方向上的磁化分量,取整个模拟中的平均值,单位为A/m(My)或标准化单位(my),具体取决于normalize_aveM_output参数。
•Mz/mz:z方向上的磁化分量,取整个模拟中的平均值,单位为A/m(Mz)或标准化单位(mz),具体取决于normalize_aveM_output参数。
•Max Spin Ang:具有非零磁化强度Ms的“邻域”自旋之间的最大角度,以度为单位。“邻域”的定义取决于网格,对于Oxs_RectangularMesh,一个点的邻域由6个点组成,沿3个坐标轴方向的前、后方向取到这些点。
•Stage Max Spin Ang:当前阶段获得的“Max Spin Ang”的最大值,单位为度。
•Run Max Spin Ang:当前运行中获得的“Max Spin Ang”的最大值,单位为度。
•Wall time:外界时间,以秒为单位。
默认情况下,三个“Max Spin Ang”输出都被禁用,通常应该采用交换能提供的相邻自旋角度输出。但是,为了向后兼容,或者在没有任何交换能量项的模拟中,可以通过将参数report_max_spin_angle设置为1来启用驱动器自旋角度输出。
默认情况下,“Wall time”输出也被禁用。可以通过将参数report_wall_time设置为1来启用它。它表示外界时间,以秒为单位,但OOMMF不太依赖外界时间。此输出可能对性能比较和调试有用。(注:磁化状态的时间戳是在该状态首次请求输出时记录的;时间戳与该状态的处理过程没有直接联系。)
矢量场输出:
•Magnetization:磁化矢量M,单位为A/m。
•Spin:单位磁化m。此输出会忽略参数vector_field_output_format precision,并始终以全(高)精度输出。
示例文件:sample.mif, pulse.mif.
Oxs_MinDriver
Oxs_MinDriver是控制最小化演化器的驱动器。
Specify指定块的形式如下:
Specify Oxs_MinDriver:name {
evolver evolver_spec
mesh mesh_spec
Ms scalar_field_spec
m0 vector_field_spec
stopping_mxHxm torque_criteria
stage_iteration_limit stage_iteration_count
total_iteration_limit total_iteration_count
stage_count number_of_stages
stage_count_check test
checkpoint_file restart_file_name
checkpoint_interval checkpoint_minutes
checkpoint_disposal cleanup_behavior
start_iteration iteration
start_stage stage
start_stage_iteration stage_iteration
start_stage_start_time stage_time
start_stage_elapsed_time stage_elapsed_time
start_last_timestep timestep
normalize_aveM_output aveMflag
report_max_spin_angle report_angle
report_wall_time report_time
}
这些参数与Oxs_TimeDriver类的参数相同,只是Oxs_MinDriver用stopping_mxHxm参数代替了Oxs_TimeDriver的stopping_dm_dt参数,并且它没有stopping_time参数。参数stopping_mxHxm的值可以是以A/m为单位的数值,也可以是分组列表,取决于模拟的需求,典型值在10到0.1之间。能量计算的数值精度的限制通常使| m×H×m |不可能低于约0.01 A/m。可以通过将其设置为0.0来禁用此控制。
与Oxs_TimeDriver一样,在MIF 2.1旧版格式中,Oxs_MinDriver还支持三个额外的参数:用于控制输出文件名的basename参数,以及用于控制输出格式的scalar_output_format 和 vector_field_output_format参数。在MIF 2.2格式中,这三个参数已移动到SetOptions块中。参见第17.4.2节SetOptions的详细说明文件。
Oxs_MinDriver提供10个标量输出和2个矢量场输出。标量输出是:
•Stage:当前的阶段数,从0开始计数。
•Stage iteration:当前阶段中演化器成功的步进数。
•Iteration:当前模拟中演化器成功的步进数。
•Mx/mx:x方向上的磁化分量,取整个模拟中的平均值,单位为A/m(Mx)或标准化单位(mx),具体取决于normalize_aveM_output参数。
•My/my:y方向上的磁化分量,取整个模拟中的平均值,单位为A/m(My)或标准化单位(my),具体取决于normalize_aveM_output参数。
•Mz/mz:z方向上的磁化分量,取整个模拟中的平均值,单位为A/m(Mz)或标准化单位(mz),具体取决于normalize_aveM_output参数。
•Max Spin Ang:具有非零磁化强度Ms的“邻域”自旋之间的最大角度,以度为单位。“邻域”的定义取决于网格,对于Oxs_RectangularMesh,一个点的邻域由6个点组成,沿3个坐标轴方向的前、后方向取到这些点。
•Stage Max Spin Ang:当前阶段获得的“Max Spin Ang”的最大值,单位为度。
•Run Max Spin Ang:当前运行中获得的“Max Spin Ang”的最大值,单位为度。
•Wall time:外界时间,以秒为单位。
与Oxs_TimeDriver一样,默认情况下关闭三个“Max Spin Ang”输出和“Wall time”输出。将report_max_spin_angle设置为1,可以启用角度输出;将report_wall_time设置为1,可以启用外界时间输出。
矢量场输出是:
•Magnetization:磁化矢量M,单位为A/m。
•Spin:单位磁化m。此输出会忽略参数vector_field_output_format precision,并始终以全(高)精度输出。
示例文件:cgtest.mif, stdprob3.mif.
场对象返回作为关于位置的函数的(标量或矢量)值。场对象经常作为其他Oxs_Ext对象中的内嵌对象,以初始化随空间变化的参数,如材料参数或初始磁化自旋配置。返回值的单位将取决于使用上下文。
首先介绍标量场对象,其次介绍矢量场对象。
Oxs_UniformScalarField
无论输入的位置点如何,都返回相同的常量值。Specify指定块只有一个参数value,表示返回的常量值。该类通常被内嵌以指定均匀的材料参数。
Specify指定块的形式如下:
Specify Oxs_TimeDriver {
...
Ms { Oxs_UniformScalarField {
value 8e5
}}
...
}
参阅第17.3.3.2节MIF 2的文档说明,当使用Oxs_UniformScalarField或Oxs_UniformVectorField作为内嵌对象时,允许使用只指定值(即省略定义块的代码)的简写方法。上面的例子与下面的例子等价:
Specify Oxs_TimeDriver {
...
Ms 8e5
...
}
这个例子创建了一个隐式的Oxs_UniformScalarField对象,其值为8e5。
示例文件:sample.mif, cgtest.mif.
Oxs_AtlasScalarField
声明需要在Oxs_Atlas的各个区域中定义的值。
Specify指定块的形式如下:
Specify Oxs_AtlasScalarField:value {
atlas atlas_spec
multiplier mult
default_value scalar_field_spec
values {
region1_label scalar_field_spec1
region2_label scalar_field_spec2
...
}
}
atlas用于将单元格位置映射到容器中的区域;values子块中指定的标量场将被分配给相应位置的单元格。参数default_value是可选的;如果指定了default_value,那么没有在values子块中声明的区域,则会被设置为该默认的标量场。如果未指定default_value,则atlas包含的容器中的没有在values子块中声明的区域将引发错误。
values子块中指定的标量场可以是本节(场对象)中描述的任意标量场。通常,可以为任意位置的scalar_field_spec设置单个数值;表示一个指定大小的均匀(空间均匀)场。
如果指定了multiplier,则values子块中指定的标量场都会按mult进行缩放。
与Oxs_AtlasScalarField类似的矢量场是Oxs_AtlasVectorField,本节矢量场部分将对它进行描述。
示例文件:diskarray.mif, ellipsoid.mif, grill.mif, spinvalve.mif, tclshapes.mif.
Oxs_LinearScalarField
返回一个随位置线性变化的值。
Specify指定块的形式如下:
Specify Oxs_LinearScalarField:name {
norm value
vector { vx vy vz }
offset off
}
如果指定了可选参数norm的值,那么首先把指定的vector缩放到需要的大小。参数offset是可选的,默认值为0。对于给定的任意位置点(x, y, z),该对象返回的标量值为xvx + yvy + zvz + off。
示例文件:spinvalve-af.mif.
Oxs_RandomScalarField
定义一个在空间上随机变化的标量场。
Specify指定块的形式如下:
Specify Oxs_RandomScalarField:name {
range_min minvalue
range_max maxvalue
cache_grid mesh_spec
}
每个位置点的取值都是从两个必选参数range_min和range_max声明的范围中均匀获取的。Oxs_RandomScalarField还有一个可选参数cache_grid,它接受一个用于空间离散化的网格对象。如果没有指定cache_grid,那么每次调用Oxs_RandomScalarField都会生成一个不同的场。如果用户想在两个地方使用相同的随机标量场(比如各向异性系数和饱和磁化强度),可以为cache_grid指定合适的网格。
示例文件:randomshape.mif, stdprob1.mif.
Oxs_ScriptScalarField
类似Oxs_ScriptVectorField类,这个类会生成一个标量场,该标量场会用到Tcl脚本声明的标量场和其他可选的标量场和矢量场。
Specify指定块的形式如下:
Specify Oxs_ScriptScalarField:name {
script Tcl_script
script_args { args_request }
scalar_fields { scalar_field_spec . . . }
vector_fields { vector_field_spec . . . }
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
}
对于每个位置点,都需要script和script_args计算它的标量场,使用方式见第17.3.3.6节MIF 2文件格式中的用户自定义程序。args_request应该是列表{rawpt relpt minpt maxpt span scalars vectors}的子集。
如果列表里指定了rawpt,那么当调用Tcl proc(即Tcl函数)时,会把微磁问题坐标系中(以米为单位)的位置点的x、y、z坐标放在proc参数列表中的相应位置。这样表示的位置点通常是模拟离散化(网格)中的节点位置,但一般情况下不一定是这样。relpt、minpt、maxpt和span依赖于边界盒子的定义,边界盒子是一个平行六面体。边界盒子必须通过引用参数atlas包含的空间范围来指定,或者通过xrange, yrange, zrange(以米为单位)三个参数显式地声明空间范围。minpt和maxpt会在proc参数列表中列出边界盒子的最小位置点和最大位置点的坐标,而span会在proc参数列表中列出maxpt到minpt的3个坐标轴方向上的差值。relpt会在proc参数列表中列出x_rel, y_rel, z_rel,其中每个元素位于[0,1]范围内,表示minpt和maxpt之间的位置点的相对坐标。
到目前为止讨论的script_args列表中的参数都会将各自的3个元素放入proc参数列表中。最后两个scalars和vectors,会根据scalar_fields和vector_fields列表的大小来放置在proc参数列表中放置参数。参数scalar_fields的值是包含其他标量场对象的列表。计算列表中的标量场在该位置点的取值,并将得到的标量值按顺序放在proc参数列表中。参数vector_fields也是类似的,但每一个矢量场都会在proc参数列表列出三个数值,这是因为矢量场对象的输出有3个数值。尽管这些参数的使用看起来很复杂,但这是一个相当强大的工具,它允许几乎无限制的控制其他场对象的修改和组合。Oxs_ScriptScalarField的scalar_fields和vector_fields参数都是可选的。
如果不设置script_args参数,则script_args会使用默认值relpt。
请注意,如果script_args的列表中包含relpt、minpt、maxpt或span,则必须指定一个边界盒子。下面的例子使用了显式的空间范围来指定边界盒子,参阅Oxs_ScriptVectorField的文档,了解使用atlas来指定边界盒子的示例。
proc Ellipsoid { xrel yrel zrel } {
set xrad [expr {$xrel - 0.5}]
set yrad [expr {$yrel - 0.5}]
set zrad [expr {$zrel - 0.5}]
set test [expr {$xrad*$xrad+$yrad*$yrad+$zrad*$zrad}]
if {$test>0.25} {return 0}
return 8.6e5
}
Specify Oxs_ScriptScalarField {
script Ellipsoid
xrange { 0 1e-6 }
yrange { 0 250e-9 }
zrange { 0 50e-9 }
}
如果导入的位置点(x,y,z)位于由(xmin=0, ymin=0, zmin=0)和(xmax=1e-6, ymax=250e-9, zmax=50e-9)定义的平行六面体的内接椭球内,那么Oxs_ScriptScalarField对象返回8.6 × 105 (即该位置点的标量值为此值),否则返回0。参见第17.3.2节中关于ReadFile MIF扩展命令的讨论,以了解使用导入的图像文件来实现类似目的的示例。
下面是另一个例子,演示了vector_fields的用法。
proc DotProduct { x1 y1 z1 x2 y2 z2 } {
return [expr {$x1*$x2+$y1*$y2+$z1*$z2}]
}
Specify Oxs_FileVectorField:file1 {
atlas :atlas
file file1.omf
}
Specify Oxs_UniformVectorField:dir111 {
norm 1
vector {1 1 1}
}
Specify Oxs_ScriptScalarField:project {
script DotProduct
script_args vectors
vector_fields {:file1 :dir111}
}
在空间盒子中的每一位置点,标量场 :project会生成矢量场:file1中的该位置处的矢量值在[1,1,1]方向上的投影值。
示例文件:antidots-filled.mif, ellipsoid-fieldproc.mif, manyregions-scriptfields.mif, manyspheres.mif, varalpha.mif.
Oxs_VecMagScalarField
Oxs_VecMagScalarField类通过逐点取矢量场的范数来从矢量场生成标量场,即,
Specify指定块的形式如下:
Specify Oxs_VecMagScalarField:name {
field vector_field_spec
multiplier mult
offset off
}
在对矢量取模之后再使用参数multiplier和offset,也就是说,生成的标量场为mult∗ ||v|| + off。mult和off分别默认为1和0。
Oxs_VecMagScalarField类的功能可以通过Oxs_ScriptScalarField类来实现,方法是利用参数vector_fields和Tcl脚本计算矢量场的范数。但由于这种特定功能的需求很常见,所以可以实现这个专用的类。例如,这个类可以与一个矢量场对象结合使用,来设置饱和磁化强度的分布(Ms)和初始磁化:
Specify Oxs_FileVectorField:file1 {
atlas :atlas
file file1.omf
}
Specify Oxs_TimeDriver {
basename test
evolver :evolve
stopping_dm_dt 0.01
mesh :mesh
m0 :file1
Ms { Oxs_VecMagScalarField {
field :file1
}}
}
示例文件:sample-vecrotate.mif.
Oxs_ScriptOrientScalarField
标量场提供在三维空间中作为关于位置的函数的标量值。Oxs_ScriptOrientScalarField类用于在对位置点上的标量场求值之前,改变该位置点的坐标(译者注,改变该位置点的坐标仅用于计算标量场的值,它的真实空间坐标并没有改变)。
Specify指定块的形式如下:
Specify Oxs_ScriptOrientScalarField:name {
field scalar_field_spec
script Tcl_script
script_args { args request }
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
}
field参数需要引用一个标量场对象。script是一个Tcl脚本,它需要返回一个位置矢量,该矢量将传给field引用的标量场对象,最终从该标量场生成一个标量值。Tcl脚本的参数由script_args决定,取值是列表{relpt rawpt minpt maxpt span}的子集。如果列表中指定了除rawpt以外的任何参数,那么需要定义一个边界盒子,边界盒子由atlas参数指定,或者通过三个xrange, yrange, zrange参数指定。script_args的默认值是relpt。
Oxs_ScriptOrientScalarField类可以用来改变标量场的“方向”,如下面的简单示例所示,标量场:file1mag将会关于yz平面对称:(译者注,即空间盒子中的位置点的标量值会取值为关于yz平面对称的位置点的标量值)
Specify Oxs_FileVectorField:file1 {
atlas :atlas
file file1.omf
}
Specify Oxs_VecMagScalarField:file1mag {
field :file1
}
proc Reflect { x y z xmin ymin zmin xmax ymax zmax} {
return [list [expr {($xmax+$xmin-$x)}] $y $z]
}
Specify Oxs_ScriptOrientScalarField:reflect {
field :file1mag
script Reflect
script_args {rawpt minpt maxpt}
atlas :atlas
}
参阅Oxs_ScriptOrientVectorField类,它的操作与这个标量场类似。
示例文件:sample-reflect.mif.
Oxs_AffineOrientScalarField
Oxs_AffineOrientScalarField和Oxs_ScriptOrientScalarField类似,但Oxs_AffineOrientScalarField中位置点的坐标是通过一个定义的3 × 3仿射变换矩阵和一个偏移量来改变的,而不是通过Tcl脚本改变坐标。虽然可以通过适当的Tcl脚本获得这个功能,但Oxs_AffineOrientScalarField更容易使用并且运行得更快,因为它底层的转换是通过c++而不是Tcl脚本执行。
Specify指定块的形式如下:
Specify Oxs_AffineOrientScalarField:name {
field scalar_field_spec
M { matrix_entries . . . }
offset { offx offy offz }
inverse invert_flag
inverse_slack slack
}
如果F (x)表示由参数field指定的标量场,那么转换后的标量场是F (M x + off)。M是一个3 × 3矩阵,它可以由一个包含1、3、6或9个元素的列表来表示。如果matrix_entries列表由一个值组成,则取M为该值乘以单位矩阵,即M是齐次尺度变换矩阵。如果由3个值组成,那么M就是一个沿对角线有3个值的矩阵。如果matrix_entries列表由6个值组成,则假设M是一个对称矩阵,其中指定的6个值分别对应于M11、M12、M13、M22、M23和M33。最后,如果matrix_entries列表由9个值组成,那么这些值构成一个完整的矩阵,顺序为M11, M12, M13, M21,…, M33。如果没有设置参数M,则它将被设置为单位矩阵。参数offset取值为一个3元素列表,表示附加到M x的偏移量。如果没有指定offset,那么它将被设置为0。
常常有这样的情况,用户需要的变换不是M x+off,而是M−1(x−off)。如果M是非奇异的,这可以把参数inverse设置为1来实现。在这种情况下,将矩阵M.M−1与单位矩阵进行比较,以检查逆矩阵的准确性。如果M.M−1中的任意元素与I的差值大于8字节浮点的计算机精度(通常为2 × 10−16)乘以inverse_slack,则会产生一个错误。invert_flag默认为0,表示不使用逆矩阵,而slack的默认设置是128。
下面是一个使用Oxs_AffineOrientScalarField将所给的场绕z轴逆时针旋转90◦的例子(译者注,下面的例子在计算位置点处的标量值时,把该位置点(x,y,z)的坐标变换为(-y,x,z))。请注意,指定的atlas在xy平面是正方形,atlas坐标原点位于atlas的中心。
Specify Oxs_BoxAtlas:atlas {
xrange {-250e-9 250e-9}
yrange {-250e-9 250e-9}
zrange { -15e-9 15e-9}
}
Specify Oxs_FileVectorField:file1 {
atlas :atlas
file file1.omf
}
Specify Oxs_VecMagScalarField:file1mag {
field :file1
}
Specify Oxs_AffineOrientScalarField:reflect {
field :file1mag
M { 0 1 0
-1 0 0
0 0 1 }
}
参阅Oxs_AffineOrientVectorField类,它的操作与这个标量场类似。
示例文件:sample-rotate.mif.
Oxs_AffineTransformScalarField
和Oxs_AffineOrientScalarField类似,可以对一个标量场进行仿射变换,但在此类中,是计算标量场的值之后再应用仿射变换。
Specify指定块的形式如下:
Specify Oxs_AffineTransformScalarField:name {
field scalar_field_spec
multiplier mult
offset off
inverse invert_flag
}
如果F (x)表示由参数field指定的标量场,则该类生成的标量场为mult * F (x) + off。F的输出是一个标量值,multiplier和offset也是标量值。如果参数inverse设置为1,且mult非零,则该类生成的标量场变换为(F (x)−off) /mult。
mult、off和invertflag分别默认为1、0和0。field是唯一必需设置的参数。
也可以利用Oxs_ScriptScalarField类和它的参数scalar_fields得到和Oxs_AffineTransformScalarField类的相同功能,但Oxs_AffineTransformScalarField类更快,接口更简单。参阅Oxs_AffineTransformVectorField类,它的操作与这个标量场类似。
示例文件:sample-rotate.mif.
Oxs_ImageScalarField
该类利用图像创建标量场。
Specify指定块的形式如下:
Specify Oxs_ImageScalarField:name {
image pic
invert invertflag
multiplier mult
offset off
viewplane view
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
exterior extflag
}
对参数image引用的彩色图像使用单色映射,从而生成一个标量场,当invert为0(默认值)时,黑色对应于0,白色对应于1,当invert为1时,黑色对应于1,白色对应于0。通过将红、绿、蓝三个分量简单地相加,就可以将彩色图像转换为灰度图像。multiplier可以将加上offset偏移量(如果设置了的话)之后的值从范围[0,1]改为[0,mult]。
此处的viewplane的功能与Oxs_ImageAtlas类中的viewplane相同,取值同样为三个两坐标字母代码xy(默认值)、zx或yz中的一个。缩放图像的空间比例以适应atlas或xrange/yrange/zrange选择所指定的空间范围。如果图像缩放后的空间没有填满整个模拟空间,则根据参数exterior处理图像空间之外的位置点,exterior可以设置为浮点值,或者boundary或error关键字之一。在第一种情况下,该浮点值被视为图像外的位置点的默认值,浮点值范围为[0,1]。这个值的倍数和偏移量的调整方式与图像内的位置点的调整方式相同。如果ext_flag为boundary,则图像外的位置点的取值和图像边界上最近位置点的值相同。如果ext_flag为error(默认值),那么当为图像外的任意位置点计算标量值时,都会会引发一个错误。
示例文件:rotatecenterstage.mif, sample-reflect.mif.
可用的矢量场对象是:
Oxs_UniformVectorField
无论输入的位置点如何,都返回相同的常量值。Specify指定块有一个必选参数vector,它引用含有3个元素的列表表示Oxs_UniformVectorField返回的矢量。还有一个可选参数norm,如果指定了norm,则将返回的矢量的大小调整为指定的大小。例如,
Specify Oxs_UniformVectorField {
norm 1
vector {1 1 1}
}
无论输入的位置点如何,该对象都是返回单位矢量(a, a, a),其中 。
该类经常被内嵌在其他Oxs对象中,以指定空间上均匀分布的量。例如,在驱动器的Specify指定块中:
Specify Oxs_TimeDriver {
...
m0 { Oxs_UniformVectorField {
vector {1 0 0}
}}
...
}
参阅第17.3.3.2节MIF 2的文档说明,当使用Oxs_UniformScalarField或Oxs_UniformVectorField作为内嵌对象时,允许使用只指定值(即省略定义块的代码)的简写方法。上面的例子与下面的例子等价:
Specify Oxs_TimeDriver {
...
m0 {1 0 0}
...
}
这里创建了一个隐式的Oxs_UniformVectorField对象,并将参数vector设置为{1 0 0}。
示例文件:sample.mif, cgtest.mif.
Oxs_AtlasVectorField
声明需要在Oxs_Atlas的各个区域中定义的矢量值。
Specify指定块的形式如下:
Specify Oxs_AtlasVectorField:name {
atlas atlas_spec
norm magval
multiplier mult
default_value vector_field_spec
values {
region1_label vector_field_spec1
region2_label vector_field_spec2
...
}
}
该类的描述和Oxs_AtlasScalarField类似,但Oxs_AtlasVectorField类的输出是三维矢量而不是标量。因此,与每个区域相关联的值是矢量场而不是标量场。参数中需要引用的矢量场可以是本节中描述的任意矢量场类,通常使用一个包含三个数值的列表来表示一个具有指定值的均匀(空间均匀)矢量场。
可选的参数norm表示把每个矢量归一化到magval范围。可选的参数multiplier缩放矢量的值。如果同时指定了norm和multiplier,则先将矢量归一化,再按multiplier缩放。
示例文件:diskarray.mif, exchspring.mif, imageatlas.mif, spinvalve.mif.
Oxs_ScriptVectorField
类似于Oxs_ScriptScalarField,但Oxs_ScriptVectorField返回一个矢量(一个有3元素的列表)而不是标量。除了Oxs_ScriptScalarField中的参数外,Oxs_ScriptVectorField还接受一个可选的参数norm。如果指定了norm,会将脚本返回的矢量的值大小调整为指定的大小。如果同时指定了norm和multiplier,则先将矢量归一化,再按multiplier缩放。
下面的例子会生成一个涡旋状的单位矢量场,内部中心区域的矢量场平行于z轴。这里的缩放区域是通过一个引用的名为“:atlas”的容器对象来指定的,这个容器对象应该定义在MIF文件中的前面部分。参阅Oxs_ScriptScalarField中关于使用显式range参数的示例。
proc Vortex { xrel yrel zrel } {
set xrad [expr {$xrel-0.5}]
set yrad [expr {$yrel-0.5}]
set normsq [expr {$xrad*$xrad+$yrad*$yrad}]
if {$normsq <= 0.025} {return "0 0 1"}
return [list [expr {-1*$yrad}] $xrad 0]
}
Specify Oxs_ScriptVectorField {
script Vortex
norm 1
atlas :atlas
}
参阅Oxs_MaskVectorField和第17.3.2节中ReadFile扩展命令的文档,了解Oxs_ScriptVectorField类的其他使用示例。
示例文件:cgtest.mif, ellipsoid.mif, manyregions-scriptfields.mif, sample-vecreflect.mif, stdprob3.mif, yoyo.mif.
Oxs_FileVectorField
表示通过文件生成一个矢量场。
Specify指定块的形式如下:
Specify Oxs_FileVectorField:name {
file filename
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
spatial_scaling { xscale yscale zscale }
spatial_offset { xoff yoff zoff }
exterior ext_flag
norm magnitude
multiplier mult
}
该类必须要的值是输入的矢量场文件的名称和所需的缩放参数。文件名是通过file参数指定的,该文件包含一个矢量场,它的格式可被avf2ovf程序识别。如果指定了atlas或xrange/yrange/zrange,那么文件将按照有关方式被缩放和转换,以适应指定的区域,方式和Oxs_ScriptScalarField和Oxs_ScriptVectorField类相同。或者,可以直接指定spatial_scaling和spatial_offset。在这种情况下,文件中的空间位置点,会将坐标分量乘以(xscale、yscale、zscale),然后偏移(xoff、yoff、zoff)。如果需要直接使用文件中空间位置的坐标,则可以将spatial_scaling设置为 {1,1,1},将spatial_offset 设置为{0,0,0}。
在所有情况下,一旦对输入场进行了缩放和偏移,根据需要对其进行亚采样(零阶拟合),以匹配模拟网格。
参数exterior用于确定“外部点”的行为,外部点即模拟网格中位于缩放和偏移矢量场范围之外的位置点(如果有)。ext_flag应该是一个三元素的矢量,或者是关键字boundary或error中的一个。如果为一个三元素的矢量,那么所有外部点的取值都为该矢量。如果ext_flag为boundary,则外部点的取值和输入矢量场边界上距离该外部点最近的点相同。ext_flag的默认为error,若为外部点计算矢量值,则会引发错误。
场的大小可以通过可选的参数norm和multiplier进行修改。如果指定了参数norm,那么矢量场中的每个矢量都将被归一化为指定的大小。如果指定了参数multiplier,那么矢量场中的每个矢量都将乘以给定的标量值。如果multiplier为负,则矢量场方向将反转。如果norm和multiplier都指定了,那么在按multiplier缩放之前,矢量场中的每个矢量将被归一化为指定的大小。
示例文件:stdprob3.mif, yoyo.mif.
Oxs_RandomVectorField
和Oxs_RandomScalarField类似,但它定义了一个在空间上随机变化的矢量场,而不是标量场。
Specify指定块的形式如下:
Specify Oxs_RandomVectorField:name {
min_norm minvalue
max_norm maxvalue
cache_grid mesh_spec
}
Specify指定块有两个必需的参数,min_norm和max_norm。生成的矢量的大小将在这两个值之间。如果min_norm = max_norm,则随机值均匀分布在以该大小为半径的球上。否则,随机值将均匀分布在具有内径min_norm和外径max_norm的空心球形体积中。可选参数cache_grid,它接受一个用于空间离散化的网格对象。如果未指定参数cache_grid,则对Oxs_RandomVectorField的每次调用都会生成一个不同的场。如果要在两个位置使用相同的随机矢量场(例如各向异性轴和初始磁化),需要为cache_grid指定适当的网格。
示例文件:diskarray.mif, sample2.mif, randomshape.mif stdprob1.mif.
Oxs_PlaneRandomVectorField
和Oxs_RandomVectorField类似,不同之处在于随机值来自2D平面而不是3维空间。
Specify指定块的形式如下:
Specify Oxs_RandomVectorField:name {
plane_normal vector_field_spec
min_norm minvalue
max_norm maxvalue
cache_grid mesh_spec
}
该类参数min_norm、max_norm和cache_grid的含义与Oxs_RandomVectorField类相同。额外的参数plane_normal,它需要指定一个矢量场,该矢量场在每个位置点提供一个矢量,该矢量与要从中得到该点的随机矢量的平面正交。如果该矢量场被显式设置为由三个实数表示的矢量场,则会产生一个均匀的矢量场,所有随机矢量都将位于同一平面上。然而,更一般地说,法矢量(和相关平面)可能因位置点而异。作为一种特殊情况,如果某一位置点的法矢量是零矢量,则不进行平面限制,并从满足最小/最大范数约束的三维空间中的空心球均匀的生成随机矢量。
示例文件:sample2.mif.
Oxs_ScriptOrientVectorField
和Oxs_ScriptOrientScalarField类似。
Specify指定块的形式如下:
Specify Oxs_ScriptOrientVectorField:name {
field vector_field_spec
script Tcl_script
script_args { args_request }
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
}
Specify指定块的解释和Tcl脚本的操作与Oxs ScriptOrientScalarField类完全相同,但field参数指定的场和Oxs_ScriptOrientVectorField类生成的场是矢量场而不是标量场。
注意,“方向”变换只作用于导入位置点的空间坐标,而不是输出的矢量。例如,如果field表示一个有形状的矢量场,script的函数proc是一个旋转变换,那么与原始矢量场相比,生成的矢量场的形状将被旋转,但输出的矢量本身仍将指向它们原来的方向。在这种情况下,可以将Oxs_ScriptOrientVectorField与Oxs_ScriptVectorField对象组合在一起,以旋转输出的矢量。这种情况也出现在Oxs_AffineOrientVectorField类中,参阅Oxs_AffineTransformVectorField类文档,以获取该类对象与Oxs_AffineOrientVectorField对象组合的示例。
示例文件:sample-vecreflect.mif.
Oxs_AffineOrientVectorField
和Oxs_AffineOrientScalarField类似。
Specify指定块的形式如下:
Specify Oxs_AffineOrientVectorField:name {
field vector_field_spec
M { matrix_entries . . . }
offset { offx offy offz }
inverse invert_flag
inverse_slack slack
}
Specify指定块和仿射变换的解释与Oxs_AffineOrientScalarField类完全相同,但field参数指定的场和Oxs_AffineOrientVectorField类生成的场是矢量场而不是标量场。
正如Oxs_ScriptOrientVectorField文档中所述,“方向”转换只作用于导入位置点的空间坐标,而不是输出的矢量。如果希望旋转输出的矢量,则可以对Oxs_AffineOrientVectorField对象使用相反的旋转。请参阅该部分以获取示例。
示例文件:yoyo.mif, sample-vecrotate.mif.
Oxs_AffineTransformVectorField
此类对矢量场的输出使用仿射变换。它类似于Oxs_AffineTransformScalarField类,只是在此类中,仿射变换作用于矢量,而不是标量。
Specify指定块的形式如下:
Specify Oxs_AffineTransformVectorField:name {
field vector_field_spec
M { matrix_entries . . . }
offset { offx offy offz }
inverse invert_flag
inverse_slack slack
}
由于field的输出是一个3数值组成的矢量,由M和offset定义的变换要求M是一个3×3矩阵,offset是一个3数值组成的矢量。因此,如果用v(x)表示由field指定的矢量场,则生成的矢量场为M.v(x)+off。M用一到九个元素组成的列表表示,其使用方式与Oxs_AffineOrientVectorField和Oxs_AffineOrientScalarField类完全相同。offset、inverse和inverse_slack的解释也是相同的。特别是,如果invert_flag为1,则生成的矢量场为M−1.(v(x)− off)。
下面的示例演示了如何将Oxs_AffineTransformVectorField与Oxs_AffineOrientVectorField组合,以完全旋转一个矢量场。
Specify Oxs_BoxAtlas:atlas {
xrange {-80e-9 80e-9}
yrange {-80e-9 80e-9}
zrange {0 40e-9}
}
proc Trap { x y z } {
if {$y<=$x && $y<=0.5} {return [list 0 1 0]}
return [list 0 0 0]
}
Specify Oxs_ScriptVectorField:trap {
script Trap
atlas :atlas
}
Specify Oxs_AffineOrientVectorField:orient {
field :trap
M { 0 -1 0
1 0 0
0 0 1 }
offset { -20e-9 0 0 }
inverse 1
}
Specify Oxs_AffineTransformVectorField:rot {
field :orient
M { 0 -1 0
1 0 0
0 0 1 }
}
proc Threshold { vx vy vz } {
set magsq [expr {$vx*$vx+$vy*$vy+$vz*$vz}]
if {$magsq>0} {return 8e5}
return 0.0
}
Specify Oxs_ScriptScalarField:Ms {
vector_fields :rot
script Threshold
script_args vectors
}
Specify Oxs_TimeDriver {
m0 :rot
Ms :Ms
stopping_dm_dt 0.01
evolver :evolve
mesh :mesh
}
这里的基本场由Oxs_ScriptVectorField:trap给出,它产生一个梯形矢量场,非零矢量平行于y轴。:orient和:rot变换将形状和矢量逆时针旋转90°。此外,:orient的参数offset将形状向左平移20 nm。原始场和转换后的场如下所示。
示例文件:sample-vecrotate.mif.
Oxs_MaskVectorField
将矢量场逐点乘以标量场(mask,即掩模)来生成一个新的矢量场。
Specify指定块的形式如下:
Specify Oxs_MaskVectorField:name {
mask scalar_field_spec
field vector_field_spec
}
该类的功能可以通过使用Oxs_ScriptVectorField类以一种更复杂的方式实现。例如,给定一个标量场:mask和一个矢量场:vfield,下面例子使用Oxs_MaskVectorField类:
Specify Oxs_MaskVectorField {
mask :mask
field :vfield
}
等价于下面这个使用Oxs ScriptVectorField类的例子:
proc MaskField { m vx vy vz } {
return [list [expr {$m*$vx}] [expr {$m*$vy}] [expr {$m*$vz}]]
}
Specify Oxs_ScriptVectorField {
script MaskField
script_args {scalars vectors}
scalar_fields { :mask }
vector_fields { :vfield }
}
当然,使用Oxs_ScriptVectorField类很容易得到更复杂的任意标量场和矢量场的组合。
示例文件:rotatecenterstage.mif.
Oxs_ImageVectorField
该类利用图像创建矢量场。
Specify指定块的形式如下:
Specify Oxs_ImageVectorField:name {
image pic
multiplier mult
vx_multiplier xmult
vy_multiplier ymult
vz_multiplier zmult
vx_offset xoff
vy_offset yoff
vz_offset zoff
norm norm_magnitude
viewplane view
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
exterior ext_flag
}
参数image表示一个三色图像,该类生成一个矢量场,其中每个(x,y,z)分量由红色、绿色和蓝色分量决定,分别为.. ..
参数viewplane、atlas、xrange/yrange/zrange和exterior的含义与Oxs_ImageScalarField类相同。
示例文件:无。
Oxs_LabelValue
保存“标签+值(label + value)”的简单对象。其他Specify指定块中的标准attributes标签可以引用Oxs_LabelValue对象,如下例所示:
Specify Oxs_LabelValue:probdata {
alpha 0.5
start_dm 0.01
}
Specify Oxs_EulerEvolve {
attributes :probdata
}
Oxs_LabelValue对象的Specify指定块是一个具有偶数个元素的任意Tcl列表。每对“标签+值”中的第一个元素为一个标签,第二个元素为值。参数attributes会将该列表展开并放置在对象中。在以下情况常用到该类:在多个Specify指定块中引用Oxs_LabelValue对象中的“标签+值”,可以在同一个MIF文件中使用,也可以在使用ReadFile MIF扩展命令导入Oxs_LabelValue块的多个MIF文件中使用。
示例文件:MIF文件 sample-rotate.mif和sample-reflect.mif使用存储在sample-attributes.tcl文件中的Oxs_LabelValue对象。
有关MIF2基本格式规范的详细信息,请参阅第17.3节。
概述
mmProbEd子程序提供了一个用户界面,用于创建和编辑MIF 1.1和MIF 1.2格式中的微磁问题。mmProbEd还作为服务器,为mmSolve2D微磁求解器提供微磁问题。
启动
mmProbEd可以通过mmLaunch上的mmProbEd按钮启动,也可以通过命令行启动:
tclsh oommf.tcl mmProbEd [standard options] [-net <0|1>]
-net <0|1>禁用或启用服务,该服务为其他子程序提供微磁问题。默认情况下,服务处于开启状态。当服务被禁用时,mmProbEd仅用于编辑微磁问题并将其保存到文件中。
输入
菜单File|Open会显示一个对话框,用于选择要加载的微磁问题MIF文件。在OOMMF发行版中,有几个示例文件在OOMMF /app/mmpe/examples目录下。在mmProbEd刚启动时,它会加载oommf/app/mmpe/init.mif作为初始的微磁问题。注意:当加载文件时,mmProbEd会忽略注释,并将它不理解的记录(即代码)移到输出文件的底部。mmProbEd使用FileSource子程序为其他子程序提供未修改的微磁问题。
输出
菜单File|Save as会显示一个对话框,用于选择/确定一个文件,其中保存mmProbEd当前持有的微磁问题。由于mmProbEd使用的内部数据格式是一个不包含注释(或不可识别的记录)的无序数组,所以简单的读取MIF文件并将其重新保存的操作可能会改变该文件。
mmProbEd的每个程序实例一次只包含一个微磁问题。当参数是-net 1(默认值),则表示启用服务,为来自客户端程序(通常是求解器程序)的获取微磁问题的请求提供服务。
控制
菜单Options允许选择MIF输出格式;可以选择MIF 1.1或MIF 1.2。这会影响菜单File|Save as保存文件的格式和mmSolve2D的输出。参阅第17.2节MIF 1.2格式文档了解这些格式之间的差异。
mmProbEd窗口的主面板包含与MIF 1.x微磁问题中各部分参数对应的按钮。选择一个按钮会弹出另一个窗口,通过这个窗口可以编辑该部分的内容。MIF及其包含的内容在MIF 1.1和MIF 1.2文档中有详细描述。一次只能显示一个编辑窗口,可以使用“Next”或“Previous”按钮来跳转编辑窗口。
Material Parameters编辑窗口包括一个下拉列表的预配置材料设置。注:这些数值不应作为这些材料的标准参考值,这些值只是近似值,是为了方便而包含的示例,用户可以为这些材料提供自己的材料参数。用户如果要引入额外的材料类型,则编辑所需的Material Name、Ms、A、K1和Anisotropy Type,并点击Add按钮。(Damp Coef(阻尼系数)和Anistropy Init(各向异性初始化)的设置不受选择的材料类型影响。)如果材料名称与材料类型列表中的任何名称都不匹配,或者如果名称匹配,但它的一个或多个材料值与存储在材料类型列表中的相应值不同,则该材料名称将以红色显示。用户可以用Replace和Delete按钮来管理材料类型列表,或者直接编辑oommf/app/mmpe/local/materials文件,但需要遵循该文件中其他条目的格式,而且该文件的格式与OOMMF发行版中包含的oommf/app/mmpe/materials文件相同。
菜单File|Exit将终止mmProbEd程序。Help菜单提供了常用的帮助工具。
概述
程序FileSource提供与mmProbEd相同的服务,即为正在运行的mmSolve2D微磁求解器提供MIF 1.x微磁问题。随着MIF规范的发展,mmProbEd可能会落后,MIF规范中可能有mmProbEd无法编辑的新条目,或mmProbEd无法在在文件加载后将微磁问题传递给求解器。要使用这些新条目,可能需要使用通用文本编辑器“手动”编辑MIF文件。然后,可以使用FileSource将文件中包含的MIF微磁问题提供给求解器,而不会损坏其内容。
启动
FileSource必须从命令行启动。可以在命令行上指定MIF微磁问题文件,该文件应用于客户端程序。命令行:
tclsh oommf.tcl FileSource [standard options] [filename]
虽然FileSource不会出现在mmLaunch的Programs列表中,但它正在运行的副本会出现在Threads列表中,因为它提供了在账户服务目录下注册的服务。
输入
FileSource从命令行上的文件名称或通过“File|Open”对话框选择的文件获取MIF微磁问题,而且不会根据MIF规范检查文件内容,文件内容会不加修改地传递给任何请求微磁问题的客户端程序,当这些客户端程序遇到无效的微磁问题时,会出现错误。
输出
FileSource的每个程序实例一次只提供一个文件的内容。文件名称在FileSource窗口中显示,以帮助用户将FileSource的每个实例与其提供的数据文件相关联。FileSource的每个实例都接受并响应客户端程序(通常是求解器)对其导出的文件内容的请求。
文件的内容在客户端请求时读取,所以,如果文件的内容在FileSource选择文件时和客户端请求到达时之间发生变化,则将新内容提供给客户端程序。
控制
菜单File|Exit将终止FileSource程序。Help菜单提供了常用的帮助工具。