6. Executables¶
6.1. ncol¶
ncol
is a utility to conveniently analyse Data files (.ndt) files.
Suppose we have data file with name X_dat.ndt. We can then use:
ncol X_dat.ndt
or simply:
ncol X
to display the content of the file. This is useful to quickly gain an overview of the data in the file. For the Example 2: Computing the time development of a system, the command is:
ncol bar
which produces this output:
0 : #time #<s> 0
1 : id <> 0
2 : step <> 0
3 : last_step_dt <s> 0
4 : stage_time <s> 0
5 : stage_step <> 0
6 : stage <> 0
7 : E_total_Py <kg/ms^2> -260346.5776034
8 : phi <A> 2.50626665111e-07
9 : E_ext_Py <kg/ms^2> 0
10: H_demag_0 <A/m> -263661.6673782
11: H_demag_1 <A/m> -8.212128727093
12: H_demag_2 <A/m> -77027.64089399
13: dmdt_Py_0 <A/ms> -8.250903922407e+15
14: dmdt_Py_1 <A/ms> 2.333345040949e+16
15: dmdt_Py_2 <A/ms> 8.250903922407e+15
16: pin <> 1
17: H_anis_Py_0 <A/m> 0
18: H_anis_Py_1 <A/m> 0
19: H_anis_Py_2 <A/m> 0
20: m_Py_0 <> 0.7071067811865
21: m_Py_1 <> 0
22: m_Py_2 <> 0.7071067811865
23: M_Py_0 <A/m> 608111.8318204
24: M_Py_1 <A/m> 0
25: M_Py_2 <A/m> 608111.8318204
26: E_anis_Py <kg/ms^2> 0
27: E_exch_Py <kg/ms^2> 3.114630036477e-11
28: rho <A/m^2> 3.469702141876e+13
29: H_ext_0 <A/m> 0
30: H_ext_1 <A/m> 0
31: H_ext_2 <A/m> 0
32: H_total_Py_0 <A/m> -263661.6673782
33: H_total_Py_1 <A/m> -8.212128727085
34: H_total_Py_2 <A/m> -77027.64089399
35: E_demag_Py <kg/ms^2> -260346.5776034
36: H_exch_Py_0 <A/m> 2.037901097873e-11
37: H_exch_Py_1 <A/m> 0
38: H_exch_Py_2 <A/m> 2.037901097873e-11
39: maxangle_m_Py <deg> 0
40: localtime <> 2007/10/04-20:46:28
41: unixtime <s> 1191527188.269
The four columns above show the following data: the first is just a line number count. The second is the name of the data. The third provides the units of this data type. The fourth displays the first data value in the file (typically corresponding to the configuration of the simulation when save_data was called the first time).
The meaning of the keywords time
, id
, step
, stage_time
,
stage_step
, stage
, localtime
and unixtime
is explained
in section Stage, Step, iteration, time, etc..
The role of the id counter is to provide a reference to the
configuration that was saved, and it is a unique identifier of a
physical configuration. It is used to identify configurations in the
_dat.h5
file (which stores spatially resolved fields) and to
identify the corresponding (spatially averaged) data in the
_dat.ndt
file. This id
is used to uniquely identify physical
configurations in nmag. (See also: Why can you not use the step as a unique identifier?)
last_step_dt
is the length of the last time step carried out by
the timestepper. This is a useful indicator to learn about the
stiffness of the system: the time step is adjusted automatically to
achieve a certain accuracy, and thus the size of the time step
reflects how hard it is to integrate the equations of motion.
The fields starting with E_total_Py
down to H_exch_Py_2
are
all nsim subfields (see fields), and the data stored for these are
spatially averaged numbers. For example, the subfield M_Py_0
is
the x-component of the Magnetisation of the material Py
averaged
over all the space where this material is defined.
The maxangle_m_Py
is the maximum angle (in degree) of the change
of the magnetisation from one node in the mesh to the next. It is
important that this number is small: the equations on which the
micromagnetic theory is based assume that the magnetisation changes
slowly as a function of space. In the discretised solvers (this
applies to |nmag| as it applies to OOMMF, Magpar and other codes),
this means that the maximum angle between neighbouring sites should be
kept small. How small is good enough? This is hard to say in
general. We provide some (subjective) guidance: Values of 180 degrees
(or -180 degrees) quite clearly indicate that the results of the
calculations must not be trusted (i.e. they are wrong). Values around
90 degrees make the results highly questionable. Values of below 30
degrees indicate that the results are probably reliable. The smaller
the value, the more accurate the results will be. If this is new to you, you may want to read the Mini tutorial micromagnetic modelling and in particular the section What size of the cells (FD) and tetrahedra (FE) should I choose?.
The general syntax for calling ncol
is:
ncol [OPTIONS] datafile [COLS]
A list of options can be obtained with:
ncol --help
Available options include:
-h, --help show this help message and exit
--scale="{col1:factor1,col2:factor2,col3:factor3}"
scale col1 by factor1, col2 by factor 2 etc
--last-of="column" Select only the rows where 'column' changes.
-l Select only the last row for each stage (i.e.
typically the relaxed state)
--mod="field" Compute the magnitude of given field, i.e.
'--mod H_demag' computes
sqrt(H_demag_0^2+H_demag_1^2+H_demag_2^2). More than
one field can be provided (comma separated) but there
must be no spaces between the fields. (I.e. '--mod
m_Py,H_ext'). These modulus entries will be printed
last (after any other COLS that have been provided),
and in the order given in the '--mod' switch.
--odt Expect to process odt file (as produced by OOMMF, see
http://math.nist.gov/oommf/ and http://math.nist.gov/o
ommf/doc/userguide12a3/userguide/Data_Table_File_Forma
t_ODT.html).
6.2. nmagpp¶
The stage nmagpp
program is the NMAG data PostProcessor. It can be used to
- convert data stored in
RUNID_dat.h5
files into vtk files - dump the data to the screen.
The documentation is available with the --help
switch:
nmagpp --help
6.2.1. Inspecting the content¶
We describe some typical scenarios, using the data file bar_dat.h5
that is generated in Example 2: Computing the time development of a
system.
The bar_dat.h5
file contains spatially resolved data for all
fields in the simulation (because we have used the
save_data(fields='all')
command). Some of the functions of
nmagpp
apply to one or more fields (such as --dump
and
--vtk
) and these can be specified through a --fields
command
line parameter. Similarly, the --range
command will limit the number of saved configurations which will be processed.
Try nmagpp --help
for further documentation. Some examples:
Checking what at what configurations have been saved:
nmagpp --idlist bar
produces:
id stage step time fields 0-> 1 0 0 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 10-> 1 312 5e-11 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 20-> 1 495 1e-10 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 30-> 1 603 1.5e-10 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 40-> 1 678 2e-10 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 50-> 1 726 2.5e-10 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho 60-> 1 762 3e-10 E_anis E_demag E_exch E_ext E_total H_anis H_demag ... phi pin rho
The id
is the same unique identifier id used in the Data files (.ndt) files that can be
read with the ncol command. In particular, its purpose is to identify
time steps saved in the ndt file with the corresponding data saved in
the h5 data file.
Columns time
(measured in seconds), step
and stage
are
just providing some further information (see Stage, Step, iteration, time, etc.) Finally, the available (i.e. saved) fields for every
configuration are listed. The list of fields is not displayed
completely if it is long (unless the --printall
switch is used).
6.2.2. Dumping data¶
Suppose we are interested in the magnetisation data stored at id
0. We restrict the data to the m
field using the --fields m
switch, and restrict the number ids
to dump using --range 0
:
nmagpp --fields m --range 0 --dump bar
produces output that starts like this:
field : m
subfield : m_Py
time : 0 * <SI: 1 s >
id : 0
step : 0
stage : 0
field unit: <SI: 1 >
position unit: <SI: 1e-09 m >
row: 0
#Start (index in h5 table, dofsite, pos, data)
0: 0 : ( 0, 0, 0) : ( 0.707107, 0, 0.707107)
1: 1 : ( 3, 0, 0) : ( 0.707107, 0, 0.707107)
2: 2 : ( 6, 0, 0) : ( 0.707107, 0, 0.707107)
3: 3 : ( 9, 0, 0) : ( 0.707107, 0, 0.707107)
The first few rows provide some metadata such as which field and
subfield the data is about, at what simulation time it was saved (here
0 seconds), what the id, step and stage is. It further shows the
field unit
and the position unit
. These give the physical
dimensions with which the numerical quantities from the table have to
be multiplied to get dimensionful physical quantities. For example,
the positions in the table are provided as (0,0,0)
, (3,0,0)
,
(6,0,0)
etc. These numbers have to be multiplied by
<SI: 1e-09 m >
= 1e-9 meters to obtain the actual positions
in SI units. In other words, the position coordinate data is expressed in
nanometers. In this particular example, the field data – the normalised
magnetisation – is dimensionless.
Followed by the keyword #Start
the actual data starts (in the next
line). The format of the subsequent data lines is as follows:
- Column 1: index of the site in the h5 file. This mostly relevant for developers.
- Column 2: the index of the site. As long as we are dealing with first order basis functions (as is nearly always the case in micromagnetics), this is equivalent to the node id in the mesh.
- Columns 3, 4, 5: enclosed in parentheses, the position of the site
is expressed in units of the
position unit
. - Columns 6, 7, 8: enclosed in parentheses, the actual field data
expressed in units of the
field unit
.
In short, the first line of the actual data:
0: 0 : ( 0, 0, 0) : ( 0.707107, 0, 0.707107)
tells us that the normalised magnetisation at node id 0
, and
position (0,0,0) nm
is pointing in the direction
(0.707107,0,0.707107)
.
Another example: Suppose we are interested in the magnetisation field
M
(this is the non-normalised magnetisation measured in Ampere per
meter) at time 1e-10 seconds (i.e. id=20). We use this
command:
nmagpp --fields M --dump --range 20 bar
to obtain output beginning like this:
field : m
subfield : m_Py
time : 1e-10 * <SI: 1 s >
id : 20
step : 495
stage : 1
field unit: <SI: 1 >
position unit: <SI: 1e-09 m >
row: 2
#Start (index in h5 table, dofsite, pos, data)
0 0 ( 0 0 0 ) ( 0.182556 0.525948 0.830694 )
1 1 ( 3 0 0 ) ( 0.165008 0.534525 0.828888 )
2 2 ( 6 0 0 ) ( 0.104837 0.544846 0.831957 )
3 3 ( 9 0 0 ) ( 0.029925 0.552054 0.833272 )
4
In principle, this output data can be parsed by other tools to extract
the positions and the data. However, it is hoped that other options of
the nmagpp tool (such as the --vtk
switch ) already cover most of
the situations where the need to convert data may arise. (If you would
like to export the raw data into another file format or application,
please contact the nmag team to request this feature, as it may be
of interest to other people as well.)
It is further possible to access the data in the _dat.h5
files
directly from tailor written post-processing scripts. See example:
post processing of saved field data.
6.2.3. Range of data to be processed¶
The --range
switch allows a variety of ways to express which of
the ids
in the data file should be selected (for dumping to the
screen, or conversion to a vtk file). Here are some examples:
--range 17 #will select 17
--range "range(5,10)" #will select [5,6,7,8,9]
--range "[2,5,10,42]" #will select [2,5,10,42]
--range "range(10)+[20,25,31,42]" #will select [0,1,2,3,...,9,10,20,25,31,42]
--range "max(ids)" #will select the last saved id
6.2.4. Conversion to vtk file¶
The command
nmagpp –range 0 –vtk test.vtk bar
will take the dataset with id
=0 in the bar_dat.h5
file and convert it
to a (binary) vtk file with name test.vtk
. For vtk files, the
default is to convert all fields. However, if a field (or a list of fields) is specified
using the --field
option, then only this field is converted. This
may be useful if disk space or conversion time is an issue.
We can convert multiple time steps into a set of vtk files with one command. For example, to convert for all saved configurations all fields into vtk files, use:
nmagpp --vtk alltest.vtk bar
This will create files alltest-000000.vtk
, alltest-000010.vtk
,
alltest-000020.vtk
, alltest-000030.vtk
, alltest-000040.vtk
,
alltest-000050.vtk
, and alltest-000060.vtk
.
The conversion to vtk can be combined with the --range
command.
(See Range of data to be processed). For example, to convert every
second saved configuration (i.e. ids 0, 20, 40) into vtk files, we could use:
nmagpp --range "range(0,60,20)" --vtk x.vtk bar
The string “range(0,60,20)” is a Python expression and will evaluate
to [0,20,40] (because it is the list of integers starting from 0,
going up to [but not including] 60, in steps of 20). This will create
files x-000000.vtk
, x-000020.vtk
and x-000040.vtk
.
6.2.5. Other features¶
Use:
nmagpp –help
to get an overview of other features of nmag, and further details.
6.3. nmeshpp¶
The nmeshpp
program is the NMESHPreProcesser and NMESHPostProcessor.
It provides quick access to some statistical information
about nmesh meshes. The basic usage is
nmeshpp [OPTIONS] INPUTFILE [OUTPUTFILE]
where INPUT
is the name of a nmesh file (either in ascii or hdf5
format), OUTPUTFILE
is the name of the file to be written to (if
required; this depends on the OPTIONS
) and OPTIONS can be one or
several of the options listed in the following subsections. We use the
mesh file bar30_30_100.nmesh.h5
from Example 2 to
illustrate the usage of nmeshpp.
6.3.1. General information (--info
)¶
The command:
nmeshpp --info bar30_30_100.nmesh.h5
produces the following output:
====== Info output: ========================================================
3-dimensional mesh
18671 volume elements (3d)
3438 surface elements (2d)
4086 points
1 simplex regions ([1])
2 point regions ([-1, 1])
2 region volumes ([0.0, 89999.999999999782])
1721 boundary points (-> BEM size<= 22MB)
0 periodic points (mirage=0, total=0)
a0: average=3.543451, std=0.581220, min=1.953689, max=5.708395
Starting from the top of the output, we are given the information that this is a three-dimensional mesh, with its number of volume elements (i.e. tetrahedra in 3d), surface elements (i.e. surface triangles) and points.
We are also given a list of simplex regions (which is just [1] here). If we had more than one region defined (say two disconnected spheres that are to be associated with different material), then we would have two entries here. The numbers given in this list are the identifiers of the regions: in this example there is only one region and it has the identifier 1.
The point regions is a list of all regions in which points are located. This includes of course region 1. Region -1 represents the vacuum around the meshed region. The points that are located on the surface of the bar are located both in the bar (region 1) and in the vacuum (region -1). Other negative region numbers (-2, -3) can be used to discern different pieces of a boundary. (While this feature is at present not used by |Nmag|, the underlying |nsim| framework provides capabilities to e.g. associate Dirichlet boundary conditions to a 1/-1 boundary and von Neumann boundary conditions to a 1/-2 boundary.)
The region volumes provide the geometrical volume of the regions. By convention, the vacuum has volume 0. In this example, the bar volume is meant to be 30x30x100=90000. The deviation from this due to limited numerical precision (and of the order of 1e-10).
The boundary points are the number of nodes located at the surface of the bar. This number is important if using the hybrid finite element/boundary element method to compute the demagnetisation field, as the boundary element matrix size will be proportional to the square of the number of boundary points. The size of the boundary element matrix is given as well (see Memory requirements of boundary element matrix).
The periodic points are the number of points that have mirage images in the mesh. There will always be zero periodic points (and thus zero mirage images) unless we are dealing with a periodic mesh (see nmeshmirror and Example: Spin-waves in periodic system).
Finally, we are given some information about the statistics of the edge lengths a0 in the mesh: the average value, the standard deviation, the maximum and minimum value. This is important as in micromagnetics the angle of the magnetisation must not vary strongly from one node to the next. In practice, the edge length a0 should therefore be (significantly) smaller than the exchange length (see What size of the cells (FD) and tetrahedra (FE) should I choose?)
6.3.2. Memory requirements of boundary element matrix¶
The boundary element matrix is densely populated matrix with s rows and s columns, where s is the number of surface nodes in the mesh. (Strictly, it is only the number of surface nodes that enclose a ferromagnetic material.) Assuming we use 8 bytes to store one floating point number, we can thus estimate the memory required to store this matrix. In the example above, we have 1721 boundary points, and thus 1721*1721=2961841 matrix entries. Each entry requires 8 byte, so the total memory requirement is 23694728 bytes, or approximately 23139 kilobytes or 23 megabytes.
The nmeshpp -i
command can be used to quickly check how big the
BEM matrix is. A computation is only feasible if the RAM of the
computer can hold the boundary element matrix. (When carrying out a
distributed calculation, it is sufficient if the total RAM of all
machines can hold the matrix.)
6.3.3. Inspecting the quality of a mesh¶
The quality of a mesh can be defined in various ways. In micromagnetics, we usually want tetrahedra that have edges of nearly identical length (i.e. we do not want the tetrahedra to be flat).
nmeshpp
uses the ratio of the radius of the in-sphere (the sphere
that can just fit into a tetrahedron so that it touches the sides) to
radius of the circumsphere (the sphere passing through the four corners),
multiplied by the number of dimensions. This number is 1.0 for a
perfect tetrahedron with identical edge lengths, and 0 for a
completely flat (effectively 2-dimensional) tetrahedron.
The command:
nmeshpp -q bar30_30_100.nmesh.h5
computes a histogram of the distribution of this quality parameter for the bar mesh, and produces this output:
====== Quality output: ======================================================
[qual interval] counts = probability
[ 0.000- 0.100] 0 = 0.00%
[ 0.100- 0.200] 0 = 0.00%
[ 0.200- 0.300] 0 = 0.00%
[ 0.300- 0.400] 0 = 0.00%
[ 0.400- 0.500] 1 = 0.01% *
[ 0.500- 0.600] 42 = 0.22% *
[ 0.600- 0.700] 364 = 1.95% **
[ 0.700- 0.800] 2420 =12.96% ************
[ 0.800- 0.900] 8252 =44.20% ****************************************
[ 0.900- 1.000] 7592 =40.66% *************************************
6.3.4. Histogram of edge lengths¶
The command:
nmeshpp -a bar30_30_100.nmesh.h5
computes a histogram of the edge length distribution of the mesh:
====== a0 output: ===========================================================
[a0 interval] counts = probability
[ 1.954- 2.329] 234 = 0.63% **
[ 2.329- 2.705] 1424 = 3.81% *******
[ 2.705- 3.080] 7921 =21.17% *************************************
[ 3.080- 3.456] 8790 =23.50% ****************************************
[ 3.456- 3.831] 7573 =20.24% ***********************************
[ 3.831- 4.207] 5884 =15.73% ***************************
[ 4.207- 4.582] 3769 =10.08% ******************
[ 4.582- 4.957] 1385 = 3.70% *******
[ 4.957- 5.333] 365 = 0.98% **
[ 5.333- 5.708] 63 = 0.17% *
average a0: <a0> = 3.543451
stand dev a0: <a0^2> = 0.581220^2
min and max : =(1.953689,5.708395)
6.4. Convert nmesh.h5 to nmesh file (and back)¶
The command:
nmeshpp -c mesh.nmesh.h5 mesh.nmesh
converts a the mesh mesh.nmesh.h5
(in h5 format) to the mesh.nmesh
(in ascii format). Works also in the reverse way. nmeshpp
will save as h5
file if the last extension of the file to write is .h5
.
6.4.1. nmeshmirror¶
The nmeshmirror
tool can create periodic meshes out of a non-periodic mesh. The geometry described by the non-periodic mesh has to
be a cuboid. This can be mirrored along one (or more) of the planes
defined by the sides of the cuboid.
The general usage is
nmeshmirror meshfile error1 error2 directions newfile remove
where:
meshfile
is the original (non-periodic) ASCII nmesh fileerror1
is the maximum distance between two points in order to consider them coincident (case of points on mirroring planes)error2
is the maximum distance between a point and the surface opposite to the one used as mirroring plane in order to consider the point periodicdirections
is a list of values 0,1 or -1, corresponding to the direction(s) over which the mesh is mirrored: 1 corresponds to mirroring along the positive given axis, -1 along the negative given axis and 0 corresponds to no mirroring along the given axis.For a three dimensional mesh, there are three options to mirror the mesh (along the x, y and z direction). In that case, the
directions
would be a list of three integers, for example0,1,0
to mirror the input mesh on the xz plane that limits the mesh in the y direction.newfile
is the name of the ASCII file with the new periodic meshremove
is an optional argument which takes the values 0 and 1 and removes the periodic points from the final mesh when is set to 1. The default value is 0.
Calling orig.nmesh
the ASCII file of a 3D non-periodic mesh, an example
of the use of nmeshmirror is the following, where the mesh is mirrored
along the positive x-axis and the negative z-axis:
nmeshmirror orig.nmesh 1e-6 1e-6 1,0,-1 periodic.nmesh
resulting in a periodic mesh along the same axes.
6.4.2. nmeshsort¶
The nmeshsort
script sorts the nodes of a mesh along a given axis
(not recommended when using parmetis with multiple-object meshes). We
expect this to be most relevant to developers.
The general usage is
nmeshsort meshfile axis newfile
where:
meshfile
is the original ASCII nmesh fileaxis
is the axis over which the sorting takes placenewfile
is the name of the ASCII file with the new periodic mesh
Calling orig.nmesh
the ASCII file of a 3D mesh, an example
of the use of nmeshsort is the following, where the mesh is sorted
along the z-axis:
nmeshsort orig.nmesh 2 sorted.nmesh
6.5. nmeshimport¶
The nmeshimport command can be used to read other mesh formats and write them into the nmesh format that can be read by |nmag|.
The nmeshimport
tool can convert `Netgen`_, Gambit and `Gmsh`_ files
into nmesh files.
The general usage is:
nmeshimport OPTIONS INPUTFILE NMESHFILE
The OPTION to import from `Netgen`_ is --netgen
. The (contributed)
code for importing from a Gambit mesh file is --gambit
.
The OPTION to import from `Gmsh`_ is --gmsh
.
Usage example: assuming we have a file mymesh.neutral
created with
`Netgen`_ and would like to convert it to mymesh.nmesh.h5
, we could
use this command:
nmeshimport --netgen mymesh.neutral mymesh.nmesh.h5
Use:
nmeshimport --help
to see all available features.
6.6. nsim¶
This is the main executable. It superficially appears to be a Python
interpreter, but has extended functionality. In particular, it has
support for parallel execution (using MPI), and contains extensions
accessible in the additional built-in ocaml
module which provides
the additional functionality of the |nsim| multiphysics
system. (|Nmag| is a Python library on top of |nsim|, which itself is
implemented in Objective Caml.)
6.7. nsimversion¶
A script that provides some information about the version of the software.
If you need to report a bug/problem, please include the output of this program.
From release 0.2 onwards, please use:
nsim --version
instead.