
# PETSc uses /MT
if(MSVC)
    set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
    set(CMAKE_C_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG")
    set(CMAKE_C_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG")
    set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")
    
    set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
    set(CMAKE_CXX_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG")
    set(CMAKE_CXX_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG")
    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")
endif()

# PETSc
set(PETSC_DIR $ENV{PETSC_DIR} CACHE PATH "PETSc path")
set(PETSC_ARCH $ENV{PETSC_ARCH} CACHE PATH "PETSc architecture")

if ("${PETSC_DIR}" STREQUAL "")
    message(FATAL_ERROR "specify PETSC_DIR")
endif()
#if ("${PETSC_ARCH}" STREQUAL "")
#    message(FATAL_ERROR "specify PETSC_ARCH")
#endif()

set(ENV{PETSC_DIR} "${PETSC_DIR}")
set(ENV{PETSC_ARCH} "${PETSC_ARCH}")
set(ENV{BOPT} "O")

find_package(PETSc)
include_directories(${PETSC_INCLUDES})

find_package(MPI)
if(MPI_FOUND)
    include_directories(${MPI_INCLUDE_PATH})
endif(MPI_FOUND)
mark_as_advanced(MPI_LIBRARY)
mark_as_advanced(MPI_EXTRA_LIBRARY)
set(MPI_LINK_LIBRARY TRUE CACHE BOOL "Link MPI Library to executables?")
mark_as_advanced(MPI_LINK_LIBRARY)

set(BTMCS_SOURCES global.cpp global.h ConservLaw.cpp ConservLaw.h quad.cpp pointer.cpp rhs.cpp Jacobian.cpp matrixfree.cpp utility.cpp stsdamg.cpp stsdamg.h CumulateDisplacement.cpp OriginalMatProp.cpp OriginalLandmarks.cpp DeformLandmarks.cpp penalized_neumann.cpp penalized_neumann_mat.cpp Advection.cpp Diffusion.cpp Reaction.cpp Elasticity.cpp ComputeQuant.cpp initialize.cpp InitializeAll.cpp Auxiliary.cpp ReadFiles.cpp common.h function.h PCvar.h RPinclude.h)

add_executable(ForwardSolverDiffusion main_forward_solver.cpp ${BTMCS_SOURCES})
add_executable(LmarkObjective main_optimization.cpp ${BTMCS_SOURCES})

if(MPI_FOUND)
    if(MPI_LINK_LIBRARY)
        if(WIN32)
            target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES} ${MPI_LIBRARIES})
            target_link_libraries(LmarkObjective ${PETSC_LIBRARIES} ${MPI_LIBRARIES})
        else(WIN32)
            target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES} ${MPI_LIBRARIES} -lm)
            target_link_libraries(LmarkObjective ${PETSC_LIBRARIES} ${MPI_LIBRARIES} -lm)
        endif(WIN32)
    else()
        if(WIN32)
            target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES})
            target_link_libraries(LmarkObjective ${PETSC_LIBRARIES})
        else(WIN32)
            target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES} -lm)
            target_link_libraries(LmarkObjective ${PETSC_LIBRARIES} -lm)
        endif(WIN32)
    endif()
else(MPI_FOUND)
    if(WIN32)
        target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES})
        target_link_libraries(LmarkObjective ${PETSC_LIBRARIES})
    else(WIN32)
        target_link_libraries(ForwardSolverDiffusion ${PETSC_LIBRARIES} -lm)
        target_link_libraries(LmarkObjective ${PETSC_LIBRARIES} -lm)
    endif(WIN32)
endif(MPI_FOUND)

set_target_properties(ForwardSolverDiffusion PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
set_target_properties(LmarkObjective PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)

install(TARGETS ForwardSolverDiffusion DESTINATION bin)
install(TARGETS LmarkObjective DESTINATION bin)
