## 2 Methodology
### Software Structure and Modularization
Other software suites, such as Nastran(r), Optistruct(r), and Ansys(r) would lead to similar linear-elastic notch fatigue results [72] and may be used instead. The pre-processing was conducted using HyperMesh(r)[73], and the post-processing was powered by HyperView(r)[74]; both tasks were completely automated using the integrated Tcl scripting language [75]. As the open-source tool-command-language (Tcl) is a high-level bytecode-interpreted language, the code is interpreted in the first call, and, in subsequent calls, the byte-compiled version is used [76]. The input parameters, such as El Haddad length or load angle stepping, are given as parameters within the calling Tcl script, supporting batch execution of the pre- and post-processing stages. However, it should be noted that the input parameters may be also supplied by a Tk-dialog instead [77]. Scripts calling utility functions in HyperMesh(r) or HyperView(r), such as defining a load case in pre-processing, or querying nodal stress results, must use the integrated Tcl environment. Thus, additional Tcl libraries providing mathematical extensions--such as vector-based arithmetic [78]--cannot be invoked. However, Altair(r) Compose(r)[79] provides an alternative solution, as mathematical functions can be processed using an implementation of the OpenMatrix language [80]. User-defined functions written in the integrated OpenMatrix Language (OML) [81] can be registered to HyperWorks(r) products [82] as auxiliary functions, or within the Templex(r) script language [83]. The corresponding handle is obtainable from the current process handle, inherited from the root Hyper-works interface handle of each client session [84]. In addition, tasks such as computing the curvature for each point along the defect circumference or evaluating the list of elements in the control volume are defined as modules using the Python language [85]. The Compose(r) environment provides an integrated Python compiler and editor, featuring Python version 3.8. This integrated Python version is, again, directly callable by the OML scripting language as synchronous processes. Otherwise, if the modular code design [86] supports asynchronous processes [87], or if multi-processing can be efficiently performed [88], the Python environment can be called externally. This supports the forking of additional sub-processes to significantly speed up the simulation time. Regarding post-processing, local fatigue approaches necessitate either the evaluation of stress results at nodes or strain energy values of elements. As stresses are an element-based result, one has to address the issue of nodal averaging in post-processing, or request transformation of stress results from elements to nodes during the simulation run of the linear-elastic solver. Next, computations such as interpolation of nodal stress results to obtain stress values at points along the TCD-path, or strain energy density assessment of element fractions within the ESED-related control volume, must be performed. These fatigue-related post-processing tasks are implemented, as modules, using the Python3(tm) language. To avoid the need for requesting an extensive amount of additional Ascii outputs by the finite element solver, the binary output database of the solver can be read directly within the Business Edition of Compose(r)[89], or obtained as a pickled temporary dataset using the integrated Abaqus-Python interface. To store the results in a versatile and long-term accessible database format, HDF5(tm) is used as a data model, library, and file format for managing the result data [90]. In addition, scripts using either the OpenMatrix Language and/or Python can interchangeably access this data model. Finally, user-defined results are illustrated, either in a point- or cell-based manner, through the visualization tool kit (VTK) [91], using a Python interface (PyVista) [92].