高山仰止,景行行止。——《诗经·小雅·车辖》
# 前言
这是oommf软件教程《OOMMF User’s Guide》的中文翻译文章,由于本人水平有限,有些翻译可能有错误,望见谅。
第7章是本手册最重要的章节,由于本人水平是在很低,很多地方我都是凭借“想象力”硬凑的,所以翻译的有些句子可能词不达意,遇到这种情况请参阅原文。
目录
######
本文链接:https://blog.csdn.net/qq_43572058/article/details/123036219
CSDN@搬砖工人_0803号
######
7.3.5驱动器。
演化器负责在各个步进中推动模拟进行演化更新,驱动器通过将步进分组为任务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(7.2)、(7.3)允许的每个阶段的时间。例如,如果time_criteria为 ,则任意阶段的演化时间都不会超过1ns,如果模拟中总共有5个阶段,那么总模拟时间将不超过5 ns。终止一个阶段的第三种方法是指定stage_iteration_limit参数,它表示对每个阶段允许的演化器成功步进数的限制。当满足这三个停止标准中的任何一个时,一个阶段被视为完成。每个停止标准的值可以是单个数值(表示应用于每个阶段的停止标准都使用该数值),也可以是多个数值组成的分组列表(见17.3.3.3)。如果模拟中的阶段数量比分组列表中的阶段数量多,则把分组列表中的最后一个数值应用于所有其他阶段。这些停止标准参数的默认值都是0,这意味着阶段没有停止的标准,所以通常指定至少一个停止标准参数,从而自动控制阶段的终止。对于准静态模拟,stopping_dm_dt在 1.0 到 0.01 范围内是合理的;对于计算能量时的精度,得到的| dm/dt |不可能远低于 0.001 度/纳秒。
参数total_iteration_limit、stage_count和stage_count_check控制整个模拟的运行完成条件。total_iteration_limit的默认值为0,表示无限制,但可以将其设置为正整数来指定在模拟中执行的步进总数。更常见的运行完成条件是使用基于阶段计数来确定的,如果为stage_count指定了正整数,则当阶段数达到该值时,运行将被视为完成。如果未指定stage_count,或设置为0,则通过检查停止标准的分组列表的长度以及其他具有需要阶段数量需求的任意Oxs_Ext对象(如Oxs_UZeeman)来计算有效阶段数量,把它们中需要最多的阶段数量被视为阶段数量的极限值。通常,该最多阶段数量和参数stage_count的值是相同的,若存在差异则表明MIF文件内容存在错误,若将stage_count_check设置为1(默认值),Oxs将自动测试此条件,测试中会忽略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将禁用检查点功能。checkpoint_minutes默认为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来启用它。它表示外界时间,以秒为单位。此输出可能对性能比较和调试有用。(注:磁化状态的时间戳是在该状态首次请求输出时记录的,这个时间戳与处理这个过程所消耗的外界时间没有联系。)
矢量场输出:
•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。将stopping_mxHxm参数设置为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.
7.3.6场对象。
场对象返回关于位置的函数的(标量或矢量)值。场对象经常作为其他Oxs_Ext对象中的内嵌对象,以用来初始化随空间变化的参数,如材料参数或初始磁化配置。返回值的单位将取决于上下文。
首先介绍标量场对象,其次介绍矢量场对象。
标量场
Oxs_UniformScalarField
无论输入的位置点如何,都返回相同的常量值。Specify指定块只有一个value参数,用于指定返回的常量值。该类通常被内嵌在其他Oxs_Ext对象中以指定均匀的材料参数(即为每个单元格分配相同的材料参数)。
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),该对象返回的标量值为 。
示例文件: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函数,函数名称必须是参数script的值“Tcl_script”,函数的参数列表与script_args有关)时,会把微磁问题坐标系中(以米为单位)位置点的x、y、z坐标放在proc参数列表中的相应位置,这些位置点通常位于离散化网格的节点位置(即x、y、z的取值是单元格的中心坐标)。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参数列表中。script_args列表中最后两个scalars和vectors,会根据scalar_fields和vector_fields列表的大小来决定放置在proc参数列表中的参数。参数scalar_fields的值是包含其他标量场对象的列表,对列表中的所有标量场在相应位置点计算标量值,并将得到的标量值按顺序放在proc参数列表中。参数vector_fields也是类似的处理过程,但每一个矢量场都会在proc参数列表列出三个数值,这是因为矢量场对象的输出有3个数值。尽管使用scalars和vectors看起来很复杂,但这是一个相当强大的工具,它允许几乎无限制的修改和组合其他场对象。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对象在该位置点返回(即该位置点的标量值为此值),否则返回0。参考第17.3.2节中关于MIF扩展命令 ReadFile 的讨论,了解使用导入的图像文件来实现类似目的的示例。
下面是另一个例子,演示了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,标量场)和初始磁化(m0,矢量场):
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脚本,它需要返回一个变换之后的位置矢量(注意,它不同于Oxs_ScriptScalarField中的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表示为该值乘以单位矩阵。如果列表由3个值组成,那么M就是一个沿对角线有3个值的对角矩阵。如果列表由6个值组成,则M是一个对称矩阵,其中指定的6个值分别对应于M11、M12、M13、M22、M23和M33。如果列表由9个值组成,那么这些值构成一个完整的矩阵,顺序为M11, M12, M13, M21,…, M33。如果没有设置参数M,则它将被设置为单位矩阵。参数offset取值为一个3元素列表,表示附加到 M x 的偏移量。如果没有指定offset,那么它将被设置为0。
常常有这样的情况,用户需要的变换不是M x+off,而是(x−off),假设M是非奇异的,那么这可以把参数inverse设置为1来实现这个效果。在这种情况下,将矩阵
与单位矩阵
进行比较,以检查逆矩阵的准确性。如果
中的任意元素与
的差值大于8字节浮点的精度(通常为
)乘以inverse_slack,则会产生一个错误。invert_flag默认为0,表示不使用逆矩阵,slack的默认设置是128。
下面是一个使用Oxs_AffineOrientScalarField将所给的场绕z轴逆时针旋转 的例子(译者注,下面的例子效果是:在计算位置点处的标量值时,会把该位置点(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 invert_flag
multiplier mult
offset off
viewplane view
atlas atlas_spec
xrange { xmin xmax }
yrange { ymin ymax }
zrange { zmin zmax }
exterior ext_flag
}
对参数image引用的彩色图像使用单色映射,从而生成一个标量场,当invert参数为0(默认值)时,黑色对应于0,白色对应于1,当invert参数为1时,黑色对应于1,白色对应于0。通过将红、绿、蓝三个颜色分量简单地相加,就可以将彩色图像转换为灰度图像。multiplier可以把值从范围[0,1]变换到[0,mult],最后再加上offset偏移量。
此处的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),其中 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,则先将矢量归一化到magval范围,再按multiplier缩放。
示例文件:diskarray.mif, exchspring.mif, imageatlas.mif, spinvalve.mif.
Oxs_ScriptVectorField
类似上述的Oxs_ScriptScalarField,但Oxs_ScriptVectorField返回一个矢量值(一个有3个元素的列表)而不是标量值。除了Oxs_ScriptScalarField中的参数外,Oxs_ScriptVectorField还接受一个可选的参数norm,如果指定了norm参数,会将脚本返回的矢量值的大小调整为指定的大小。如果同时指定了norm和multiplier参数,则先将矢量归一化到norm指定的大小,再按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 }
}
该类的参数和Tcl脚本的用户与Oxs ScriptOrientScalarField类完全相同,但注意此处field参数指定的场是矢量场。
注意,“方向”变换只作用于导入位置点的空间坐标,而不是输出的矢量。例如,如果field表示一个有形状的矢量场,script脚本是一个旋转变换函数,那么与原始矢量场相比,生成的矢量场的形状将被旋转,但输出的矢量仍将指向它们原来的方向。在这种情况下,可以将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
}
该类的参数和仿射变换的用法与Oxs_AffineOrientScalarField类完全相同,但注意此处field参数指定的场是矢量场。
正如Oxs_ScriptOrientVectorField文档中所述,“方向”转换只作用于导入位置点的空间坐标,而不是输出的矢量。如果用户需要旋转输出的矢量,请参考下文的示例。
示例文件: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矩阵用包含1到9个元素组成的列表表示,其使用方式与Oxs_AffineOrientVectorField和Oxs_AffineOrientScalarField类相同。参数offset、inverse和inverse_slack的用法也是相同的。如果invert_flag为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类相同。
示例文件:无。
7.3.7 MIF支持类。
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扩展命令导入Oxs_LabelValue块的多个MIF文件中使用。
示例文件:MIF文件 sample-rotate.mif 和 sample-reflect.mif使用存储在sample-attributes.tcl文件中的Oxs_LabelValue对象。
有关MIF2格式的详细信息,请参考第17.3节。
7.4第三方贡献的Oxs_Ext子类。
上一节讨论的Oxs_Ext子类是由OOMMF核心开发团队编写并维护的,其他Oxs_Ext子类可从第三方贡献获得,也可由用户自己编写(参考OOMMF Programming Manual)。 在Oxs Extensions Modules页面上列出了已知的第三方扩展,OOMMF发行版中包含了这些扩展,截至发布时都是最新版本。
贡献的扩展可以在oommf/app/oxs/contrib/下的各个目录中找到,它们是通过以下方式“安装”的:(1)使用oxspkg install命令将该目录下的源代码复制到oommf/app/oxs/local/中。(2)接着运行pimake编译并链接到Oxs中。
在OOMMF发行版中包含的扩展不需要除了运行OOMMF所需的库,它们都是以已安装状态发布的。如果用户需要使用其他扩展模块,则可以根据需要安装额外的库,请参考oxspkg文档中的requires子命令了解有关详细信息。
注意,扩展模块是以源代码方式发布的,不是预先编译好的二进制格式,这意味着用户若要将扩展模块添加到OOMMF中,则需要安装支持的C++编译器(第2.1节),并运行pimake来构建扩展模块。如果用户在Windows上运行预先构建好的OOMMF,那么应该首先切换到OOMMF根目录并运行以下命令来完全删除所有预先构建的二进制文件:
tclsh oommf.tcl pimake distclean
之后运行以下命令来全新构建OOMMF:
tclsh oommf.tcl pimake
这将确保新扩展模块的二进制文件与OOMMF的其余部分兼容。
OOMMF开发团队没有维护或解释第三方扩展模块,它们是按原样提供的。部分扩展模块的作者可能会提供有限的帮助支持,但要注意,扩展通常是作为对社区的公共服务提供的,作者的帮助支持不是强制性的。
8微磁问题编辑器:mmProbEd
概述
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会忽略注释,并将它不理解的代码移到输出文件的底部。使用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菜单提供了常用的帮助工具。
9微磁问题文件源:FileSource
概述
程序FileSource提供与mmProbEd相同的服务,即为正在运行的mmSolve2D微磁求解器提供MIF 1.x微磁问题。随着MIF规范的发展,mmProbEd可能会落后,mmProbEd可能无法编辑MIF规范中新的参数,或mmProbEd从文件中加载新的参数后无法传递给求解器。要使用这些新参数,需要使用通用文本编辑器“手动”编辑MIF文件,然后,可以使用FileSource将文件中包含的MIF微磁问题提供给求解器,而不会丢失内容。
启动
FileSource必须从命令行启动。可以在命令行上指定MIF微磁问题文件,该文件应用于客户端程序。命令为:
tclsh oommf.tcl FileSource [standard options] [filename]
虽然FileSource不会出现在mmLaunch的Programs栏,但它正在运行的副本会出现在Running Applications栏中,它提供了在账户服务目录下注册的服务。
输入
FileSource从命令行上的文件名称或通过“File|Open”对话框选择的文件获取MIF微磁问题,而且不会按照MIF规范检查文件内容,文件内容会不加修改地传递给任何请求微磁问题的客户端程序,当这些客户端程序遇到无效的微磁问题时,会引发错误。
输出
每个FileSource子程序实例一次只提供一个文件的内容。文件名称在FileSource窗口中显示,以帮助用户关联FileSource的每个实例和提供的数据文件。FileSource的每个实例都可以接受并响应客户端程序(通常是求解器)导出其文件内容的请求。
在客户端请求时读取文件的内容,所以,如果文件的内容在FileSource选择文件时和客户端请求到达时之间发生变化,则将新内容提供给客户端程序。
控制
菜单File|Exit将终止FileSource程序。Help菜单提供了常用的帮助工具。