From af7a0ba33209209b71730210318fd8ecd601b5c0 Mon Sep 17 00:00:00 2001 From: Stefan Girke <stefan.girke@gmx.de> Date: Wed, 9 Jul 2014 18:22:21 +0200 Subject: [PATCH] [cmake] added CMakeLists.txt etc --- CMakeLists.txt | 48 +++++++++++++++++++ cmake/modules/CMakeLists.txt | 4 ++ cmake/modules/DuneFemDgMacros.cmake | 1 + compile | 1 + dune/CMakeLists.txt | 10 ++++ dune/fem-dg/CMakeLists.txt | 13 +++++ dune/fem-dg/assemble/CMakeLists.txt | 5 ++ dune/fem-dg/main/CMakeLists.txt | 7 +++ dune/fem-dg/misc/CMakeLists.txt | 5 ++ dune/fem-dg/models/CMakeLists.txt | 5 ++ dune/fem-dg/operator/CMakeLists.txt | 10 ++++ .../fem-dg/operator/adaptation/CMakeLists.txt | 6 +++ dune/fem-dg/operator/dg/CMakeLists.txt | 7 +++ dune/fem-dg/operator/fluxes/CMakeLists.txt | 7 +++ dune/fem-dg/operator/limiter/CMakeLists.txt | 5 ++ dune/fem-dg/pass/CMakeLists.txt | 6 +++ dune/fem-dg/solver/CMakeLists.txt | 5 ++ dune/fem-dg/stepper/CMakeLists.txt | 12 +++++ dune/fem-dg/test/CMakeLists.txt | 13 +++++ dune/fem-dg/test/advdiff/CMakeLists.txt | 14 ++++++ dune/fem-dg/test/dataio/CMakeLists.txt | 9 ++++ dune/fem-dg/test/euler/CMakeLists.txt | 33 +++++++++++++ dune/fem-dg/test/navierstokes/CMakeLists.txt | 23 +++++++++ m4/CMakeLists.txt | 7 +++ 24 files changed, 256 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/modules/CMakeLists.txt create mode 100644 cmake/modules/DuneFemDgMacros.cmake create mode 120000 compile create mode 100644 dune/CMakeLists.txt create mode 100644 dune/fem-dg/CMakeLists.txt create mode 100644 dune/fem-dg/assemble/CMakeLists.txt create mode 100644 dune/fem-dg/main/CMakeLists.txt create mode 100644 dune/fem-dg/misc/CMakeLists.txt create mode 100644 dune/fem-dg/models/CMakeLists.txt create mode 100644 dune/fem-dg/operator/CMakeLists.txt create mode 100644 dune/fem-dg/operator/adaptation/CMakeLists.txt create mode 100644 dune/fem-dg/operator/dg/CMakeLists.txt create mode 100644 dune/fem-dg/operator/fluxes/CMakeLists.txt create mode 100644 dune/fem-dg/operator/limiter/CMakeLists.txt create mode 100644 dune/fem-dg/pass/CMakeLists.txt create mode 100644 dune/fem-dg/solver/CMakeLists.txt create mode 100644 dune/fem-dg/stepper/CMakeLists.txt create mode 100644 dune/fem-dg/test/CMakeLists.txt create mode 100644 dune/fem-dg/test/advdiff/CMakeLists.txt create mode 100644 dune/fem-dg/test/dataio/CMakeLists.txt create mode 100644 dune/fem-dg/test/euler/CMakeLists.txt create mode 100644 dune/fem-dg/test/navierstokes/CMakeLists.txt create mode 100644 m4/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..3a50a147 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +# set up project +project("dune-fem-dg" C CXX) + +#circumvent not building docs +set(BUILD_DOCS 1) + +# general stuff +cmake_minimum_required(VERSION 2.8.6) + +#find dune-common and set the module path +find_package(dune-common) +list(APPEND CMAKE_MODULE_PATH ${dune-common_MODULE_PATH} + "${CMAKE_SOURCE_DIR}/cmake/modules")# make sure our own modules are found + +#include the dune macros +include(DuneMacros) + +# start a dune project with information from dune.module +dune_project() + +# $Id: duneproject 5842 2010-01-20 18:48:34Z joe $ +# we need the module file to be able to build via dunecontrol +set(EXTRA_DIST dune.module) +set(SUBDIRS dune m4) +if( BUILD_DOCS) +# TODO: set up documentation tree automatically +#SUBDIRS += doc +endif( BUILD_DOCS ) +# don't follow the full GNU-standard +# we need automake 1.5 +set(AUTOMAKE_OPTIONS foreign 1.5) +# pass most important options when "make distcheck" is used +set(DISTCHECK_CONFIGURE_FLAGS --with-dune-common=${DUNE_COMMON_ROOT} --with-dune-grid=${DUNE_GRID_ROOT} --with-dune-fem=${DUNE_FEM_ROOT} CXX="${CXX}" CC="${CC}") +# include not needed for CMake +# include $(top_srcdir)/am/top-rules +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +foreach(i ${SUBDIRS}) + if(${i} STREQUAL "test") + set(opt EXCLUDE_FROM_ALL) + endif(${i} STREQUAL "test") + add_subdirectory(${i} ${opt}) + unset(opt) +endforeach(i ${SUBDIRS}) + +add_subdirectory(cmake/modules) +# finalize the dune project, e.g., generate config.h etc. +finalize_dune_project(GENERATE_CONFIG_H_CMAKE) diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt new file mode 100644 index 00000000..31e40771 --- /dev/null +++ b/cmake/modules/CMakeLists.txt @@ -0,0 +1,4 @@ +set(modules + DuneFemDgMacros.cmake +) +install(FILES "${modules}" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/modules) diff --git a/cmake/modules/DuneFemDgMacros.cmake b/cmake/modules/DuneFemDgMacros.cmake new file mode 100644 index 00000000..634e3ab4 --- /dev/null +++ b/cmake/modules/DuneFemDgMacros.cmake @@ -0,0 +1 @@ +message(AUTHOR_WARNING "TODO: Implement module test.") \ No newline at end of file diff --git a/compile b/compile new file mode 120000 index 00000000..d3164c8d --- /dev/null +++ b/compile @@ -0,0 +1 @@ +/usr/share/automake-1.14/compile \ No newline at end of file diff --git a/dune/CMakeLists.txt b/dune/CMakeLists.txt new file mode 100644 index 00000000..459b751c --- /dev/null +++ b/dune/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SUBDIRS fem-dg) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +foreach(i ${SUBDIRS}) + if(${i} STREQUAL "test") + set(opt EXCLUDE_FROM_ALL) + endif(${i} STREQUAL "test") + add_subdirectory(${i} ${opt}) + unset(opt) +endforeach(i ${SUBDIRS}) diff --git a/dune/fem-dg/CMakeLists.txt b/dune/fem-dg/CMakeLists.txt new file mode 100644 index 00000000..70aa390a --- /dev/null +++ b/dune/fem-dg/CMakeLists.txt @@ -0,0 +1,13 @@ +set(SUBDIRS assemble main misc models operator pass solver stepper test) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +set(femdgdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg) +set(femdg_HEADERS femdgtest.hh) +install(FILES ${femdg_HEADERS} DESTINATION ${femdgdir}) +foreach(i ${SUBDIRS}) + if(${i} STREQUAL "test") + set(opt EXCLUDE_FROM_ALL) + endif(${i} STREQUAL "test") + add_subdirectory(${i} ${opt}) + unset(opt) +endforeach(i ${SUBDIRS}) diff --git a/dune/fem-dg/assemble/CMakeLists.txt b/dune/fem-dg/assemble/CMakeLists.txt new file mode 100644 index 00000000..55532a5a --- /dev/null +++ b/dune/fem-dg/assemble/CMakeLists.txt @@ -0,0 +1,5 @@ +set(assembledir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/assemble) +set(assemble_HEADERS primalmatrix.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${assemble_HEADERS} DESTINATION ${assembledir}) \ No newline at end of file diff --git a/dune/fem-dg/main/CMakeLists.txt b/dune/fem-dg/main/CMakeLists.txt new file mode 100644 index 00000000..8f846660 --- /dev/null +++ b/dune/fem-dg/main/CMakeLists.txt @@ -0,0 +1,7 @@ +set(maindir ${top_srcdir}/dune/fem-dg/main) +set(main_HEADERS main.hh codegen.hh codegen2.hh caching.hh caching2.hh + vectorialbasefunctionset.hh default.hh + main_0.cc main_1.cc main_2.cc main_3.cc main_4.cc main.cc main_pol.cc) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${main_HEADERS} DESTINATION ${maindir}) \ No newline at end of file diff --git a/dune/fem-dg/misc/CMakeLists.txt b/dune/fem-dg/misc/CMakeLists.txt new file mode 100644 index 00000000..93bc602d --- /dev/null +++ b/dune/fem-dg/misc/CMakeLists.txt @@ -0,0 +1,5 @@ +set(miscdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/misc) +set(misc_HEADERS diagnostics.hh cons2prim.hh crs.hh streams.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${misc_HEADERS} DESTINATION ${miscdir}) \ No newline at end of file diff --git a/dune/fem-dg/models/CMakeLists.txt b/dune/fem-dg/models/CMakeLists.txt new file mode 100644 index 00000000..9e65648a --- /dev/null +++ b/dune/fem-dg/models/CMakeLists.txt @@ -0,0 +1,5 @@ +set(modelsdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/models) +set(models_HEADERS defaultmodel.hh defaultprobleminterfaces.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${models_HEADERS} DESTINATION ${modelsdir}) \ No newline at end of file diff --git a/dune/fem-dg/operator/CMakeLists.txt b/dune/fem-dg/operator/CMakeLists.txt new file mode 100644 index 00000000..7f888dee --- /dev/null +++ b/dune/fem-dg/operator/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SUBDIRS adaptation limiter dg fluxes) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +foreach(i ${SUBDIRS}) + if(${i} STREQUAL "test") + set(opt EXCLUDE_FROM_ALL) + endif(${i} STREQUAL "test") + add_subdirectory(${i} ${opt}) + unset(opt) +endforeach(i ${SUBDIRS}) diff --git a/dune/fem-dg/operator/adaptation/CMakeLists.txt b/dune/fem-dg/operator/adaptation/CMakeLists.txt new file mode 100644 index 00000000..bf5bbed1 --- /dev/null +++ b/dune/fem-dg/operator/adaptation/CMakeLists.txt @@ -0,0 +1,6 @@ +set(adaptationdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/operator/adaptation) +set(adaptation_HEADERS adaptation.cc adaptation.hh + estimatorbase.hh estimator.hh utility.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${adaptation_HEADERS} DESTINATION ${adaptationdir}) \ No newline at end of file diff --git a/dune/fem-dg/operator/dg/CMakeLists.txt b/dune/fem-dg/operator/dg/CMakeLists.txt new file mode 100644 index 00000000..ab8f46b6 --- /dev/null +++ b/dune/fem-dg/operator/dg/CMakeLists.txt @@ -0,0 +1,7 @@ +set(dgdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/operator/dg) +set(dg_HEADERS discretemodelcommon.hh fluxoperator.hh primaldiscretemodel.hh +dgoperatorchoice.hh fluxdiscretemodel.hh operatorbase.hh primaloperator.hh +passtraits.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${dg_HEADERS} DESTINATION ${dgdir}) \ No newline at end of file diff --git a/dune/fem-dg/operator/fluxes/CMakeLists.txt b/dune/fem-dg/operator/fluxes/CMakeLists.txt new file mode 100644 index 00000000..bd880091 --- /dev/null +++ b/dune/fem-dg/operator/fluxes/CMakeLists.txt @@ -0,0 +1,7 @@ +set(fluxesdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/operator/fluxes) +set(fluxes_HEADERS averageflux.hh diffusionflux.hh ldgflux.hh +mhd_fluxes.hh rotator.hh dgprimalfluxes.hh eulerfluxes.hh +mhd_eqns.hh mhdfluxes.hh mhd_eqns.cc mhd_fluxes.cc) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${fluxes_HEADERS} DESTINATION ${fluxesdir}) \ No newline at end of file diff --git a/dune/fem-dg/operator/limiter/CMakeLists.txt b/dune/fem-dg/operator/limiter/CMakeLists.txt new file mode 100644 index 00000000..50aa7e72 --- /dev/null +++ b/dune/fem-dg/operator/limiter/CMakeLists.txt @@ -0,0 +1,5 @@ +set(operatordir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/operator/limiter) +set(operator_HEADERS limiter.hh limitpass.hh limiterdiscretemodel.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${operator_HEADERS} DESTINATION ${operatordir}) \ No newline at end of file diff --git a/dune/fem-dg/pass/CMakeLists.txt b/dune/fem-dg/pass/CMakeLists.txt new file mode 100644 index 00000000..843ab5b4 --- /dev/null +++ b/dune/fem-dg/pass/CMakeLists.txt @@ -0,0 +1,6 @@ +set(passdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/pass) +set(pass_HEADERS assembleddiffusionpass.hh dgmodelcaller.hh dgmasspass.hh + dgpass.hh ellipticmodelcaller.hh threadhandle.hh threadpass.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${pass_HEADERS} DESTINATION ${passdir}) \ No newline at end of file diff --git a/dune/fem-dg/solver/CMakeLists.txt b/dune/fem-dg/solver/CMakeLists.txt new file mode 100644 index 00000000..a030cf70 --- /dev/null +++ b/dune/fem-dg/solver/CMakeLists.txt @@ -0,0 +1,5 @@ +set(solverdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/solver) +set(solver_HEADERS smartodesolver.hh rungekuttasolver.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${solver_HEADERS} DESTINATION ${solverdir}) \ No newline at end of file diff --git a/dune/fem-dg/stepper/CMakeLists.txt b/dune/fem-dg/stepper/CMakeLists.txt new file mode 100644 index 00000000..f181f1ab --- /dev/null +++ b/dune/fem-dg/stepper/CMakeLists.txt @@ -0,0 +1,12 @@ +set(stepperdir ${top_srcdir}/dune/fem-dg/stepper/) +set(stepper_HEADERS advectiondiffusionstepper.hh + advectionstepper.hh + baseevolution.hh + base.hh + ellipt.hh + stepperbase.hh + stepper.hh + steppertraits.hh) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${stepper_HEADERS} DESTINATION ${stepperdir}) \ No newline at end of file diff --git a/dune/fem-dg/test/CMakeLists.txt b/dune/fem-dg/test/CMakeLists.txt new file mode 100644 index 00000000..bdd9313d --- /dev/null +++ b/dune/fem-dg/test/CMakeLists.txt @@ -0,0 +1,13 @@ +set(SUBDIRS dataio advdiff euler navierstokes) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +set(testdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/test) +set(test_HEADERS ) +install(FILES ${test_HEADERS} DESTINATION ${testdir}) +foreach(i ${SUBDIRS}) + if(${i} STREQUAL "test") + set(opt EXCLUDE_FROM_ALL) + endif(${i} STREQUAL "test") + add_subdirectory(${i} ${opt}) + unset(opt) +endforeach(i ${SUBDIRS}) diff --git a/dune/fem-dg/test/advdiff/CMakeLists.txt b/dune/fem-dg/test/advdiff/CMakeLists.txt new file mode 100644 index 00000000..57149647 --- /dev/null +++ b/dune/fem-dg/test/advdiff/CMakeLists.txt @@ -0,0 +1,14 @@ +# install these headers +set(advdiffdir ${CMAKE_INSTALL_INCLUDEDIR}/test/advdiff) +set(advdiff_HEADERS models.hh problemcreator.hh steppertraits.hh) +set(LDADD ${ALL_PKG_LDFLAGS} ${ALL_PKG_LIBS} ${LOCAL_LIBS} ${DUNEMPILDFLAGS} ${DUNEMPILIBS}) +set(BASEDIR ../../main) +#GRIDTYPE = ALUGRID_SIMPLEX +#GRIDTYPE = YASPGRID +#GRIDTYPE=PARALLELGRID_ALUGRID_SIMPLEX +#GRIDTYPE=CARTESIANGRID_ALUGRID_CUBE +set(GRIDTYPE SPGRID) +set(POLORDER 2) +set(GRIDDIM 2) +set(DIMRANGE 1) +install(FILES ${advdiff_HEADERS} DESTINATION ${advdiffdir}) \ No newline at end of file diff --git a/dune/fem-dg/test/dataio/CMakeLists.txt b/dune/fem-dg/test/dataio/CMakeLists.txt new file mode 100644 index 00000000..2ff48da3 --- /dev/null +++ b/dune/fem-dg/test/dataio/CMakeLists.txt @@ -0,0 +1,9 @@ +#GRIDTYPE = ALUGRID_SIMPLEX +#GRIDTYPE = CARTESIANGRID_ALUGRID_CUBE +set(GRIDTYPE ALUGRID_CUBE) +#GRIDTYPE = SPGRID +#GRIDTYPE = YASPGRID +set(GRIDDIM 3) +set(POLORDER 2) +set(DIMRANGE 5) +set(USE_SIONLIB 0) diff --git a/dune/fem-dg/test/euler/CMakeLists.txt b/dune/fem-dg/test/euler/CMakeLists.txt new file mode 100644 index 00000000..bafbae70 --- /dev/null +++ b/dune/fem-dg/test/euler/CMakeLists.txt @@ -0,0 +1,33 @@ +# install these headers +set(eulerdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/test/euler) +set(euler_HEADERS eulermodel.hh problems.hh problemcreator.hh +chorjo.hh chorjo.cc passtraits.hh) +set(LDADD ${ALL_PKG_LDFLAGS} ${ALL_PKG_LIBS} ${LOCAL_LIBS} ${DUNEMPILDFLAGS} ${DUNEMPILIBS}) +set(BASEDIR ../../main) +# helper variables +set(SOURCEBASE ${BASEDIR}/main.cc chorjo.cc) +set(SOURCES ${SOURCEBASE} ${BASEDIR}/main_0.cc ${BASEDIR}/main_1.cc + ${BASEDIR}/main_2.cc ${BASEDIR}/main_3.cc) +set(SOURCES12 ${SOURCEBASE} ${BASEDIR}/main_1.cc ${BASEDIR}/main_2.cc) +set(SOURCEONEP ${SOURCEBASE} ${BASEDIR}/main_pol.cc) +# INFO FLUX +# set FLUX to 1 for LLF +# set FLUX to 2 for HLL (not tested!) +# INFO TRACK LIFTING: +# define LOCALDEBUG to calculate \sum_e\int_Omega(r_e*l_e) and +# \sum_e\int_Omega(r_e*l_e). They will be output to std::cout from the Stepper +# INFO LIMITER +# define LIMITER to apply limiting of the numerical solution (not tested!) +# INFO WELL-BALANCING +# define WELLBALANCE to apply well-balance of the numerical solution (not tested!) +# INFO DIFFFLUXTYPE +# define PRIMALDG to use the BR2, IP, CDG, CDG2, BO methods +# define DUALDG to use the LDG method +#GRIDTYPE = ALUGRID_CONFORM +#GRIDTYPE = ALUGRID_SIMPLEX +#GRIDTYPE = ALBERTAGRID +#GRIDTYPE = YASPGRID +#GRIDTYPE = SPGRID +set(GRIDTYPE ALUGRID_CUBE) +set(GRIDDIM 2) +install(FILES ${euler_HEADERS} DESTINATION ${eulerdir}) \ No newline at end of file diff --git a/dune/fem-dg/test/navierstokes/CMakeLists.txt b/dune/fem-dg/test/navierstokes/CMakeLists.txt new file mode 100644 index 00000000..7abc5593 --- /dev/null +++ b/dune/fem-dg/test/navierstokes/CMakeLists.txt @@ -0,0 +1,23 @@ +# install these headers +set(nseqdir ${CMAKE_INSTALL_INCLUDEDIR}/dune/fem-dg/test/navierstokes) +set(nseq_HEADERS ns_model.hh problemcreator.hh nswaves.hh +ns_model_spec.hh nssmooth.hh thermodynamics.hh passtraits.hh) +#USE_OMP=-fopenmp +#USE_OMP=-DUSE_PTHREADS=1 +set(LDADD ${ALL_PKG_LDFLAGS} ${ALL_PKG_LIBS} ${LOCAL_LIBS} ${DUNEMPILDFLAGS} ${DUNEMPILIBS}) +set(BASEDIR ../../main) +set(SOURCESONEP ${BASEDIR}/main.cc ${BASEDIR}/main_pol.cc) +set(SOURCES ${BASEDIR}/main.cc ${BASEDIR}/main_0.cc ${BASEDIR}/main_1.cc + ${BASEDIR}/main_2.cc ${BASEDIR}/main_3.cc ${BASEDIR}/main_4.cc) +set(SOURCES12 ${BASEDIR}/main.cc ${BASEDIR}/main_1.cc ${BASEDIR}/main_2.cc) +#GRIDTYPE = ALUGRID_SIMPLEX +#GRIDTYPE=PARALLELGRID_ALUGRID_CUBE +#GRIDTYPE=PARALLELGRID_ALUGRID_SIMPLEX +# GRIDTYPE=SPGRID +#GRIDTYPE=CARTESIANGRID_ALUGRID_CUBE +set(GRIDTYPE ALUGRID_CUBE) +#GRIDTYPE=YASPGRID +#GRIDTYPE = YASPGRID +set(GRIDDIM 3) +set(POLORDER 2) +install(FILES ${nseq_HEADERS} DESTINATION ${nseqdir}) \ No newline at end of file diff --git a/m4/CMakeLists.txt b/m4/CMakeLists.txt new file mode 100644 index 00000000..fcdd3c44 --- /dev/null +++ b/m4/CMakeLists.txt @@ -0,0 +1,7 @@ +set(M4FILES dune-fem-dg.m4 bgq_l1prefetch.m4) +set(aclocaldir ${CMAKE_INSTALL_DATADIR}/aclocal) +set(aclocal_DATA ${M4FILES}) +set(EXTRA_DIST ${M4FILES}) +# include not needed for CMake +# include $(top_srcdir)/am/global-rules +install(FILES ${aclocal_DATA} DESTINATION ${aclocaldir}) \ No newline at end of file -- GitLab