Tips for writing MIF 2.x files
MIF 2.x files are Tcl scripts, and so composing a MIF file is a
programming exercise, with all the pitfalls that entails. In this
section we detail some tips for authoring MIF files.
Generally a good place to start is to take an existing MIF file,
either one you've written earlier or one from the
oommf/app/oxs/examples/ directory, that has some similarity to the
one you want to write. Make a copy of that and start to edit. If you
need any complex functionality then an elementary understanding of Tcl is essential. In particular, you should be familiar with Tcl lists,
arrays, and some of the basic Tcl commands such as set,
expr, for, foreach, if/else, lrange, and
subst. You can find a list of Tcl tutorials on the Tcler's Wiki
Online Tcl and Tk
Tutorials
page. The Tcl Tutorial by Chris verBurg and Learn Tcl
in Y Minutes linked on that page are good places to start. The
Tcl
Dodekalogue
is also a
handy reference for figuring out confusing error messages. Many more
resources, including online manuals, can be found at the
Tcl Developer
Xchange.
Although MIF files are Tcl scripts, they also rely on a number of
MIF extension commands. The most prominent of these is
the Specify command, used to
initialize Oxs_Ext (Oxs extension) objects, such as region
definitions (atlases), mesh discretization, energy terms (exchange,
anisotropy, dipole-dipole, applied fields), and solution method (energy
minimization or LLG integration). The contents of each Specify
block, which depend upon the particular Oxs_Ext being initialized,
are documented
in the Standard Oxs_Ext Child
Classes section.
Other commonly used MIF extension commands are Parameter,
Destination, and Schedule.
Parameter operates similar to
the Tcl set command, but allows the user to change the default
value at runtime, through either the Params box in the Oxsii
Load Problem dialog, or via the -parameters command line option
to Boxsi. The
Destination and
Schedule commands
are used primarily for non-interactive set up of simulation output
for Boxsi.
As in any programming activity, bugs happen. Here are a few tips to aid
in debugging your MIF code:
- Check to see if your favorite programming editor (FPE) has support
for Tcl syntax highlighting and indenting. This can help spot a lot
of errors, particularly brace nesting issues, before you hand the
file over to the Tcl interpreter inside OOMMF.
- For development purposes, set the problem dimensions and cell
sizes so the total number of cells is relatively small. This will
allow problems to load and run faster, making it easier to detect
and correct errors. Use the Oxsii|Help|About menu to
see the number of cells in the simulation. For larger simulations
you may want to temporarily disable the Oxs_Demag module,
because that module can take some time to initialize and is usually
the slowest module to run. If the cellsize magnetization is set
correctly, then Oxs_Demag will usually be okay; you might want
to take a little extra care when working with periodic boundary
conditions, however, because demagnetization effects across PBC's
can be nonintuitive.
- When the MIF file is ready, launch Oxsii and bring up the
File|Load dialog box. Select the Browse check box, as
otherwise the Load dialog box is automatically closed when you
select OK to load the file. The Browse option allows you
to correct syntax errors in your MIF file without having to
repeatedly open the File|Load dialog box and reselect your
MIF file and parameters.
- If the load fails, open the MIF file in your FPE and use the
error message to help locate the point of failure in the
file. Correct, save to disk, and try loading again.
- If you can't figure out an error message, or to just
double-check that your file is being interpreted as you intend, use
the MIF Report command to print the contents of variables or
other state information to the Oxsii console. (The Oxsii
console is launched via the File|Show Console menu item on the
main Oxsii window. If you are running Boxsi, Report
output goes to the Boxsi log file, oommf/boxsi.errors.)
- Once the file loads without errors, send Magnetization
output from Oxsii to mmDisp for a visual check of the
simulation structure. Use Ctrl- or Shift-Ctrl-<left
mouse click> in mmDisp to view magnetization component
values at various locations. Bring up the mmDisp
Options|Configure dialog box to adjust the coloring, pixel and
arrow selection, etc. The # of Colors and Data Scale
settings in particular can make it easier to see small differences
in the selected Color Quantity. The Arrow span setting can
be used to control the number of levels of arrows that get displayed
in the slice view. For example, if the cell dimension in the
out-of-view-plane direction is 4 nm, then setting Arrow span to
4e-9 will cause a single slice of the magnetization to be
displayed as you adjust the slice control slider in the main
mmDisp window. If you set Arrow span to 8e-9 you'll
see two layers of overlapping arrows, which can be helpful for
checking interface conditions.
- By default mmDisp opens with a top-down view along the
-axis. For multilayer structures it is helpful to see
cross-sectional views along other axes too; these are available from
the View|Viewpoint submenu in the main mmDisp window.
Also, the mmDisp rendering of high aspect ratio cells can be
rather poor. In this situation you may want to enable pixel display
in the mmDisp configuration dialog with pixel size set smaller
than 1, and adjust the background color to make the individual cells
visible.
- The Magnetization output viewed in mmDisp allows you
to check that you have set Ms and m0 properly in the
driver Specify block. You can send other fields, such as
anisotropy and exchange, to mmDisp to check parameter settings
for those energy terms as well. In this context it can be helpful to
adjust m0 to align in specific directions for testing. You may
want to open two instances of mmDisp, with Magnetization
displayed in one and an energy field in the other, to help
correspond energy field values with magnetization structure.
- If you are having problems implementing some functionality, do a
search through the MIF files in oommf/app/oxs/examples for
something similar. For example, a text search for “pulse” will
turn up matches in pillar.mif, pingpillar.mif, and
pulse.mif, each illustrating how to implement an applied field
pulse of various shapes.
OOMMF Documentation Team
September 27, 2024