2
FEI contains quite a lot of very old code. The project began in 1997, just
3
about the same time that C++ was standardized. At the time, C++ compilers
4
didn't uniformly support the standard.
5
- At least one compiler (an early IBM/AIX compiler) didn't initially support
7
- A couple of compilers didn't initially support the bool type.
8
- Some compilers provided <iostream.h> instead of <iostream>, etc.
9
- Several compilers didn't have very good STL implementations.
11
Thus, if you examine the FEI code, you'll notice a number of things:
13
- Many classes are in a namespace, many are not. Basically, the original
14
collection of FEI implementation classes were not put in a namespace. Some
15
of them have been migrated into a namespace, and in recent years all new
16
classes have been created in a namespace.
18
- Macros like FEI_COUT and FEI_ENDL are used instead of std::cout and std::endl.
19
This is because cout and endl weren't always in the std namespace, so these
20
macros are defined appropriately, depending on the C++ implementation being
21
used. These macros are defined in base/fei_iostream.hpp.
23
- There are two primary namespaces: fei and snl_fei. Originally the intent was
24
to put abstract interface classes in the fei namespace, and concrete
25
implementation classes in the snl_fei namespace. (With the assumption that
26
other non-SNL implementations of the abstract interfaces might exist.) But
27
it turned out that our implementation was the only one, and all implementation
28
classes are now being migrated into the fei namespace. The snl_fei namespace
29
still exists, but as time goes by it will contain fewer and fewer classes.
30
Certainly all classes that are intended to be part of the public interface
31
(i.e., not just implementation details) should be in the fei namespace.
33
- In some cases (especially in test input files) you'll see references to the
34
"old fei" and "new fei". Originally FEI was a single large interface that
35
managed all aspects of linear system assembly and solution. This soon
36
suffered from growing pains as more and more features and use-cases were
37
added. A modular collection of interfaces was developed, each representing
38
a logical entity such as a VectorSpace or MatrixGraph, etc. This
39
collection of modular interfaces was referred to as the "new fei", while the
40
original monolithic interface was referred to as the "old fei". The original
41
"old fei" interface still exists, and is declared in base/FEI.hpp. There
42
are two implementations of it, base/FEI_Implementation.{hpp,cpp} and
43
base/fei_FEI_Impl.{hpp,cpp}. The latter implementation basically provides
44
the old interface but uses the newer modular objects internally for the
46
This is admittedly confusing. Most users (especially new users) should
47
simply look through the example programs in example/beam and example/poisson
48
to learn how the "new fei" is used, and completely ignore the existence of