DAMASK_EICMD/CMakeLists.txt

322 lines
16 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

########################################################################################
# CMAKE for build the Material subroutine for BVP solution
########################################################################################
# OPTIONS = standard (alternative): meaning
#-------------------------------------------------------------
# F90 = ifort (gfortran): compiler type, choose Intel or GNU
# COMPILERNAME = name of the compiler executable (if not the same as the ype), e.g. using mpich-g90 instead of ifort
# PORTABLE = TRUE (FALSE): decision, if executable is optimized for the machine on which it was built.
# OPTIMIZATION = DEFENSIVE (OFF,AGGRESSIVE,ULTRA): Optimization mode: O2, O0, O3 + further options for most files, O3 + further options for all files
# OPENMP = TRUE (FALSE): OpenMP multiprocessor support
# PREFIX = arbitrary prefix (before compilername)
# OPTION = arbitrary option (just before file to compile)
# SUFFIX = arbitrary suffix (after file to compile)
# STANDARD_CHECK = checking for Fortran 2008, compiler dependend
########################################################################################
cmake_minimum_required (VERSION 3.1.0)
project (DAMASK Fortran)
# The version number.
set (DAMASK_VERSION_MAJOR 1)
set (DAMASK_VERSION_MINOR ${DAMASK_V})
##
# find_package() might not work on customized system.
# it is recommended for the user to specify the location
# of PETSc and HDF5 library
if (defined PETSC_DIR)
set (PETSC ${PETSC_DIR})
else (defined PETSC_DIR)
find_package(PETSC)
endif (defined PETSC_DIR)
if (defined HDF5_DIR)
set (HDF5 ${HDF5_DIR})
else (defined HDF5_DIR)
find_package(HDF5)
endif (defined HDF5_DIR)
##
# set system include directories
include_directories(
${PETSC}/lib/petsc/conf/variables
${PETSC}/lib/petsc/conf/rules
../lib
${HDF5}/include
)
##
# set compile and debug flags
if (OPENMP MATCHES 'ON')
set (OPENMP_FLAG_ifort "-openmp -openmp-report0 -parallel")
set (OPENMP_FLAG_gfortran "-fopenmp")
else (OPENMP MATCHES 'ON')
message("No openmp support specified")
set (OPENMP_FLAG_ifort "")
set (OPENMP_FLAG_gfortran "")
endif (OPENMP MATCHES 'ON')
if (OPTIMIZATION MATCHES "OFF")
set (OPTIMIZATION_ifort "-O0 -no-ip")
set (OPTIMIZATION_gfortran "-O0")
elseif (OPTIMIZATION MATCHES "DEFENSIVE")
set (OPTIMIZATION_ifort "-O2")
set (OPTIMIZATION_gfortran "-O2")
elseif (OPTIMIZATION MATCHES "AGGRESSIVE")
set (OPTIMIZATION_ifort "-ipo -O3 -no-prec-div -fp-model fast=2 -xHost") #-fast = -ipo, -O3, -no-prec-div, -static, -fp-model fast=2, and -xHost"
set (OPTIMIZATION_gfortran "-O3 -ffast-math -funroll-loops -ftree-vectorize")
elseif (OPTIMIZATION MATCHES "ULTRA")
set (OPTIMIZATION_ifort "-ipo -O3 -no-prec-div -fp-model fast=2 -xHost") #-fast = -ipo, -O3, -no-prec-div, -static, -fp-model fast=2, and -xHost"
set (OPTIMIZATION_gfortran "-O3 -ffast-math -funroll-loops -ftree-vectorize")
else (OPTIMIZATION MATCHES "OFF")
set (OPTIMIZATION_ifort "-O2")
set (OPTIMIZATION_gfortran "-O2")
endif (OPTIMIZATION MATCHES "OFF")
set (STANDARD_CHECK_ifort "-stand f08 -standard-semantics")
set (STANDARD_CHECK_gfortran "-std=f2008ts -pedantic-errors" )
###################################################################################################
# COMPILE SWITCHES
# -shared-intel: Link against shared Intel libraries instead of static ones
# -fpp: preprocessor
# -ftz: flush unterflow to zero, automatically set if O<0,1,2,3> >0
# -assume byterecl record length is given in bytes (also set by -standard-semantics)
# fpe_summary print list of floating point exceptions occured during execution
# -fimplicit-none: assume "implicit-none" even if not present in source
# -diag-disable: disables warnings, where
# warning ID 5268: the text exceeds right hand column allowed on the line (we have only comments there)
# -warn: enables warnings, where
# declarations: any undeclared names (alternative name: -implicitnone)
# general: warning messages and informational messages are issued by the compiler
# usage: questionable programming practices
# interfaces: checks the interfaces of all SUBROUTINEs called and FUNCTIONs invoked in your compilation against an external set of interface blocks
# ignore_loc: %LOC is stripped from an actual argument
# alignments: data that is not naturally aligned
# unused: declared variables that are never used
# stderrors: warnings about Fortran standard violations are changed to errors (STANDARD_CHECK)
#
###################################################################################################
# MORE OPTIONS FOR DEBUGGING DURING COMPILATION
# -warn: enables warnings, where
# truncated_source: Determines whether warnings occur when source exceeds the maximum column width in fixed-format files. (too many warnings because we have comments beyond character 132)
# uncalled: Determines whether warnings occur when a statement function is never called
# all:
# -name as_is: case sensitive Fortran!
###################################################################################################
set (COMPILE_OPTIONS_ifort "-DDAMASKVERSION=${DAMASK_V}"
"-fpp"
"-ftz"
"-assume byterecl,fpe_summary"
"-diag-disable 5268"
"-warn declarations"
"-warn general"
"-warn usage"
"-warn interfaces"
"-warn ignore_loc"
"-warn alignments"
"-warn unused"
)
###################################################################################################
# COMPILE SWITCHES FOR RUNTIME DEBUGGING
# -g: Generate symbolic debugging information in the object file
# -traceback: Generate extra information in the object file to provide source file traceback information when a severe error occurs at run time.
# -gen-interfaces: Generate an interface block for each routine. http://software.intel.com/en-us/blogs/2012/01/05/doctor-fortran-gets-explicit-again/
# -fp-stack-check: Generate extra code after every function call to ensure that the floating-point (FP) stack is in the expected state.
# -ftrapuv Trap uninitalized variables
# -check: checks at runtime, where
# bounds: check if an array index is too small (<1) or too large!
# format: Checking for the data type of an item being formatted for output.
# output_conversion: Checking for the fit of data items within a designated format descriptor field.
# pointers: Checking for certain disassociated or uninitialized pointers or unallocated allocatable objects.
# uninit: Checking for uninitialized variables.
# -fpe-all0 capture all floating-point exceptions, sets -ftz automatically
# -warn: enables warnings, where
# errors: warnings are changed to errors
# stderrors: warnings about Fortran standard violations are changed to errors
# information on http://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors/
###################################################################################################
# MORE OPTIONS FOR RUNTIME DEBUGGING
# -heap-arrays: should not be done for OpenMP, but set "ulimit -s unlimited" on shell. Probably it helps also to unlimit other limits
# -check: checks at runtime, where
# arg_temp_created: will cause a lot of warnings because we create a bunch of temporary arrays (performance?)
# stack:
###################################################################################################
set (DEBUG_OPTIONS_ifort "-g"
"-traceback"
"-gen-interfaces"
"-fp-stack-check"
"-fp-model strict"
"-check bounds,format,output_conversion,pointers,uninit"
"-ftrapuv"
"-fpe-all0"
"-warn errors"
"-warn stderrors"
"-debug-parameters all"
)
set (LINK_OPTIONS_ifort "-shared-intel")
###################################################################################################
# COMPILE SWITCHES
# -shared
# -Wl,-undefined,dynamic_lookup:ensure to link against dynamic libraries
# -xf95-cpp-input: preprocessor
# -ffree-line-length-132: restrict line length to the standard 132 characters
# -ffpe-summary: print summary of floating point exeptions (invalid, zero, overflow, underflow, inexact and denormal)
# -fimplicit-none: assume "implicit-none" even if not present in source
# -fmodule-private: assume "private" even if not present in source
# -Wcharacter-truncation: warn if character expressions (strings) are truncated
# -Wunderflow: produce a warning when numerical constant expressions are encountered, which yield an UNDERFLOW during compilation
# -Wsuggest-attribute=pure:
# -Wsuggest-attribute=noreturn:
# -Wconversion-extra
# -Wimplicit-procedure
# -Wall: sets the following Fortran options:
# -Waliasing: warn about possible aliasing of dummy arguments. Specifically, it warns if the same actual argument is associated with a dummy argument with "INTENT(IN)" and a dummy argument with "INTENT(OUT)" in a call with an explicit interface.
# -Wampersand: checks if a character expression is continued proberly by an ampersand at the end of the line and at the beginning of the new line
# -Warray-bounds: checks if array reference is out of bounds at compile time. use -fcheck-bounds to also check during runtime
# -Wconversion: warn about implicit conversions between different type
# -Wsurprising: warn when "suspicious" code constructs are encountered. While technically legal these usually indicate that an error has been made.
# -Wc-binding-type:
# -Wintrinsics-std: only standard intrisics are available, e.g. "call flush(6)" will cause an error
# -Wno-tabs: do not allow tabs in source
# -Wintrinsic-shadow: warn if a user-defined procedure or module procedure has the same name as an intrinsic
# -Wline-truncation:
# -Wtarget-lifetime:
# -Wreal-q-constant: warn about real-literal-constants with 'q' exponent-letter
# -Wunused: a number of unused-xxx warnings
# these are general (non -Fortran options) implied by -Wall
# -Waddress
# -Warray-bounds (only with -O2)
# -Wc++11-compat
# -Wchar-subscripts
# -Wcomment
# -Wformat
# -Wmaybe-uninitialized
# -Wnonnull
# -Wparentheses
# -Wpointer-sign
# -Wreorder
# -Wreturn-type
# -Wsequence-point
# -Wstrict-aliasing
# -Wstrict-overflow=1
# -Wswitch
# -Wtrigraphs
# -Wuninitialized
# -Wunknown-pragmas
# -Wunused-function
# -Wunused-label
# -Wunused-value
# -Wunused-variable
# -Wvolatile-register-var
# -Wextra: sets the following Fortran options:
# -Wunuses-parameter:
# -Wcompare-reals:
# these are general (non -Fortran options) implied by -Wextra
# -Wclobbered
# -Wempty-body
# -Wignored-qualifiers
# -Wmissing-field-initializers
# -Woverride-init
# -Wsign-compare
# -Wtype-limits
# -Wuninitialized
# -Wunused-but-set-parameter (only with -Wunused or -Wall)
# -Wno-globals
# -ffpe-summary=all only for newer gfortran
###################################################################################################
# MORE OPTIONS FOR DEBUGGING DURING COMPILATION
# -Warray-temporarieswarnings: because we have many temporary arrays (performance issue?):
# -Wimplicit-interface: no interfaces for lapack routines
# -Wunsafe-loop-optimizations: warn if the loop cannot be optimized due to nontrivial assumptions.
# -Wstrict-overflow:
###################################################################################################
set (COMPILE_OPTIONS_gfortran "-DDAMASKVERSION=${DAMASKVERSION}"
"-xf95-cpp-input"
"-ffree-line-length-132"
"-fimplicit-none"
"-fmodule-private"
"-Wall"
"-Wextra"
"-Wcharacter-truncation"
"-Wunderflow"
"-Wsuggest-attribute=pure"
"-Wsuggest-attribute=noreturn"
"-Wconversion-extra"
"-Wimplicit-procedure"
"-Wno-unused-parameter"
)
###################################################################################################
# COMPILE SWITCHES FOR RUNTIME DEBUGGING
# -ffpe-trap=invalid,\ stop execution if floating point exception is detected (NaN is silent)
# zero,\
# overflow
# -fcheck=all: sets the following Fortran options:
# array-temps
# bounds
# do
# mem
# pointer
# recursion
###################################################################################################
# MORE OPTIONS FOR RUNTIME DEBUGGING
# -ffpe-trap=precision,\
# denormal, \
# underflow
###################################################################################################
set (DEBUG_OPTIONS_gfortran "-g"
"-fbacktrace"
"-fdump-core"
"-fcheck=all"
"-ffpe-trap=invalid,zero,overflow"
)
set (LINK_OPTIONS_gfortran "-Wl,-undefined,dynamic_lookup")
# set FLAGS
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
if (Fortran_COMPILER_NAME MATCHES "ifort.*")
# for RELEASE
set (CMAKE_Fortran_FLAGS_RELEASE ${COMPILE_OPTIONS_ifort})
set (CMAKE_EXE_LINKER_FLAGS_RELEASE ${LINK_OPTIONS_ifort}
${OPTIMIZATION_ifort} )
# for DEBUG
set (CMAKE_Fortran_FLAGS_DEBUG ${COMPILE_OPTIONS_ifort}
${DEBUG_OPTIONS_ifort} )
set (CMAKE_EXE_LINKER_FLAGS_DEBUG ${LINK_OPTIONS_ifort}
${DEBUG_OPTIONS_ifort} )
#
elseif (Fortran_COMPILER_NAME MATCHES "gfortran.*")
# for RELEASE
set (CMAKE_Fortran_FLAGS_RELEASE ${COMPILE_OPTIONS_gfortran})
set (CMAKE_EXE_LINKER_FLAGS_RELEASE ${LINK_OPTIONS_gfortran}
${OPTIMIZATION_gfortran} )
# for DEBUG
set (CMAKE_Fortran_FLAGS_DEBUG ${COMPILE_OPTIONS_gfortran}
${DEBUG_OPTIONS_gfortran} )
set (CMAKE_EXE_LINKER_FLAGS_DEBUG ${LINK_OPTIONS_gfortran}
${DEBUG_OPTIONS_gfortran} )
#
elseif (Fortran_COMPILER_NAME MATCHES "g77")
message (FATAL_ERROR "Fortran 77 is not supported.")
else (Fortran_COMPILER_NAME MATCHES "ifort.*")
message (FATAL_ERROR "Require Fortran90 from GNU or Intel.")
endif (Fortran_COMPILER_NAME MATCHES "ifort.*")
##
# ADD CODE(SOURCE) DIRECTORY
add_subdirectory(code)
##
# ADD TESTING CASES
add_test (SmokeTestRun
DAMASK_spectral.exe -g test/test1.geom -l test/test.load)
# Enable Dashboard scripting
# include (CTest)
# set (CTEST_PROJECT_NAME "DAMASK")