opm-simulators/cmake/Modules/OpmGrid.cmake
2013-05-15 10:24:52 +02:00

82 lines
2.5 KiB
CMake

# - Recreate grid selection macros from DUNE
#
# If anyone requires Dune::GridSelector::GridType, they must call this
# macro in *their* project, to add this information to config.h. (In
# the autotools version, dunecontrol will automatically include m4
# scripts that does this).
#
# Example:
# opm_cornerpoint_grid (${CONFIG_H})
include (CMakeParseArguments)
function (opm_grid_type)
cmake_parse_arguments (a "" "FILENAME;SYMBOL;TYPE;CONDITION" "HEADERS" ${ARGN})
# write prelude of a condition to use this particular grid, an inclusion guard,
# and checks to see if the number of dimensions fits for this type of grid
file (APPEND ${a_FILENAME}
"/* add GRIDTYPE typedef for grid implementation ${a_TYPE}:
defining ${a_SYMBOL} during compilation typedefs this grid implementation as GridType
in namespace Dune::GridSelector;
also integer constants dimgrid and dimworld are set in this namespace.
The required headers for this grid implementation are also included.
*/
#if defined ${a_SYMBOL} && ! defined USED_${a_SYMBOL}_GRIDTYPE
/* someone else has already defined a gridtype */
#if HAVE_GRIDTYPE
#error \"Ambigious definition of GRIDTYPE\"
#endif
#ifndef WORLDDIM
#define WORLDDIM GRIDDIM
#endif
#if not (WORLDDIM >= GRIDDIM)
#error \"WORLDDIM < GRIDDIM does not make sense.\"
#endif
#if ! (${a_CONDITION})
#error \"Preprocessor assertion ${a_CONDITION} failed.\"
#endif
")
# write headers which are capable of defining the type. this should
# really just have consisted of a forward declaration, but the damage
# is done: clients expect to just pull in config.h and have the
# proper type available.
foreach (header IN LISTS a_HEADERS)
file (APPEND ${a_FILENAME}
"#include <${header}>\n"
)
endforeach (header)
# main part which does the typedef and then a postlude which marks
# the grid as "taken" and make sure that no one else does the same
file (APPEND ${a_FILENAME}
"
namespace Dune {
namespace GridSelector {
const int dimgrid = GRIDDIM;
const int worldgrid = WORLDDIM;
typedef ${a_TYPE} GridType;
}
}
#define HAVE_GRIDTYPE 1
#define USED_${a_SYMBOL}_GRIDTYPE 1
#endif
")
endfunction (opm_grid_type)
# write the grid type for dune-cornerpoint
function (opm_cornerpoint_grid config_h)
opm_grid_type (
FILENAME ${CONFIG_H}
SYMBOL CPGRID
HEADERS "dune/grid/CpGrid.hpp" "dune/grid/cpgrid/dgfparser.hh"
TYPE Dune::CpGrid
CONDITION "(GRIDDIM == 3) && (WORLDDIM == 3)"
)
endfunction (opm_cornerpoint_grid config_h)