nlfem
nlfem Documentation

Introduction

This library provides a multi threaded assembly routine for a specific class of integral operators. The focus lies on operators of the form

\[ -\mathcal{L}({u})({x}) = 2 \int_{B_{\delta}({x}) \cap \widehat{\Omega}}({C}_\delta({x}, {y}) {u}({x}) - {C}_\delta({y}, {x}){u}({y})) d{y}. \]

where $ {C}({x},{y}) $ is a, possibly strongly singular, matrix-valued integral kernel with bounded interaction radius. The domain $\Omega$ and the interaction set $\Omega_I$ can be subsets of $ R^d $ for $ d = 1,2,3$. The solution can be scalar or vectorvalued, i.e. $ u(x) \in R^n$ for $n \geq 1$.

This implementation addresses researchers who want to verify findings numerically. The computational burden of the assembly of integral operators is so high that even computations in an experimental setting require an efficient implementation. However, we do not aim to provide the fastest possible but rather a flexible implementation which runs at convenient speed.

Assembly

The Python interface calls the function par_assemble() which is a wrapper function. This function again calls the function par_system() where the assembly of the nonlocal stiffness matrix happens, or the function par_forcing() for the assembly of the right hand side. The wrapper function par_assemble() translates the input data into three objects which are defined in MeshStruct, QuadratureStruct, and ConfigurationStruct. It also performs some basic input checks. The output of the integration is saved as sparse matrix. The matrix is then copied again into the Python interface to make it available.

Integration

There are different integration routines available (e.g. integrate_retriangulate(), integrate_baryCenter()). The file integration.cpp also contains the implementations for the underlying truncation methods (e.g. method_retriangulate(), method_baryCenter()).

Model

The kernel and forcing functions, as well as the basis functions are defined in model.cpp. Different options for kernels (e.g. kernel_constant(), kernel_linearPrototypeMicroelastic()), and forcing terms (e.g. f_linear()) are implemented. If you want to add a kernel or forcing function just add the corresponding function to model.cpp obeying the common function signature. In order to make it accessible as option you have to change the function lookup_configuration() accordingly.