2026-09-16
There are two executables: one executable polaris for
the calculation of the surface density function, the surface potential
and E-field,
[mpirun -np <nproc>] polaris -i <file.mesh> -s <settings.yaml>
which yields a file.vtkhdf as output; and one executable
polaris.post for the field calculation in the domain,
[mpirun -np <nproc>] polaris.post -i <file.vtkhdf> -p <points.xyz> -s <settings.yaml>
Both executables have more features that are described below in the usage section. Also consider the required license file.
Note that in the Windows package, all executables have a
.exe suffix.
Copyright © 2026 TAILSIT GMBH
Permission is granted, free of charge, to use and copy this software (the “Software”), subject to the following terms:
Any use of the Software that does not qualify as non-commercial use requires a separate written license from TAILSIT.
The software comes as a zipped tarball for Linux and as an installer package for Windows. After unpacking or installing, the file structure is as follows:
polaris-<version>-<target>-<license>
├── bin
│ ├── polaris
│ └── polaris.post
├── CHANGELOG.md
├── manifest
│ └── release.json
├── README.md
└── share
├── examples
│ ├── bushing
│ │ ├── preproc
│ │ │ ├── README.md
│ │ │ └── <...>
│ │ ├── README.md
│ │ └── <...>
│ ├── concentricSpheres
│ │ ├── preproc
│ │ │ ├── README.md
│ │ │ └── <...>
│ │ ├── README.md
│ │ └── <...>
│ └── sphereBicone
│ ├── preproc
│ │ ├── README.md
│ │ └── <...>
│ ├── README.md
│ └── <...>
└── licenses
└── third-party
├── HDF5
│ └── LICENSE.txt
├── Intel-MKL
│ ├── THIRD-PARTY-PROGRAMS-ONEMKL.txt
│ └── THIRD-PARTY-PROGRAMS.txt
├── libsodium
│ └── LICENSE.txt
├── nlohmann_json
│ └── LICENSE.MIT
└── yamlcpp
└── LICENSE.txt
The bin directory contains these binaries:
Both executables require a valid license. The license file
polaris_license.json can be obtained from the Polaris License Form.
Once you have received such a license file, you will have to place it
into one of the following locations:
/etc/polaris/polaris_license.json (system-wide)/opt/polaris/polaris_license.json (system-wide)$HOME/.config/polaris/polaris_license.json (user
install)$HOME/.polaris/polaris_license.json (user install)%PROGRAMDATA%\TAILSIT\polaris\polaris_license.json
(system-wide)%APPDATA%\TAILSIT\polaris\polaris_license.json
(system-wide)%LOCALAPPDATA%\TAILSIT\polaris\polaris_license.json
(user install)If you want to choose an arbitrary destination, point to it by
declaring the environment variable
POLARIS_LICENSE_FILE.
The POLARIS executables for Linux and HPC require MPI. The specific
MPI implementation is described in the mpi object of
manifest/release.json, which also lists the dynamic MPI
library the executables were linked against. Make sure this library can
be resolved at runtime (e.g., via LD_LIBRARY_PATH).
In addition, an SMP version that does not use MPI is available. On Windows, MPI is not supported.
You will find a browser-based pre-processor here, which allows you to
*.msh files or Nastran *.bdf
files to our custom format (*.mesh files, see Mesh format description)*.yaml file that describes the model and
holds the solver settings (see YAML settings
file)A typical workflow would be to open a surface mesh file in
*.mesh (Polaris), *.msh (GMSH) or *.bdf (Nastran Bulk
Data File) format. The viewer displays the surface mesh and colorizes
the different element sets (or regions) found in the file. The drawer
part of the UI has four tabs, Mesh View,
Domains, Surfaces and
Solver, and a persistent Region View.
The latter allows turning on and off the visibility of each region and
activating the display of surface normal vectors at each element center.
Note that it is often required to press the
Reset View button in the menu bar in order to get a
proper initial view of the model after loading a file.
In the Mesh View, one can also choose how to display
the entire model. In this tab, the surface mesh is loaded and one can
save a *.mesh file if needed.
The Domains tab is independent of the surface mesh
and allows the user to declare certain electrical domains: electrodes
with prescribed voltage, floating potentials with prescribed charge, and
dielectrics with given relative permettivity. Each such domain has to be
given a unique name. The set of domains can be saved to or loaded from
JSON files in this tab. Note, that the exterior region,
typically air with εR = 1, has to be explicitly declared by
the user.
In the Surfaces tab, the user has to assign to each
region (identified by its color in the viewer and by its region ID from
the input mesh file) an inside domain, an outside domain and a condition
for the surface itself. In- and outside are defined by the normal
vectors which, by convention, point from the inside to the outside. If a
surface is part of an electrode or floating potential, it can be that
its in- or outside domain plays no role in the computation and can thus
be set to Void. As condition for the surface, one has
either the names of the electrodes and floating potential domains as
options or a surface is simply the Interface between
two dielectric materials. As in case of the Domains tab, also here the
constellation can be loaded from or saved to a JSON
file.
At last, there is the Solver tab which allows to
specify settings as parameters of the iterative solver or the Fast
Multipole Method. These settings again have a JSON in- and
output.
Once all these tabs have been worked through, pressing the
Generate button in the menu bar saves a
YAML file which describes the computational model and all
the solver settings.
The surface mesh file format needed by polaris is very
simple and has the structure
# Comments begin with a hash
# Basic dimensions
3 NN NE CTS
# NN: num of nodes, NE: num elements, CTS: connectivity table size
# Nodes section
N_1 X_1 Y_1 Z_1 # ID and coordinates of 1st node
N_2 X_2 Y_2 Z_2
...
N_NN X_NN Y_NN Z_NN
# Elements section
ET_1 REG_1 N_1_1 ... # Type, region ID and nodes of 1st element
ET_1 REG_2 N_2_1 ...
...
ET_NE REG_NE N_NE_1 ...
It has a header line with the fundamental dimensions. Note that
CTS is the total number of node IDs used in the
connectivity of all elements and only has to be given as an upper bound.
Then follow the nodes sorted by their ID and the elements where each of
which has a type, a region ID and a list of node IDs that form its
connectivity. The specific element types supported are given in the
following
Tria3, order=1
2
|\
| \
0--1
Tria6, order=2
2
|\
5 4
| \
0-3-1
Tria10, order=3
2
|\
7 6
| \
8 9 5
| \
0-3-4-1
Quad4, order=1
3-----2
| |
| |
| |
0-----1
Quad8/9, order=2
3--6--2
| |
7 (8) 5
| |
0--4--1
Quad16, order=3
3---9---8---2
| |
10 (15) (14) 7
| |
11 (12) (13) 6
| |
0---4---5---1
Note that only surface meshes with uniform order are allowed. That is, for instance, one cannot mix linear and quadratic elements in the same mesh.
The model description and solver settings are provided in a YAML file which has the following form:
esProblem:
domain:
parts: []
dielectrics: []
electrodes: []
floatings: []
bem:
quad:
regular: 5
quasiOrder: 5
quasiAdm: 1.0
quasiMaxLevel: 3
singularXi: 6
singularEt: 7
fmm:
degree: 8
leafQuadratureOrder: 11
tree:
adaptive: true
leafSize: 500
fem:
order: 0
quadOrder: 3
systemSolver:
type: GMRES
rtol: 1e-4
atol: 1e-20
maxIter: 100
restart: 100
verbose: true
postSolver:
type: CG
rtol: 1e-8
atol: 1e-20
maxIter: 100
verbose: true
postEval:
quad:
order: 5
minRelDist: 1.0
maxLevel: 5
fmm:
degree: 8
leafQuadratureOrder: 11
tree:
adaptive: true
leafSize: 500
postProc:
outBasename: ''
vtkhdf:
active: true
numThreads: 0The above displayed YAML file provides all settings in
default form and can also be used as a template. Here, the parameters
for the BEM method, the Fast Multipole Method, the iterative solvers and
the post-processing are set. Note that numThreads: 0
implies that the maximally available number of threads is being
used.
Missing in the above settings are still the empty lists
parts, dielectrics, electrodes
and floatings, which will be explained below.
parts holds a list of items like the following
id: 123
name: "A domain name"
regionIds: [1, 2, 3]which defines a domain formed by surface regions with IDs 1, 2 and 3 with a given name and ID.
dielectrics holds a list of dielectric material
definitions of the type
partId: 123
orientations: [1, -1, 0]
epsR: 12.34which states that part with ID 123 has a given relative permettivity and, importantly, defines how the surfaces 1, 2 and 3, as given above in the definition of part 123, are oriented with respect to the dielectric material volume. Here, surface 1 is oriented such that its normal vectors point to the outside, the normals of surface 2 point to the domain’s inside and the surface 3 is actually embedded in the domain (a screen) and therefore the dielectric appears on both sides of the surface.
electrodes holds a list of electrode definitions
like
partId: 345
voltage: 100.00defining that the part with ID 345 has a prescribed voltage of 100.
floatings holds a list of floating potentials like
partId: 456
charge: -20which defines that the part with ID 456 represents a floating potential whose total charge shall be -20.
The full command is for the polaris executable
[mpirun -np <nproc>] polaris -i <file.mesh> -s <settings.yaml> [-o <basename>]
where, in addition to above settings, the basename of the output file
is another optional argument. If not provided, the path and basename of
the provided mesh-file will be used. Upon successful
completion, a file basename.vtkhdf will be generated. This
file serves two purposes:
Visualisation of the surface data in ParaView. Here, you will find the following data
sol (CellData, scalar) the surface density
functionpot (PointData, scalar) the surface potentialEin/Eout (CellData, vectorial) Electric
field at the inner/outer side of each surface patchforce (CellData, vectorial) electric force densityregion (CellData, scalar) IDs generated by the
processing of the mesh-file input; the values of the IDs
are not from the input filePosterior field evaluation. The output file also holds all relevant solution data in order to execute a field value computation.
Once a file.vtkhdf has been generated by the main
computation, one can evaluate the potential and E-field at any desired
point. To this end, run the command:
[mpirun -np <nproc>] polaris.post -i <file.vtkhdf> -p <points.xyz> -s <settings.yaml> [-o <basename>]
The optional argument for the basename of the results file is as in
the main computation, the default basename is extracted from the
points.xyz file. An essential input here is the list of
points at which the field values are calculated. Therefore, one needs to
provide a file with the structure
N
X1 Y1 Z1
X2 Y2 Z2
...
XN YN ZN
which has the number of points N followed by a list of
their coordinates. Note that these points are separated by end-lines and
any value following a Z-coordinate is being discarded. After running
polaris.post, one obtains a CSV file of the structure
X,Y,Z,Potential,EFieldX,EFieldY,EFieldZ
X1,Y1,Z1,u1,EX1,EY1,EZ1
...
XN,YN,ZN,uN,EXN,EYN,EZN
which, below the header line, hosts a list of N
coordinates, potential values and E-field coefficients. This file can
also be visualised in ParaView using the TableToPoints
filter.
Currently, the following three examples are provided
The computational logic of POLARIS is based on the single layer potential
\[ u(x) = (S\varphi)(x)\]
at any \(x\) not on a surface. Furthermore,
\[ \mathbf{E}(x) = -\mathbf{grad}(S\varphi)(x)\]
yields the electric field. Boundary integral equations are now obtained by taking interior and exterior Dirichlet or Neumann traces of the single layer potential and combining these with either Dirichlet boundary conditions on conductors or with the transmission conditions across dielectric interfaces. For conductors, either a constant voltage is prescribed or they are floating potentials and an additional total charge is prescribed. The surface density function \(\varphi\) is approximated by piece-wise discontinuous shape functions and we employ a weighted residual (or Galerkin) scheme to generate the final discrete equations.
This process leads to a non-symmetric system of boundary integral operators. This BEM matrix is being approximated by a Fast Multipole Method such that a matrix-vector product can be realised with linear complexity. The system is then solved by means of a GMRES method using a diagonal preconditioner.
Once solved, the following quantities are computed
Note that the first two steps require solving systems with a sparse mass matrix as left-hand side for which a CG method is used. Moreover, the second step needs another evaluation of the single layer operator with piece-wise discontinuous trial functions (same as the surface density), but linear continuous test functions. Therefore, another integral operator is constructed temporarily. Once these steps are carried out, the potential and the interior/exterior E-fields are all available on all surfaces.
In the posterior field evaluation, the potential and the E-field are computed at a provided list of points. We make the assumption that these points are not too close to any surface. This evaluation step takes the surface mesh from the main calculation and the provided points into one Octree. Consequently, this code is optimised for the calculation at many points at the same time rather than many subsequent evaluations at just few points.
Here, we give a list of potential shortcomings of the provided code:
fem: order: 1 in the YAML), the output of the
surface density and of the E-field are only at cell-centers in the
VTKHDF file; this is owed to the underlying discontinuous shape
functions and the limitations of the output format.All these limitations can be mended or overcome in future releases with variable implementation efforts.