Using IBAMR with your application when IBAMR was set up with CMake

If you used CMake to compile and install IBAMR then you can manage it like a normal CMake-based dependency. You can configure your project (here assumed to consist of a single file main.cpp) with the following CMakeLists.txt script:

PROJECT(mysolver)
CMAKE_MINIMUM_REQUIRED(VERSION 3.15.0)

# List your source files here - this example has just one.
SET(SOURCE_FILES main.cpp)
ADD_EXECUTABLE(main2d ${SOURCE_FILES})

FIND_PACKAGE(IBAMR 0.13.0 REQUIRED)
TARGET_LINK_LIBRARIES(main2d IBAMR::IBAMR2d)
# IBAMR saves the flags it used to compile - you can reuse them if you want to
SET(CMAKE_CXX_FLAGS ${IBAMR_CXX_FLAGS})

If you are working in 3D then you should add

TARGET_LINK_LIBRARIES(main3d IBAMR::IBAMR3d)

instead. Having both lines will set up executables main2d and main3d in 2D and 3D, respectively. Listing IBAMR::IBAMR2d or IBAMR::IBAMR3d automatically sets up the relevant CMake target, in this case one of the executables, to depend on IBAMR and its dependencies and also sets NDIM to the correct value. You can add more CMake-based dependencies with TARGET_LINK_LIBRARIES() in the same way.

Once you have written a CMakeLists.txt script, in the same directory as your code run cmake as

cmake -DIBAMR_ROOT=/path/to/ibamr/installation ./

in which /path/to/ibamr/installation should be replaced by the directory path (either relative or absolute) to the installation location of IBAMR.

Using IBAMR with your application when IBAMR was set up with ./configure

See Examples for how to use one of the examples as a scaffold for your application.

To compile an application that depends on the IBAMR library, it is necessary to link to the IBAMR library. The following Makefile for 2D application demonstrates one way to do this:

2D Makefile

######################################################################
## Here specify the location of the IBAMR source and the location
## where IBAMR has been built.

IBAMR_SRC_DIR = /path/to/IBAMR_SRC_DIR
IBAMR_BUILD_DIR = /path/to/IBAMR_BUILD_DIR

######################################################################
## Include variables specific to the particular IBAMR build.
include $(IBAMR_BUILD_DIR)/config/make.inc

## Needed for Xcode to capture compiler errors and warnings.
ifdef XCODE_VERSION_ACTUAL
CXXFLAGS += -fno-color-diagnostics
endif

######################################################################
## Build the application.
##
## NOTE: The following assumes that all .cpp files in the present
##       directory are used to build the executable.

SRC = $(wildcard *.cpp)
CPPFLAGS += -MD -MP
PDIM = 2
OBJS = $(SRC:%.cpp=%.o) $(IBAMR_LIB_2D) $(IBTK_LIB_2D)

main2d: $(OBJS)
	$(CXX) $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -DNDIM=$(PDIM) -o $@
clean:
	$(RM) main2d
	$(RM) *.o *.lo *.objs *.ii *.int.c
	$(RM) -r .libs

-include $(SRC:%.cpp=%.d)

Then, for this example, make main2d would compile the application using the 2D libraries.

If you instead set PDIM = 3 and other instances of 2D to 3D, then the application would compile against the 3D libraries. (See below)

3D Makefile

######################################################################
## Here specify the location of the IBAMR source and the location
## where IBAMR has been built.
IBAMR_SRC_DIR = /home/elijah/sfw/ibamr/IBAMR
IBAMR_BUILD_DIR = /home/elijah/sfw/ibamr/ibamr_master_build

######################################################################
## Include variables specific to the particular IBAMR build.
include $(IBAMR_BUILD_DIR)/config/make.inc

## Needed for Xcode to capture compiler errors and warnings.
ifdef XCODE_VERSION_ACTUAL
CXXFLAGS += -fno-color-diagnostics
endif

######################################################################
## Build the application.
##
## NOTE: The following assumes that all .cpp files in the present
##       directory are used to build the executable.

SRC = $(wildcard *.cpp)
CPPFLAGS += -MD -MP
PDIM = 3
OBJS = $(SRC:%.cpp=%.o) $(IBAMR_LIB_3D) $(IBTK_LIB_3D)

main3d: $(OBJS)
	$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -DNDIM=$(PDIM) -o main3d

clean:
	$(RM) main3d_thin exe
	$(RM) *.o *.lo *.objs *.ii *.int.c
	$(RM) -r .libs

-include $(SRC:%.cpp=%.d)