A Look at the Fem Package

The framework is a collection of libraries that provide functions for doing finite element analysis. It was implemented using an object-oriented extension of Mathematica's internal programming language, Classes, by Roman Maeder. There is a complementary version which uses a math library written in C++ for solving larger problems. Usually, after prototyping a problem completely in Mathematica, I automatically generated a C++ equivalent. The logical structure of an FEM problem is common in both languages. The framework can be accessed easily during a Mathematica session.

The primary objects in the framework are called `Fem`, `FemNode`, and `FemElement`. `Fem` provides the context which captures the global problem's structure and provides access to global operations such as assembly, display, and so on. It contains a finite element mesh, which is an unstructured mesh that is a set of elements and a set of nodes. Nodes represent points in space. Elements define a topological relationship between the nodes. `FemNode` abstracts the finite element node and contains the point in some space that it represents. `FemElement` abstracts the element-level operations such as the element integrals and matrices. `FemElement` contains an ordered list of nodes that defines the topology of the element. `FemElement` also provides the basis functions for the element and rules of element quadrature, i.e., Gaussian integration.

`FemElement` is an abstract class; there should not be any instances of it. It provides the behavior common to all elements. The subclasses of the `FemElement` provide the behavior for specific element types. A typical class hierarchy for `FemElement` follows.

```FemElement
TimeElement
TwoNodeLineTime
SpaceTimeElement
SpatialElement
TwoNodeLine
ThreeNodeLine
FourNodeLine
EightNodeBrick
FifteenNodeBrick
TwentySevenNodeBrick
FourNodeTetrahedron
TenNodeTetrahedron