cmake_minimum_required(VERSION 3.15)
project(aenet Fortran)




find_package(MPI    REQUIRED)



add_library(lbfgsb STATIC )

set(URL "http://ann.atomistic.net/files/aenet-2.0.3.tar.bz2")
message(STATUS "URL=${URL}")

if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
  # using GCC
  #message(STATUS "GCC.")
  #add_definitions("-fdefault-integer-8")
else()
message(STATUS ${CMAKE_Fortran_COMPILER_ID})
  #add_definitions("-i4")
endif()




set(FILE_NAME "aenet-2.0.3.tar.bz2")
set(aenet_PATH "${CMAKE_CURRENT_SOURCE_DIR}/aenetlib")
set(FILE_PATH "${aenet_PATH}/${FILE_NAME}")

if(NOT EXISTS ${FILE_PATH})
    # ダウンロード
    file(MAKE_DIRECTORY "${aenet_PATH}")
    file(DOWNLOAD "${URL}" "${FILE_PATH}" SHOW_PROGRESS)

    message(STATUS "extracting...")
    execute_process(
        COMMAND ${CMAKE_COMMAND} -E tar xvf "${FILE_PATH}"
        WORKING_DIRECTORY "${aenet_PATH}"
    )
    execute_process(
      COMMAND ${CMAKE_COMMAND} -E tar xvf "${aenet_PATH}/aenet-2.0.3/lib/Lbfgsb.3.0.tar.gz"
      WORKING_DIRECTORY "${aenet_PATH}/aenet-2.0.3/lib/"
    )
    message(STATUS "extracted.")
else()
    message(STATUS "${FILE_NAME} already downloaded.")
endif()

if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src_modified)
message(STATUS "apply patch.")
execute_process(
        COMMAND cp -r  "${aenet_PATH}/aenet-2.0.3/lib" ./
        COMMAND cp -r  "${aenet_PATH}/aenet-2.0.3/src" ./
        COMMAND sh apply_patch.sh
        #COMMAND cp  "${CMAKE_SOURCE_DIR}/src.patch" "${aenet_PATH}/aenet-2.0.3/"
        #COMMAND cp  "${CMAKE_SOURCE_DIR}/apply_patch.sh" "${aenet_PATH}/aenet-2.0.3/"
        #COMMAND cd "${aenet_PATH}/aenet-2.0.3"
        #COMMAND cp -r "${aenet_PATH}/aenet-2.0.3/src" "${aenet_PATH}/aenet-2.0.3/src_modified"
        #COMMAND patch -u -p1 -d "${aenet_PATH}/aenet-2.0.3/src_modified" < "${aenet_PATH}/aenet-2.0.3/src.patch"
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    )
message(STATUS "done.")
endif()

add_custom_command(
  TARGET lbfgsb
  POST_BUILD
  COMMAND cp  $<TARGET_FILE:lbfgsb>  ${CMAKE_SOURCE_DIR}
)

set(LBFGSB ${CMAKE_CURRENT_SOURCE_DIR}/aenetlib/aenet-2.0.3/lib/Lbfgsb.3.0)

target_sources(lbfgsb
PRIVATE
${LBFGSB}/blas.f
${LBFGSB}/lbfgsb.f
${LBFGSB}/linpack.f
${LBFGSB}/timer.f
)


add_library(aenet STATIC)
target_link_libraries(aenet PRIVATE lbfgsb)

set(aenet_dir ${CMAKE_CURRENT_SOURCE_DIR}/src_modified)

target_sources(aenet
PRIVATE
${aenet_dir}/ext/chebyshev.f90 
${aenet_dir}/ext/feedforward.f90  
${aenet_dir}/ext/io.f90  
${aenet_dir}/ext/lclist.f90  
${aenet_dir}/ext/sfbasis.f90  
${aenet_dir}/ext/sortlib.f90  
${aenet_dir}/ext/symmfunc.f90  
${aenet_dir}/ext/timing.f90
  ${aenet_dir}/ext/unittest.f90  
  ${aenet_dir}/ext/xsflib.f90
)


target_sources(aenet
PRIVATE
${aenet_dir}/aenet.f90 
${aenet_dir}/aeio.f90
${aenet_dir}/constants.f90
${aenet_dir}/geometry.f90
${aenet_dir}/input.f90
${aenet_dir}/optimize.f90
${aenet_dir}/parallel.F90
${aenet_dir}/potential.f90
${aenet_dir}/random.f90
${aenet_dir}/sfsetup.f90
${aenet_dir}/trainset.f90
${aenet_dir}/trainset_MPI.f90
${aenet_dir}/aenet_predict.F90
${aenet_dir}/aenet_generate.F90
${aenet_dir}/aenet_train.f90
${aenet_dir}/aenet_generate_mpi.F90
)

add_custom_command(
  TARGET aenet
  PRE_BUILD
  COMMAND cd "${aenet_PATH}/aenet-2.0.3"
)

set(aenet_dir aenetlib/aenet-2.0.3)



if(MPI_COMPILE_FLAGS)
#  set_target_properties(pytorchtest PROPERTIES
#    COMPILE_FLAGS "${MPI_COMPILE_FLAGS}")
  set_target_properties(aenet  PROPERTIES
    COMPILE_FLAGS "${MPI_COMPILE_FLAGS}")

endif()


include_directories(SYSTEM ${MPI_C_INCLUDE_PATH} ${MPI_CXX_INCLUDE_PATH})

target_link_libraries(aenet PRIVATE ${MPI_LIBRARIES})
target_include_directories(aenet PRIVATE ${MPI_INCLUDE_PATH})

target_link_libraries(aenet PRIVATE MPI::MPI_Fortran)

target_compile_definitions(aenet PUBLIC PARALLEL )

add_custom_command(
  TARGET aenet
  POST_BUILD
  COMMAND cp  $<TARGET_FILE:aenet>  ${CMAKE_SOURCE_DIR}
)



# Find Package
#list(APPEND CMAKE_PREFIX_PATH ~/torch/libtorch)


set(SRC_DIR src)

