POLARIS

TAILSIT GmbH

2026-09-16

Abstract
Electrostatic solver for dielectric design based on the Boundary Element Method

TL;DR

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.


Non-Commercial Software License

Copyright © 2026 TAILSIT GMBH

Permission is granted, free of charge, to use and copy this software (the “Software”), subject to the following terms:

  1. Non-commercial use. The Software may be used only for personal, educational, research, or other non-commercial purposes.
  2. No commercial use. You may not use the Software, directly or indirectly, as part of a commercial product or service, or in connection with an activity primarily intended to generate revenue, without obtaining a separate commercial license from TAILSIT.
  3. No modification or reverse engineering. You may not modify, adapt, translate, decompile, disassemble, or otherwise attempt to derive the source code of the Software, except to the extent that such restriction is prohibited by applicable law.
  4. Redistribution. You may redistribute unmodified copies of the Software for non-commercial purposes, provided that this license and the copyright notice are included with each copy.
  5. No sublicensing. You may not sublicense, sell, rent, lease, or otherwise transfer the Software for commercial purposes.
  6. No warranty. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. TO THE MAXIMUM EXTENT PERMITTED BY LAW, TAILSIT SHALL NOT BE LIABLE FOR ANY DAMAGES ARISING FROM THE USE OF THE SOFTWARE.

Any use of the Software that does not qualify as non-commercial use requires a separate written license from TAILSIT.

Installation and dependencies

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:

The license file

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:

Linux

Windows

If you want to choose an arbitrary destination, point to it by declaring the environment variable POLARIS_LICENSE_FILE.

Dependencies

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.

Usage

Pre-processor

You will find a browser-based pre-processor here, which allows you to

  1. Convert GMSH *.msh files or Nastran *.bdf files to our custom format (*.mesh files, see Mesh format description)
  2. Generate a *.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.

Input mesh file format

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.

Input settings file

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: 0

The 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.34

which 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.00

defining that the part with ID 345 has a prescribed voltage of 100.

floatings holds a list of floating potentials like

    partId: 456
    charge: -20

which defines that the part with ID 456 represents a floating potential whose total charge shall be -20.

Main run

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:

  1. Visualisation of the surface data in ParaView. Here, you will find the following data

  2. Posterior field evaluation. The output file also holds all relevant solution data in order to execute a field value computation.

Posterior run

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.

Examples

Currently, the following three examples are provided

  1. Sphere and bicone
  2. Concentric spherical shells
  3. High-voltage bushing

Technical background

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.

Known limitations

Here, we give a list of potential shortcomings of the provided code:

All these limitations can be mended or overcome in future releases with variable implementation efforts.