Upgrading to IBAMR 1.0

The next planned release (ETA fall of 2020) of IBAMR is 1.0: this release, currently under development in the GitHub repository, introduces some breaking changes necessary for compatibility with libraries IBAMR depends upon.

Compiling the current IBAMR 1.0 prerelease

The master branch in the GitHub repository tracks what will become the IBAMR 1.0 release. at the present time it can be compiled by following the same instructions used for IBAMR 0.7.1: the C++11 version flag, when needed, will be added automatically.

C++ version changes

Like IBAMR 0.7.1, IBAMR 1.0 will require C++11 or newer. This requirement does not change any IBAMR interfaces and will not require changes to any user codes. In particular, no changes were made to the examples. However, if you wish to contribute to IBAMR, or want to update your code to use the C++11 features, then we suggest using the following features: the heavy use of auto, range-based for loops, and default member utilization in the header file where appropriate. Note that auto should only be used when the type name would be duplicated, or the type name is clear from the initialization, for example:

for (std::set<int>::iterator cit = seed_set.begin(); cit != seed_set.end(); ++cit)
int n = static_cast<int>(3.0);

should transform to

for (const auto& seed : seed_set) // New range-based for loop
auto n = static_cast<int>(3.0);

We also prefer that default initializations for class member variables be done in the header files instead of in the constructor.

The C++11 updates were mostly done using the clang-tidy tool provided by LLVM. In order to use clang-tidy on your branch of IBAMR, you will need a compilation database. To set this up with the build system IBAMR uses, we suggest using BEAR. Note that IBMAR currently contains two separate libraries IBTK and IBAMR, so you will need to run clang-tidy on each of these libraries separately. Once you have generated the compilation database, you can run the clang-tidy tool on the library using the script run-clang-tidy.py provided by LLVM. The checks that were used on IBAMR include:

modernize-deprecated-headers
modernize-loop-convert
modernize-pass-by-value
modernize-shrink-to-fit
modernize-use-auto
modernize-use-bool-literals
modernize-use-default-member-init
modernize-use-equals-default
modernize-use-equals-delete
modernize-use-nullptr
modernize-use-override
modernize-use-using

We suggest that each of these changes be run individually with results checked along the way to make spotting errors easier. Note that you may need to have an updated version of the LLVM compiler to access some of these checks.

SAMRAI version changes

The IBAMR developers are currently converting the library to use SAMRAI 3.12 instead of SAMRAI 2.4.4. Newer versions of SAMRAI are, in general, not compatible with older versions: many classes have been renamed, Pointer has been replaced by std::shared_ptr, and most classes are no longer templated on the spatial dimension.

The IBAMR developers are preparing a set of scripts that will convert nearly all SAMRAI 2.4.4 code into SAMRAI 3.12 code. More information will be posted here once this is complete.