cmake_minimum_required(VERSION 2.6)
project(seamless-wave)
enable_language(Fortran)
enable_testing()

option(BUILD_SHARED_LIBS "Build shared libraries" ON)

set(CMAKE_Fortran_FLAGS "-Wall -Wextra -Wtabs -Wsurprising \
	-Wno-unused-dummy-argument -std=f2003 -ffpe-trap=invalid,zero,overflow -O2")
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -fcheck=all")

# libseamless
add_library(seamless
	"lib/analyticfunction.f90"
	"lib/basis.f90"
	"lib/constants.f90"
	"lib/error.f90"
	"lib/field.f90"
	"lib/fixedvaluefunction.f90"
	"lib/mesh.f90"
	"lib/types.f90"
	"lib/adaptivity/adaptivity.f90"
	"lib/adaptivity/filterbank.f90"
	"lib/adaptivity/noadaptivity.f90"
	"lib/adaptivity/thresholds.f90"
	"lib/adaptivity/waveletadaptivity.f90"
	"lib/swe/flow.f90"
	"lib/swe/problemspecification.f90"
	"lib/swe/hll.f90"
	"lib/swe/localfacevalues.f90"
	"lib/swe/simulation.f90"
	"lib/swe/wettingdrying.f90"
	"lib/swe/dg2/dg2addghostbcs.f90"
	"lib/swe/dg2/dg2operator.f90"
	"lib/swe/dg2/dg2friction.f90"
	"lib/swe/dg2/dg2simulation.f90"
	"lib/swe/dg2/slopelimiter.f90"
	"lib/swe/fv1/fv1addghostbcs.f90"
	"lib/swe/fv1/fv1friction.f90"
	"lib/swe/fv1/fv1operator.f90"
	"lib/swe/fv1/fv1simulation.f90"
	"lib/swe/testcase/dambreak.f90"
	"lib/swe/testcase/dambreakdry.f90"
	"lib/swe/testcase/dambreakmanning.f90"
	"lib/swe/testcase/dambreakonehump.f90"
	"lib/swe/testcase/dambreakslope.f90"
	"lib/swe/testcase/dambreaktwohump.f90"
	"lib/swe/testcase/dambreakwet.f90"
	"lib/swe/testcase/lakeatrest.f90"
	"lib/swe/testcase/parabolicbowl_liangmarche.f90"
	"lib/swe/testcase/parabolicbowl_swashes.f90"
	"lib/swe/testcase/steady.f90"
	"lib/swe/testcase/testcase.f90"
	"lib/swe/testcase/reflection.f90"
	"lib/swe/testcase/threeshapetopography.f90"
	"lib/swe/writer/cputimewriter.f90"
	"lib/swe/writer/elementcountwriter.f90"
	"lib/swe/writer/cellcentrewriter.f90"
	"lib/swe/writer/cellcentreanalyticwriter.f90"
	"lib/swe/writer/convergencewriter.f90"
	"lib/swe/writer/energywriter.f90"
	"lib/swe/writer/errorwriter.f90"
	"lib/swe/writer/extremawriter.f90"
	"lib/swe/writer/piecewisewriter.f90"
	"lib/swe/writer/samplewriter.f90"
	"lib/swe/writer/timestepwriter.f90"
	"lib/swe/writer/wetdryfrontwriter.f90"
	"lib/swe/writer/writer.f90"
	"third_party/brent/lib/brent.f90"
	# https://people.sc.fsu.edu/~jburkardt/f_src/brent/brent.html
)

# libpenf
add_library(penf
	"third_party/penf/lib/penf.F90"
	"third_party/penf/lib/penf_b_size.F90"
	"third_party/penf/lib/penf_global_parameters_variables.F90"
	"third_party/penf/lib/penf_stringify.F90"
)

# libface
add_library(face "third_party/face/lib/face.F90")
set_target_properties(face PROPERTIES COMPILE_FLAGS "-std=f2008")

# libflap
add_library(flap
	"third_party/flap/lib/flap.f90"
	"third_party/flap/lib/flap_command_line_arguments_group_t.f90"
	"third_party/flap/lib/flap_command_line_argument_t.F90"
	"third_party/flap/lib/flap_command_line_interface_t.F90"
	"third_party/flap/lib/flap_object_t.f90"
	"third_party/flap/lib/flap_utils_m.f90"
)
set_target_properties(flap PROPERTIES COMPILE_FLAGS "-std=f2008")
target_link_libraries(flap face penf)

# apps

add_executable(gen_topography "src/gen_topography.f90")
target_link_libraries(gen_topography seamless flap)

add_executable(run_simulation "src/run_simulation.f90")
target_link_libraries(run_simulation seamless flap)

# tests

add_library(seamlesstest
	"test/fruit.f90"
)

target_link_libraries(seamlesstest seamless)

add_executable(test_thresholds "test/adaptivity/test_thresholds.f90")
add_executable(test_waveletadaptivity "test/adaptivity/test_waveletadaptivity.f90")
add_executable(test_dg2addghostbcs "test/swe/test_dg2addghostbcs.f90")
add_executable(test_dg2operator "test/swe/test_dg2operator.f90")
add_executable(test_dg2friction "test/swe/test_dg2friction.f90")
add_executable(test_hll "test/swe/test_hll.f90")
add_executable(test_slopelimiter "test/swe/test_slopelimiter.f90")
add_executable(test_wettingdrying "test/swe/test_wettingdrying.f90")

target_link_libraries(test_dg2addghostbcs seamlesstest)
target_link_libraries(test_dg2operator seamlesstest)
target_link_libraries(test_dg2friction seamlesstest)
target_link_libraries(test_hll seamlesstest)
target_link_libraries(test_slopelimiter seamlesstest)
target_link_libraries(test_thresholds seamlesstest)
target_link_libraries(test_waveletadaptivity seamlesstest)
target_link_libraries(test_wettingdrying seamlesstest)

add_test(test_dg2addghostbcs test_dg2addghostbcs)
add_test(test_dg2operator test_dg2operator)
add_test(test_dg2friction test_dg2friction)
add_test(test_hll test_hll)
add_test(test_slopelimiter test_slopelimiter)
add_test(test_thresholds test_thresholds)
add_test(test_waveletadaptivity test_waveletadaptivity)
add_test(test_wettingdrying test_wettingdrying)
