# For the installer process we need a single directory # where we put all module files SET(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/fmodules CACHE PATH "Directory for Fortran modules") ADD_SUBDIRECTORY(binio) ADD_SUBDIRECTORY(modules) ADD_SUBDIRECTORY(view3d) ADD_SUBDIRECTORY(viewaxis) IF(WITH_MPI) SET(ELMERSOLVER_OUTPUT_NAME "ElmerSolver_mpi") ELSE() SET(ELMERSOLVER_OUTPUT_NAME "ElmerSolver") ENDIF() SET(prefix "${CMAKE_INSTALL_PREFIX}") SET(solverlib_SOURCES AddrFunc.F90 NavierStokes.F90 NavierStokesGeneral.F90 NavierStokesCylindrical.F90 Lists.F90 DiffuseConvectiveAnisotropic.F90 LoadMod.F90 DiffuseConvectiveGeneralAnisotropic.F90 PElementMaps.F90 PElementBase.F90 ElementDescription.F90 Integration.F90 ListMatrixArray.F90 ModelDescription.F90 GeneralUtils.F90 Stress.F90 StressGeneral.F90 LinearAlgebra.F90 CoordinateSystems.F90 ListMatrix.F90 CRSMatrix.F90 BandMatrix.F90 BandwidthOptimize.F90 BlockSolve.F90 MaterialModels.F90 DirectSolve.F90 IterSolve.F90 IterativeMethods.F90 TimeIntegrate.F90 Types.F90 SolveBand.F90 ElementUtils.F90 Radiation.F90 fft.c Load.c Differentials.F90 FreeSurface.F90 Walls.F90 SolverUtils.F90 SolveSBand.F90 CPUTime.c Interpolation.F90 MainUtils.F90 Adaptive.F90 EigenSolve.F90 HashTable.F90 MeshUtils.F90 SaveUtils.F90 SParIterGlobals.F90 SParIterComm.F90 SParIterPrecond.F90 SParIterSolver.F90 Messages.F90 Multigrid.F90 Smoothers.F90 ClusteringMethods.F90 ParallelUtils.F90 ParallelEigenSolve.F90 solve_cmplx.F90 solve_real.F90 MGPrec.F90 DefUtils.F90 MeshPartition.F90 MeshRemeshing.F90 CutFEMUtils.F90 RadiationFactors.F90 f_stubs.c ExchangeCorrelations.F90 SolveHypre.c amgx.c rocalution.cpp SolverActivate_x.F90 SolveTrilinos.cxx SolveSuperLU.c umf4_f77wrapper.c VankaCreate.F90 ParticleUtils.F90 Feti.F90 cholmod.c InterpolateMeshToMesh.F90 InterpVarToVar.F90 LinearForms.F90 H1Basis.F90 CircuitUtils.F90 BackwardError.F90 ElmerSolver.F90 MagnetoDynamicsUtils.F90 LumpingUtils.F90 ZirkaHysteresis.F90 SolidMechanicsUtils.F90 MatrixAssembly.F90 OptimizationUtils.F90 MeshGenerate.F90) #SET_PROPERTY(SOURCE MaxwellAxiS.F90 PROPERTY # COMPILE_DEFINITIONS FULL_INDUCTION) IF(WITH_EXTOPTIM) LIST(APPEND solverlib_SOURCES minpack.F90 minpack_kinds.F90 PowellOptBobyqa.F90 PowellOptNewuoa.F90) SET(HAVE_EXTOPTIM TRUE) ENDIF() IF(WITH_LUA) INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR}) LIST(APPEND solverlib_SOURCES Lua.F90 elmer_lua_iface.c) INSTALL(DIRECTORY lua-scripts DESTINATION share/elmersolver/ PATTERN lua-scripts/*.lua) FILE(GLOB DEFAULT_LUA_SCRIPTS "lua-scripts/*.lua") FILE(COPY ${DEFAULT_LUA_SCRIPTS} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/share/elmersolver/lua-scripts/) ELSE() LIST(APPEND solverlib_SOURCES Lua.F90) ENDIF() IF(HAVE_FETI4I) LIST(APPEND solverlib_SOURCES ${FETI4I_INTERFACE_SOURCE}) ENDIF() #FILE(GLOB SRC_FILES *.src) #FOREACH(FNAME ${SRC_FILES}) #GET_FILENAME_COMPONENT(BASENAME ${FNAME} NAME_WE) #ADD_CUSTOM_COMMAND( #OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.F90 #COMMAND ${CMAKE_COMMAND} -E copy ${FNAME} #${CMAKE_CURRENT_BINARY_DIR}/${BASENAME}.F90 #DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${BASENAME}.src #) #ENDFOREACH() INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}/fem/src") INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/fhutiter/src") INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/binio") INCLUDE_DIRECTORIES("${PROJECT_BINARY_DIR}/fhutiter/src") IF(WITH_Trilinos) IF(NOT Epetra_INCLUDE_DIRS) GET_TARGET_PROPERTY(Epetra_INCLUDE_DIRS Epetra::epetra INTERFACE_INCLUDE_DIRECTORIES) ENDIF() IF(NOT ML_INCLUDE_DIRS) GET_TARGET_PROPERTY(ML_INCLUDE_DIRS ML::ml INTERFACE_INCLUDE_DIRECTORIES) ENDIF() INCLUDE_DIRECTORIES("${Epetra_INCLUDE_DIRS}") INCLUDE_DIRECTORIES("${ML_INCLUDE_DIRS}") ENDIF() # Extract additional compile flags GET_DIRECTORY_PROPERTY( ELMER_CDEFS COMPILE_DEFINITIONS ) FOREACH( d ${ELMER_CDEFS} ) SET(ELMER_F90FLAGS "${ELMER_F90FLAGS} -D${d}") ENDFOREACH() # Extract compile flags arising from build type IF(CMAKE_BUILD_TYPE) STRING(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPCASE) SET(ELMER_F90FLAGS "${ELMER_F90FLAGS} ${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_UPCASE}}") MARK_AS_ADVANCED(CMAKE_BUILD_TYPE_UPCASE) ENDIF(CMAKE_BUILD_TYPE) # Output elmerf90 and elmerld SET(HAVE_ELMERICE "FALSE") IF(WITH_ElmerIce) SET(HAVE_ELMERICE "TRUE") ENDIF() IF(WIN32) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elmerf90.bat.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/elmerf90.bat) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elmerld.bat.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/elmerld.bat) ENDIF() CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elmerf90-nosh.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/elmerf90-nosh) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elmerf90.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/elmerf90) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elmerld.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/elmerld) # Create pkg-config file if requested and place it under ${PKGCONFIG_PC_PATH} # Defaults: PKGCONFIG_PC_PATH = ${CMAKE_INSTALL_PREFIX}/share/pkgconfig IF(CREATE_PKGCONFIG_FILE) SET(PKGCONFIG_PC_PATH "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Path where to install elmer pkg-config file") CONFIGURE_FILE(elmer.pc.cmake elmer.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/elmer.pc DESTINATION ${PKGCONFIG_PC_PATH}) ENDIF(CREATE_PKGCONFIG_FILE) # Copy elements.def and SOLVER.KEYWORDS (to enable testing) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/elements.def ${CMAKE_CURRENT_BINARY_DIR}/elements.def COPYONLY) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/SOLVER.KEYWORDS ${CMAKE_CURRENT_BINARY_DIR}/SOLVER.KEYWORDS COPYONLY) IF (NOT MPI_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/mpif_stub.h ${CMAKE_CURRENT_BINARY_DIR}/mpif.h COPYONLY) # add path to stub header to dummy import target target_include_directories(Elmer::MPI_Fortran INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) ENDIF() ADD_LIBRARY(mpi_stubs SHARED mpif_stubs.F90) ADD_LIBRARY(elmersolver SHARED ${solverlib_SOURCES}) SET_TARGET_PROPERTIES(mpi_stubs PROPERTIES LINKER_LANGUAGE Fortran) SET_TARGET_PROPERTIES(elmersolver PROPERTIES LINKER_LANGUAGE Fortran) #We want MMG & Zoltan in the RPATH (if found), but given how many other #components use ELMERSOLVER_RPATH_STRING, it seemed best to make #a local copy just for ElmerSolver and libelmersolver SET(ELMERSOLVER_RPATH_STRING_MOD "${ELMERSOLVER_RPATH_STRING}") IF(HAVE_MMG) TARGET_LINK_LIBRARIES(elmersolver ${MMG_LIBRARY}) SET(ELMERSOLVER_RPATH_STRING_MOD "${ELMERSOLVER_RPATH_STRING_MOD}:${MMG_LIBDIR}") SET(ELMERLIB_RPATH_STRING "${ELMERLIB_RPATH_STRING}:${MMG_LIBDIR}") #TODO - add to RPath ENDIF() IF(HAVE_PARMMG) TARGET_LINK_LIBRARIES(elmersolver ${PARMMG_LIBRARY}) SET(ELMERSOLVER_RPATH_STRING_MOD "${ELMERSOLVER_RPATH_STRING_MOD}:${PARMMG_LIBDIR}") SET(ELMERLIB_RPATH_STRING "${ELMERLIB_RPATH_STRING}:${PARMMG_LIBDIR}") #TODO - add to RPath ENDIF() IF(HAVE_ZOLTAN) IF(USE_SYSTEM_ZOLTAN) TARGET_LINK_LIBRARIES(elmersolver Zoltan::zoltan) ELSE() ADD_DEPENDENCIES(elmersolver zoltan) TARGET_LINK_LIBRARIES(elmersolver ${ZOLTAN_LIBRARY}) ENDIF() IF(Zoltan_ENABLE_ParMETIS) TARGET_LINK_LIBRARIES(elmersolver ${ParMetis_LIBRARIES}) ENDIF() # SET(ELMERSOLVER_RPATH_STRING_MOD "${ELMERSOLVER_RPATH_STRING_MOD}/:${ZOLTAN_LIBDIR}") # SET(ELMERLIB_RPATH_STRING "${ELMERLIB_RPATH_STRING}/:${ZOLTAN_LIBDIR}") ENDIF() # ElmerSolver libraries SET(ELMERSOLVER_LIBRARIES matc fhuti binio arpack) IF(UMFPACK_FOUND) # external implementation of UMFPACK LIST(APPEND ELMERSOLVER_LIBRARIES ${UMFPACK_LIBRARIES}) TARGET_INCLUDE_DIRECTORIES(elmersolver PRIVATE ${UMFPACK_INCLUDE_DIR}) #LIST(APPEND ELMERSOLVER_LIBRARIES ${UMFPACK_LIBRARIES}) #TARGET_LINK_LIBRARIES(elmersolver "${UMFPACK_LIBRARIES}") ELSE() # bundled UMFPACK LIST(APPEND ELMERSOLVER_LIBRARIES umfpack amd) TARGET_INCLUDE_DIRECTORIES(elmersolver PRIVATE ${PROJECT_SOURCE_DIR}/umfpack/src/umfpack/include) ENDIF() LIST(APPEND ELMERSOLVER_LIBRARIES ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} ${CMAKE_DL_LIBS}) IF(WITH_LUA) LIST(APPEND ELMERSOLVER_LIBRARIES ${LUA_LIBRARIES}) ENDIF() ADD_EXECUTABLE(Solver_TGT Solver.F90) SET_TARGET_PROPERTIES(Solver_TGT PROPERTIES OUTPUT_NAME "${ELMERSOLVER_OUTPUT_NAME}") IF(NOT(WIN32)) MESSAGE(STATUS " ELMERSOLVER_RPATH_STRING_MOD " ${ELMERSOLVER_RPATH_STRING_MOD}) MESSAGE(STATUS " ELMERLIB_RPATH_STRING " ${ELMERLIB_RPATH_STRING}) SET_TARGET_PROPERTIES(Solver_TGT PROPERTIES INSTALL_RPATH "${ELMERSOLVER_RPATH_STRING_MOD}") SET_TARGET_PROPERTIES(elmersolver PROPERTIES INSTALL_RPATH "${ELMERLIB_RPATH_STRING}") ENDIF() IF(NOT(WITH_MPI)) TARGET_LINK_LIBRARIES(elmersolver mpi_stubs ${ELMERSOLVER_LIBRARIES}) TARGET_LINK_LIBRARIES(Solver_TGT elmersolver) ENDIF() IF(WITH_MPI) #ADD_LIBRARY(elmersolver_mpi SHARED ${solverlib_SOURCES}) # Add parpack and possibly others IF(Mumps_LIBRARIES) INCLUDE_DIRECTORIES(${Mumps_INCLUDE_DIR}) # Link to SCALAPACK implicitly LIST(APPEND ELMERSOLVER_LIBRARIES ${Mumps_LIBRARIES}) ELSEIF(MKL_CPARDISO_FOUND) # Mumps includes SCALAPACK, but it is needed with CPARDISO LIST(APPEND ELMERSOLVER_LIBRARIES ${SCALAPACK_LIBRARIES}) ENDIF() IF(Hypre_LIBRARIES) LIST(APPEND ELMERSOLVER_LIBRARIES Elmer::MPI_C ${Hypre_LIBRARIES}) ENDIF() IF(NETCDF_LIBRARIES) LIST(APPEND ELMERSOLVER_LIBRARIES ${NETCDF_LIBRARIES}) IF(PHDF5_LIBRARIES) LIST(APPEND ELMERSOLVER_LIBRARIES ${PHDF5_LIBRARIES}) ENDIF() ENDIF() IF(FETI4I_LIBRARIES) LIST(APPEND ELMERSOLVER_LIBRARIES ${FETI4I_LIBRARIES}) ENDIF() IF(XIOS_LIBRARIES) LIST(APPEND ELMERSOLVER_LIBRARIES ${XIOS_LIBRARIES}) ENDIF() # Executable TARGET_LINK_LIBRARIES(Solver_TGT Elmer::MPI_Fortran elmersolver ${ELMERSOLVER_LIBRARIES}) # Library object TARGET_LINK_LIBRARIES(elmersolver Elmer::MPI_Fortran ${ELMERSOLVER_LIBRARIES} parpack) SET(SERIAL_SOLVER_FILEPATH "${CMAKE_INSTALL_PREFIX}/bin/ElmerSolver") SET(MPI_SOLVER_FILEPATH "${CMAKE_INSTALL_PREFIX}/bin/${ELMERSOLVER_OUTPUT_NAME}") ENDIF() IF(MPI_Fortran_HAVE_F90_MODULE) TARGET_COMPILE_DEFINITIONS(elmersolver PRIVATE ELMER_HAVE_MPI_MODULE) ELSE() # Either the header from an actual MPI implementation or the replacement stub TARGET_COMPILE_DEFINITIONS(elmersolver PRIVATE ELMER_HAVE_MPIF_HEADER) ENDIF() IF(WITH_ROCALUTION) TARGET_LINK_LIBRARIES(elmersolver roc::rocalution) ENDIF() IF(WITH_AMGX) TARGET_LINK_LIBRARIES(elmersolver Elmer::MPI_C "${AMGX_LIBRARY};${CUDA_LIBRARIES}") TARGET_INCLUDE_DIRECTORIES(elmersolver PRIVATE "${CUDA_INCLUDE_DIRS}") ENDIF() IF(WITH_Trilinos) TARGET_LINK_LIBRARIES(elmersolver Elmer::MPI_CXX "${Trilinos_LIBRARIES};${ML_LIBRARIES};${Epetra_LIBRARIES};${Teuchos_LIBRARIES}") ENDIF() IF (WITH_CHOLMOD) SET(CURR_CFLAGS "-DHAVE_CHOLMOD") TARGET_INCLUDE_DIRECTORIES(elmersolver PRIVATE "${CHOLMOD_INCLUDE_DIR};${SPQR_INCLUDE_DIR}") TARGET_LINK_LIBRARIES(elmersolver "${CHOLMOD_LIBRARIES};${SPQR_LIBRARIES}") ENDIF() # elmersolver -library #TARGET_LINK_LIBRARIES(elmersolver ${ELMERSOLVER_LIBRARIES}) ## ElmerSolver serial #IF(NOT(NO_SERIAL_BINARY)) #TARGET_LINK_LIBRARIES(elmersolver mpi_stubs ${ELMERSOLVER_LIBRARIES}) #TARGET_LINK_LIBRARIES(ElmerSolver elmersolver) #ENDIF() # ElmerSolver #ADD_EXECUTABLE(ElmerSolver Solver.F90) #TARGET_LINK_LIBRARIES(ElmerSolver ${ELMERSOLVER_LIBRARIES} #mpi_stubs) # ViewFactors ADD_EXECUTABLE(ViewFactors ViewFactors.F90) SET_TARGET_PROPERTIES(ViewFactors PROPERTIES LINKER_LANGUAGE Fortran) # TARGET_INCLUDE_DIRECTORIES(ViewFactors PUBLIC ${CMAKE_BINARY_DIR}/fem/src/view3d) # TARGET_INCLUDE_DIRECTORIES(ViewFactors PUBLIC ${CMAKE_BINARY_DIR}/fem/src/viewfactors) # FIND_LIBRARY(VIEW3D_LIBRARIES PATHS ${CMAKE_CURRENT_BINARY_DIR}/view3d) # FIND_LIBRARY(VIEWAXIS_LIBRARIES PATHS ${CMAKE_CURRENT_BINARY_DIR}/viewaxis) TARGET_LINK_LIBRARIES(ViewFactors view3d viewaxis elmersolver) INSTALL(TARGETS ViewFactors RUNTIME DESTINATION "bin") IF(NOT(WIN32)) SET_TARGET_PROPERTIES(ViewFactors PROPERTIES INSTALL_RPATH "${ELMERSOLVER_RPATH_STRING}") ENDIF() # Radiators ADD_EXECUTABLE(Radiators Radiators.F90) SET_TARGET_PROPERTIES(Radiators PROPERTIES LINKER_LANGUAGE Fortran) # TARGET_INCLUDE_DIRECTORIES(Radiators PUBLIC ${CMAKE_BINARY_DIR}/fem/src/view3d) # TARGET_INCLUDE_DIRECTORIES(Radiators PUBLIC ${CMAKE_BINARY_DIR}/fem/src/viewfactors) # FIND_LIBRARY(VIEW3D_LIBRARIES PATHS ${CMAKE_CURRENT_BINARY_DIR}/view3d) # FIND_LIBRARY(VIEWAXIS_LIBRARIES PATHS ${CMAKE_CURRENT_BINARY_DIR}/viewaxis) TARGET_LINK_LIBRARIES(Radiators view3d viewaxis elmersolver) INSTALL(TARGETS Radiators RUNTIME DESTINATION "bin") IF(NOT(WIN32)) SET_TARGET_PROPERTIES(Radiators PROPERTIES INSTALL_RPATH "${ELMERSOLVER_RPATH_STRING}") ENDIF() # Installation rules INSTALL(FILES elements.def SOLVER.KEYWORDS DESTINATION "share/elmersolver/lib") IF(NOT(WIN32)) IF(WITH_MPI) INSTALL(TARGETS Solver_TGT elmersolver RUNTIME DESTINATION "bin" LIBRARY DESTINATION "${ELMER_INSTALL_LIB_DIR}") INSTALL(TARGETS Solver_TGT RUNTIME DESTINATION "bin" LIBRARY DESTINATION "${ELMER_INSTALL_LIB_DIR}") ELSE() INSTALL(TARGETS Solver_TGT elmersolver mpi_stubs RUNTIME DESTINATION "bin" LIBRARY DESTINATION "${ELMER_INSTALL_LIB_DIR}") ENDIF() ELSE() INSTALL(TARGETS elmersolver mpi_stubs RUNTIME DESTINATION "${ELMER_INSTALL_LIB_DIR}" LIBRARY DESTINATION "${ELMER_INSTALL_LIB_DIR}") INSTALL(TARGETS Solver_TGT elmersolver mpi_stubs RUNTIME DESTINATION "bin" LIBRARY DESTINATION "${ELMER_INSTALL_LIB_DIR}") ENDIF() IF(WIN32) INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/elmerf90.bat DESTINATION "bin") INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/elmerld.bat DESTINATION "bin") ENDIF() INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/elmerf90 DESTINATION "bin") INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/elmerld DESTINATION "bin") INSTALL(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/. DESTINATION "share/elmersolver/include") IF(WITH_MPI) IF(NOT(WIN32)) # INSTALL(CODE " # EXECUTE_PROCESS(COMMAND \${CMAKE_COMMAND} -E create_symlink ElmerSolver_mpi ElmerSolver # WORKING_DIRECTORY \${CMAKE_INSTALL_PREFIX}/bin)") ADD_CUSTOM_TARGET(elmersolver_link ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ElmerSolver_mpi ElmerSolver) ADD_DEPENDENCIES(elmersolver_link Solver_TGT) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/ElmerSolver DESTINATION "bin") ELSE() INSTALL(CODE "EXECUTE_PROCESS(COMMAND \${CMAKE_COMMAND} -E copy \${CMAKE_INSTALL_PREFIX}/bin/ElmerSolver_mpi.exe \${CMAKE_INSTALL_PREFIX}/bin/ElmerSolver.exe)") ENDIF() ENDIF()