diff --git a/benchmarks/Benchmark_dwf_ntpf b/benchmarks/Benchmark_dwf_ntpf new file mode 100755 index 00000000..ab9999c9 Binary files /dev/null and b/benchmarks/Benchmark_dwf_ntpf differ diff --git a/benchmarks/Benchmark_zmm b/benchmarks/Benchmark_zmm new file mode 100755 index 00000000..c7eebe18 Binary files /dev/null and b/benchmarks/Benchmark_zmm differ diff --git a/configure b/configure new file mode 100755 index 00000000..491eb20c --- /dev/null +++ b/configure @@ -0,0 +1,8277 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for Grid 1.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: paboyle@ph.ed.ac.uk about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Grid' +PACKAGE_TARNAME='grid' +PACKAGE_VERSION='1.0' +PACKAGE_STRING='Grid 1.0' +PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' +PACKAGE_URL='' + +ac_unique_file="lib/Grid.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +USE_LAPACK_LIB_FALSE +USE_LAPACK_LIB_TRUE +USE_LAPACK_FALSE +USE_LAPACK_TRUE +BUILD_CHROMA_REGRESSION_FALSE +BUILD_CHROMA_REGRESSION_TRUE +BUILD_COMMS_NONE_FALSE +BUILD_COMMS_NONE_TRUE +BUILD_COMMS_MPI_FALSE +BUILD_COMMS_MPI_TRUE +BUILD_COMMS_SHMEM_FALSE +BUILD_COMMS_SHMEM_TRUE +BUILD_ZMM_FALSE +BUILD_ZMM_TRUE +EGREP +GREP +CXXCPP +SIMD_FLAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +ac_ct_CC +CFLAGS +CC +RANLIB +OPENMP_CXXFLAGS +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CXX +CPPFLAGS +LDFLAGS +CXXFLAGS +CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_openmp +enable_simd +enable_precision +enable_comms +enable_rng +enable_timers +enable_chroma +enable_lapack +' + ac_precious_vars='build_alias +host_alias +target_alias +CXX +CXXFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCC +CC +CFLAGS +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Grid 1.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/grid] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Grid 1.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --disable-openmp do not use OpenMP + --enable-simd=SSE4|AVX|AVXFMA4|AVX2|AVX512|IMCI + Select instructions to be SSE4.0, AVX 1.0, AVX + 2.0+FMA, AVX 512, IMCI + --enable-precision=single|double + Select default word size of Real + --enable-comms=none|mpi Select communications + --enable-rng=ranlux48|mt19937 + Select Random Number Generator to be used + --enable-timers=yes|no Enable system dependent high res timers + --enable-chroma Expect chroma compiled under c++11 + --enable-lapack Enable lapack yes/no + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Grid configure 1.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_cxx_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_mongrel + +# ac_fn_cxx_try_run LINENO +# ------------------------ +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_cxx_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_run + +# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_cxx_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_compile + +# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES +# ----------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_cxx_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_decl + +# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES +# --------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_cxx_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_cxx_check_func LINENO FUNC VAR +# ------------------------------------ +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_cxx_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Grid $as_me 1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='grid' + VERSION='1.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + + +ac_config_headers="$ac_config_headers lib/Config.h" + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +Configuring $PACKAGE v$VERSION for $host +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +" >&5 +$as_echo "$as_me: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +Configuring $PACKAGE v$VERSION for $host +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +" >&6;} + +# Checks for programs. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + OPENMP_CXXFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to support OpenMP" >&5 +$as_echo_n "checking for $CXX option to support OpenMP... " >&6; } +if ${ac_cv_prog_cxx_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp='none needed' +else + ac_cv_prog_cxx_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $ac_option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CXXFLAGS=$ac_save_CXXFLAGS + if test "$ac_cv_prog_cxx_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_openmp" >&5 +$as_echo "$ac_cv_prog_cxx_openmp" >&6; } + case $ac_cv_prog_cxx_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_CXXFLAGS=$ac_cv_prog_cxx_openmp ;; + esac + fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +#AX_CXX_COMPILE_STDCXX_11(noext, mandatory) +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid output" >&5 +$as_echo_n "checking for x86 cpuid output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = , eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_" >&6; } +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86-AVX xgetbv output" >&5 +$as_echo_n "checking for x86-AVX xgetbv output... " >&6; } +if ${ax_cv_gcc_x86_avx_xgetbv_+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_avx_xgetbv_=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = , eax, edx; + FILE *f; + /* Opcodes for xgetbv */ + __asm__(".byte 0x0f, 0x01, 0xd0" + : "=a" (eax), "=d" (edx) + : "c" (op)); + f = fopen("conftest_xgetbv", "w"); if (!f) return 1; + fprintf(f, "%x:%x\n", eax, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_avx_xgetbv_=`cat conftest_xgetbv`; rm -f conftest_xgetbv +else + ax_cv_gcc_x86_avx_xgetbv_=unknown; rm -f conftest_xgetbv +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_avx_xgetbv_" >&5 +$as_echo "$ax_cv_gcc_x86_avx_xgetbv_" >&6; } +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + + + case $host_cpu in + powerpc*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether altivec is supported" >&5 +$as_echo_n "checking whether altivec is supported... " >&6; } +if ${ax_cv_have_altivec_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test `/usr/sbin/sysctl -a 2>/dev/null| grep -c hw.optional.altivec` != 0; then + if test `/usr/sbin/sysctl -n hw.optional.altivec` = 1; then + ax_cv_have_altivec_ext=yes + fi + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_altivec_ext" >&5 +$as_echo "$ax_cv_have_altivec_ext" >&6; } + + if test "$ax_cv_have_altivec_ext" = yes; then + +$as_echo "#define HAVE_ALTIVEC /**/" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -faltivec" >&5 +$as_echo_n "checking whether C++ compiler accepts -faltivec... " >&6; } +if ${ax_cv_check_cxxflags___faltivec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -faltivec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___faltivec=yes +else + ax_cv_check_cxxflags___faltivec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___faltivec" >&5 +$as_echo "$ax_cv_check_cxxflags___faltivec" >&6; } +if test x"$ax_cv_check_cxxflags___faltivec" = xyes; then : + SIMD_FLAGS="$SIMD_FLAGS -faltivec" +else + : +fi + + fi + ;; + + + i[3456]86*|x86_64*|amd64*) + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x00000001 output" >&5 +$as_echo_n "checking for x86 cpuid 0x00000001 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0x00000001+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0x00000001=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0x00000001, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0x00000001=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0x00000001=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x00000001" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0x00000001" >&6; } +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + ecx=0 + edx=0 + ebx=0 + if test "$ax_cv_gcc_x86_cpuid_0x00000001" != "unknown"; + then + ecx=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 3` + edx=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 4` + fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x00000007 output" >&5 +$as_echo_n "checking for x86 cpuid 0x00000007 output... " >&6; } +if ${ax_cv_gcc_x86_cpuid_0x00000007+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_cpuid_0x00000007=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0x00000007, eax, ebx, ecx, edx; + FILE *f; + __asm__("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op)); + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_cpuid_0x00000007=`cat conftest_cpuid`; rm -f conftest_cpuid +else + ax_cv_gcc_x86_cpuid_0x00000007=unknown; rm -f conftest_cpuid +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x00000007" >&5 +$as_echo "$ax_cv_gcc_x86_cpuid_0x00000007" >&6; } +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + if test "$ax_cv_gcc_x86_cpuid_0x00000007" != "unknown"; + then + ebx=`echo $ax_cv_gcc_x86_cpuid_0x00000007 | cut -d ":" -f 2` + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmx is supported" >&5 +$as_echo_n "checking whether mmx is supported... " >&6; } +if ${ax_cv_have_mmx_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_mmx_ext=no + if test "$((0x$edx>>23&0x01))" = 1; then + ax_cv_have_mmx_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_mmx_ext" >&5 +$as_echo "$ax_cv_have_mmx_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sse is supported" >&5 +$as_echo_n "checking whether sse is supported... " >&6; } +if ${ax_cv_have_sse_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_sse_ext=no + if test "$((0x$edx>>25&0x01))" = 1; then + ax_cv_have_sse_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_sse_ext" >&5 +$as_echo "$ax_cv_have_sse_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sse2 is supported" >&5 +$as_echo_n "checking whether sse2 is supported... " >&6; } +if ${ax_cv_have_sse2_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_sse2_ext=no + if test "$((0x$edx>>26&0x01))" = 1; then + ax_cv_have_sse2_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_sse2_ext" >&5 +$as_echo "$ax_cv_have_sse2_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sse3 is supported" >&5 +$as_echo_n "checking whether sse3 is supported... " >&6; } +if ${ax_cv_have_sse3_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_sse3_ext=no + if test "$((0x$ecx&0x01))" = 1; then + ax_cv_have_sse3_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_sse3_ext" >&5 +$as_echo "$ax_cv_have_sse3_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ssse3 is supported" >&5 +$as_echo_n "checking whether ssse3 is supported... " >&6; } +if ${ax_cv_have_ssse3_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_ssse3_ext=no + if test "$((0x$ecx>>9&0x01))" = 1; then + ax_cv_have_ssse3_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_ssse3_ext" >&5 +$as_echo "$ax_cv_have_ssse3_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sse4.1 is supported" >&5 +$as_echo_n "checking whether sse4.1 is supported... " >&6; } +if ${ax_cv_have_sse41_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_sse41_ext=no + if test "$((0x$ecx>>19&0x01))" = 1; then + ax_cv_have_sse41_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_sse41_ext" >&5 +$as_echo "$ax_cv_have_sse41_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sse4.2 is supported" >&5 +$as_echo_n "checking whether sse4.2 is supported... " >&6; } +if ${ax_cv_have_sse42_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_sse42_ext=no + if test "$((0x$ecx>>20&0x01))" = 1; then + ax_cv_have_sse42_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_sse42_ext" >&5 +$as_echo "$ax_cv_have_sse42_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether avx is supported by processor" >&5 +$as_echo_n "checking whether avx is supported by processor... " >&6; } +if ${ax_cv_have_avx_cpu_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_avx_cpu_ext=no + if test "$((0x$ecx>>28&0x01))" = 1; then + ax_cv_have_avx_cpu_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_avx_cpu_ext" >&5 +$as_echo "$ax_cv_have_avx_cpu_ext" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether avx2 is supported by processor" >&5 +$as_echo_n "checking whether avx2 is supported by processor... " >&6; } +if ${ax_cv_have_avx2_cpu_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_avx2_cpu_ext=no + if test "$((0x$ebx>>5&0x01))" = 1; then + ax_cv_have_avx2_cpu_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_avx2_cpu_ext" >&5 +$as_echo "$ax_cv_have_avx2_cpu_ext" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fma is supported by processor" >&5 +$as_echo_n "checking whether fma is supported by processor... " >&6; } +if ${ax_cv_have_fma_cpu_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_fma_cpu_ext=no + if test "$((0x$ecx>>12&0x01))" = 1; then + ax_cv_have_fma_cpu_ext=yes + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_fma_cpu_ext" >&5 +$as_echo "$ax_cv_have_fma_cpu_ext" >&6; } + + + if test x"$ax_cv_have_avx_cpu_ext" = x"yes"; then + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86-AVX xgetbv 0x00000000 output" >&5 +$as_echo_n "checking for x86-AVX xgetbv 0x00000000 output... " >&6; } +if ${ax_cv_gcc_x86_avx_xgetbv_0x00000000+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ax_cv_gcc_x86_avx_xgetbv_0x00000000=unknown +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + int op = 0x00000000, eax, edx; + FILE *f; + /* Opcodes for xgetbv */ + __asm__(".byte 0x0f, 0x01, 0xd0" + : "=a" (eax), "=d" (edx) + : "c" (op)); + f = fopen("conftest_xgetbv", "w"); if (!f) return 1; + fprintf(f, "%x:%x\n", eax, edx); + fclose(f); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_gcc_x86_avx_xgetbv_0x00000000=`cat conftest_xgetbv`; rm -f conftest_xgetbv +else + ax_cv_gcc_x86_avx_xgetbv_0x00000000=unknown; rm -f conftest_xgetbv +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_avx_xgetbv_0x00000000" >&5 +$as_echo "$ax_cv_gcc_x86_avx_xgetbv_0x00000000" >&6; } +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + xgetbv_eax="0" + if test x"$ax_cv_gcc_x86_avx_xgetbv_0x00000000" != x"unknown"; then + xgetbv_eax=`echo $ax_cv_gcc_x86_avx_xgetbv_0x00000000 | cut -d ":" -f 1` + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether avx is supported by operating system" >&5 +$as_echo_n "checking whether avx is supported by operating system... " >&6; } +if ${ax_cv_have_avx_ext+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_cv_have_avx_ext=no + + if test "$((0x$ecx>>27&0x01))" = 1; then + if test "$((0x$xgetbv_eax&0x6))" = 6; then + ax_cv_have_avx_ext=yes + fi + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_avx_ext" >&5 +$as_echo "$ax_cv_have_avx_ext" >&6; } + if test x"$ax_cv_have_avx_ext" = x"no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports AVX, but your operating system doesn't" >&5 +$as_echo "$as_me: WARNING: Your processor supports AVX, but your operating system doesn't" >&2;} + fi + fi + + if test "$ax_cv_have_mmx_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mmmx" >&5 +$as_echo_n "checking whether C++ compiler accepts -mmmx... " >&6; } +if ${ax_cv_check_cxxflags___mmmx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mmmx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___mmmx=yes +else + ax_cv_check_cxxflags___mmmx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mmmx" >&5 +$as_echo "$ax_cv_check_cxxflags___mmmx" >&6; } +if test x"$ax_cv_check_cxxflags___mmmx" = xyes; then : + ax_cv_support_mmx_ext=yes +else + : +fi + + if test x"$ax_cv_support_mmx_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -mmmx" + +$as_echo "#define HAVE_MMX /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports mmx instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports mmx instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_sse_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse" >&5 +$as_echo_n "checking whether C++ compiler accepts -msse... " >&6; } +if ${ax_cv_check_cxxflags___msse+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___msse=yes +else + ax_cv_check_cxxflags___msse=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse" >&5 +$as_echo "$ax_cv_check_cxxflags___msse" >&6; } +if test x"$ax_cv_check_cxxflags___msse" = xyes; then : + ax_cv_support_sse_ext=yes +else + : +fi + + if test x"$ax_cv_support_sse_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -msse" + +$as_echo "#define HAVE_SSE /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports sse instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports sse instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_sse2_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse2" >&5 +$as_echo_n "checking whether C++ compiler accepts -msse2... " >&6; } +if ${ax_cv_check_cxxflags___msse2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___msse2=yes +else + ax_cv_check_cxxflags___msse2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse2" >&5 +$as_echo "$ax_cv_check_cxxflags___msse2" >&6; } +if test x"$ax_cv_check_cxxflags___msse2" = xyes; then : + ax_cv_support_sse2_ext=yes +else + : +fi + + if test x"$ax_cv_support_sse2_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -msse2" + +$as_echo "#define HAVE_SSE2 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports sse2 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports sse2 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_sse3_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse3" >&5 +$as_echo_n "checking whether C++ compiler accepts -msse3... " >&6; } +if ${ax_cv_check_cxxflags___msse3+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse3" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___msse3=yes +else + ax_cv_check_cxxflags___msse3=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse3" >&5 +$as_echo "$ax_cv_check_cxxflags___msse3" >&6; } +if test x"$ax_cv_check_cxxflags___msse3" = xyes; then : + ax_cv_support_sse3_ext=yes +else + : +fi + + if test x"$ax_cv_support_sse3_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -msse3" + +$as_echo "#define HAVE_SSE3 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports sse3 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports sse3 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_ssse3_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mssse3" >&5 +$as_echo_n "checking whether C++ compiler accepts -mssse3... " >&6; } +if ${ax_cv_check_cxxflags___mssse3+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mssse3" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___mssse3=yes +else + ax_cv_check_cxxflags___mssse3=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mssse3" >&5 +$as_echo "$ax_cv_check_cxxflags___mssse3" >&6; } +if test x"$ax_cv_check_cxxflags___mssse3" = xyes; then : + ax_cv_support_ssse3_ext=yes +else + : +fi + + if test x"$ax_cv_support_ssse3_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -mssse3" + +$as_echo "#define HAVE_SSSE3 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports ssse3 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports ssse3 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_sse41_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse4.1" >&5 +$as_echo_n "checking whether C++ compiler accepts -msse4.1... " >&6; } +if ${ax_cv_check_cxxflags___msse4_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse4.1" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___msse4_1=yes +else + ax_cv_check_cxxflags___msse4_1=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse4_1" >&5 +$as_echo "$ax_cv_check_cxxflags___msse4_1" >&6; } +if test x"$ax_cv_check_cxxflags___msse4_1" = xyes; then : + ax_cv_support_sse41_ext=yes +else + : +fi + + if test x"$ax_cv_support_sse41_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -msse4.1" + +$as_echo "#define HAVE_SSE4_1 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports sse4.1 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports sse4.1 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_sse42_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse4.2" >&5 +$as_echo_n "checking whether C++ compiler accepts -msse4.2... " >&6; } +if ${ax_cv_check_cxxflags___msse4_2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse4.2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___msse4_2=yes +else + ax_cv_check_cxxflags___msse4_2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse4_2" >&5 +$as_echo "$ax_cv_check_cxxflags___msse4_2" >&6; } +if test x"$ax_cv_check_cxxflags___msse4_2" = xyes; then : + ax_cv_support_sse42_ext=yes +else + : +fi + + if test x"$ax_cv_support_sse42_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -msse4.2" + +$as_echo "#define HAVE_SSE4_2 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports sse4.2 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports sse4.2 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_avx_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mavx" >&5 +$as_echo_n "checking whether C++ compiler accepts -mavx... " >&6; } +if ${ax_cv_check_cxxflags___mavx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mavx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___mavx=yes +else + ax_cv_check_cxxflags___mavx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mavx" >&5 +$as_echo "$ax_cv_check_cxxflags___mavx" >&6; } +if test x"$ax_cv_check_cxxflags___mavx" = xyes; then : + ax_cv_support_avx_ext=yes +else + : +fi + + if test x"$ax_cv_support_avx_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -mavx" + +$as_echo "#define HAVE_AVX /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports avx instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports avx instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_avx2_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mavx2" >&5 +$as_echo_n "checking whether C++ compiler accepts -mavx2... " >&6; } +if ${ax_cv_check_cxxflags___mavx2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mavx2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___mavx2=yes +else + ax_cv_check_cxxflags___mavx2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mavx2" >&5 +$as_echo "$ax_cv_check_cxxflags___mavx2" >&6; } +if test x"$ax_cv_check_cxxflags___mavx2" = xyes; then : + ax_cv_support_avx2_ext=yes +else + : +fi + + if test x"$ax_cv_support_avx2_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -mavx2" + +$as_echo "#define HAVE_AVX2 /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports avx2 instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports avx2 instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + if test "$ax_cv_have_fma_ext" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mfma" >&5 +$as_echo_n "checking whether C++ compiler accepts -mfma... " >&6; } +if ${ax_cv_check_cxxflags___mfma+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mfma" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_check_cxxflags___mfma=yes +else + ax_cv_check_cxxflags___mfma=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mfma" >&5 +$as_echo "$ax_cv_check_cxxflags___mfma" >&6; } +if test x"$ax_cv_check_cxxflags___mfma" = xyes; then : + ax_cv_support_fma_ext=yes +else + : +fi + + if test x"$ax_cv_support_fma_ext" = x"yes"; then + SIMD_FLAGS="$SIMD_FLAGS -mfma" + +$as_echo "#define HAVE_FMA /**/" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor supports fma instructions but not your compiler, can you try another compiler?" >&5 +$as_echo "$as_me: WARNING: Your processor supports fma instructions but not your compiler, can you try another compiler?" >&2;} + fi + fi + + ;; + esac + + + + +# Checks for libraries. +#AX_GCC_VAR_ATTRIBUTE(aligned) + +# Checks for header files. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_cxx_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in stdint.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + +for ac_header in mm_malloc.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "mm_malloc.h" "ac_cv_header_mm_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_mm_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MM_MALLOC_H 1 +_ACEOF + +fi + +done + +for ac_header in malloc/malloc.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MALLOC_MALLOC_H 1 +_ACEOF + +fi + +done + +for ac_header in malloc.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MALLOC_H 1 +_ACEOF + +fi + +done + +for ac_header in endian.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_endian_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ENDIAN_H 1 +_ACEOF + +fi + +done + +for ac_header in execinfo.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_execinfo_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EXECINFO_H 1 +_ACEOF + +fi + +done + +for ac_header in gmp.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" +if test "x$ac_cv_header_gmp_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GMP_H 1 +_ACEOF + +fi + +done + +ac_fn_cxx_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include +" +if test "x$ac_cv_have_decl_ntohll" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NTOHLL $ac_have_decl +_ACEOF + +ac_fn_cxx_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include +" +if test "x$ac_cv_have_decl_be64toh" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH $ac_have_decl +_ACEOF + + +# Checks for typedefs, structures, and compiler characteristics. +ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + + +# Checks for library functions. +echo +echo Checking libraries +echo ::::::::::::::::::::::::::::::::::::::::::: + +for ac_func in gettimeofday +do : + ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETTIMEOFDAY 1 +_ACEOF + +fi +done + + +#AC_CHECK_LIB([gmp],[__gmpf_init],, +# [AC_MSG_ERROR(GNU Multiple Precision GMP library was not found in your system. +#Please install or provide the correct path to your installation +#Info at: http://www.gmplib.org)]) + +#AC_CHECK_LIB([mpfr],[mpfr_init],, +# [AC_MSG_ERROR(GNU Multiple Precision MPFR library was not found in your system. +#Please install or provide the correct path to your installation +#Info at: http://www.mpfr.org/)]) + +# +# SIMD instructions selection +# + +# Check whether --enable-simd was given. +if test "${enable_simd+set}" = set; then : + enableval=$enable_simd; \ + ac_SIMD=${enable_simd} +else + ac_SIMD=DEBUG +fi + + +supported=no + +ac_ZMM=no; + +case ${ac_SIMD} in + SSE4) + echo Configuring for SSE4 + +$as_echo "#define SSE4 1" >>confdefs.h + + if test x"$ax_cv_support_ssse3_ext" = x"yes"; then supported=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor does not support SSE4 instructions" >&5 +$as_echo "$as_me: WARNING: Your processor does not support SSE4 instructions" >&2;} + fi + ;; + AVX) + echo Configuring for AVX + +$as_echo "#define AVX1 1" >>confdefs.h + + if test x"$ax_cv_support_avx_ext" = x"yes"; then supported=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor does not support AVX instructions" >&5 +$as_echo "$as_me: WARNING: Your processor does not support AVX instructions" >&2;} + fi + ;; + AVXFMA4) + echo Configuring for AVX + +$as_echo "#define AVXFMA4 1" >>confdefs.h + + if test x"$ax_cv_support_avx_ext" = x"yes"; then supported=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor does not support AVX instructions" >&5 +$as_echo "$as_me: WARNING: Your processor does not support AVX instructions" >&2;} + fi + ;; + AVX2) + echo Configuring for AVX2 + +$as_echo "#define AVX2 1" >>confdefs.h + + if test x"$ax_cv_support_avx2_ext" = x"yes"; then supported=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your processor does not support AVX2 instructions" >&5 +$as_echo "$as_me: WARNING: Your processor does not support AVX2 instructions" >&2;} + fi + ;; + AVX512) + echo Configuring for AVX512 + +$as_echo "#define AVX512 1" >>confdefs.h + + supported="cross compilation" + ac_ZMM=yes; + ;; + IMCI) + echo Configuring for IMCI + +$as_echo "#define IMCI 1" >>confdefs.h + + supported="cross compilation" + ac_ZMM=no; + ;; + NEONv8) + echo Configuring for experimental ARMv8a support + +$as_echo "#define NEONv8 1" >>confdefs.h + + supported="cross compilation" + ;; + DEBUG) + echo Configuring without SIMD support - only for compiler DEBUGGING! + +$as_echo "#define EMPTY_SIMD 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_SIMD} flag unsupported as --enable-simd option\nRun ./configure --help for the list of options" "$LINENO" 5; + ;; +esac + +case ${ac_ZMM} in +yes) + echo Enabling ZMM source code +;; +no) + echo Disabling ZMM source code +;; +esac + + if test "X${ac_ZMM}X" == "XyesX" ; then + BUILD_ZMM_TRUE= + BUILD_ZMM_FALSE='#' +else + BUILD_ZMM_TRUE='#' + BUILD_ZMM_FALSE= +fi + + +# Check whether --enable-precision was given. +if test "${enable_precision+set}" = set; then : + enableval=$enable_precision; ac_PRECISION=${enable_precision} +else + ac_PRECISION=double +fi + +case ${ac_PRECISION} in + single) + echo default precision is single + +$as_echo "#define GRID_DEFAULT_PRECISION_SINGLE 1" >>confdefs.h + + ;; + double) + echo default precision is double + +$as_echo "#define GRID_DEFAULT_PRECISION_DOUBLE 1" >>confdefs.h + + ;; +esac + +# +# Comms selection +# + +# Check whether --enable-comms was given. +if test "${enable_comms+set}" = set; then : + enableval=$enable_comms; ac_COMMS=${enable_comms} +else + ac_COMMS=none +fi + + +case ${ac_COMMS} in + none) + echo Configuring for NO communications + +$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h + + ;; + mpi) + echo Configuring for MPI communications + +$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h + + ;; + shmem) + echo Configuring for SHMEM communications + +$as_echo "#define GRID_COMMS_SHMEM 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; + ;; +esac + + if test "X${ac_COMMS}X" == "XshmemX" ; then + BUILD_COMMS_SHMEM_TRUE= + BUILD_COMMS_SHMEM_FALSE='#' +else + BUILD_COMMS_SHMEM_TRUE='#' + BUILD_COMMS_SHMEM_FALSE= +fi + + if test "X${ac_COMMS}X" == "XmpiX" ; then + BUILD_COMMS_MPI_TRUE= + BUILD_COMMS_MPI_FALSE='#' +else + BUILD_COMMS_MPI_TRUE='#' + BUILD_COMMS_MPI_FALSE= +fi + + if test "X${ac_COMMS}X" == "XnoneX" ; then + BUILD_COMMS_NONE_TRUE= + BUILD_COMMS_NONE_FALSE='#' +else + BUILD_COMMS_NONE_TRUE='#' + BUILD_COMMS_NONE_FALSE= +fi + + +# +# RNG selection +# +# Check whether --enable-rng was given. +if test "${enable_rng+set}" = set; then : + enableval=$enable_rng; \ + ac_RNG=${enable_rng} +else + ac_RNG=ranlux48 +fi + +case ${ac_RNG} in + ranlux48) + +$as_echo "#define RNG_RANLUX 1" >>confdefs.h + + ;; + mt19937) + +$as_echo "#define RNG_MT19937 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_RNG} unsupported --enable-rng option" "$LINENO" 5; + ;; +esac + +# +# SDE timing mode +# +# Check whether --enable-timers was given. +if test "${enable_timers+set}" = set; then : + enableval=$enable_timers; \ + ac_TIMERS=${enable_timers} +else + ac_TIMERS=yes +fi + +case ${ac_TIMERS} in + yes) + +$as_echo "#define TIMERS_ON 1" >>confdefs.h + + ;; + no) + +$as_echo "#define TIMERS_OFF 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_TIMERS} unsupported --enable-timers option" "$LINENO" 5; + ;; +esac + +# +# Chroma regression tests +# +# Check whether --enable-chroma was given. +if test "${enable_chroma+set}" = set; then : + enableval=$enable_chroma; ac_CHROMA=yes +else + ac_CHROMA=no +fi + + +case ${ac_CHROMA} in + yes) + echo Enabling tests regressing to Chroma + ;; + no) + echo Disabling tests regressing to Chroma + ;; + *) + as_fn_error $? "${ac_CHROMA} unsupported --enable-chroma option" "$LINENO" 5; + ;; +esac + + if test "X${ac_CHROMA}X" == "XyesX" ; then + BUILD_CHROMA_REGRESSION_TRUE= + BUILD_CHROMA_REGRESSION_FALSE='#' +else + BUILD_CHROMA_REGRESSION_TRUE='#' + BUILD_CHROMA_REGRESSION_FALSE= +fi + + +# +# Lapack +# +# Check whether --enable-lapack was given. +if test "${enable_lapack+set}" = set; then : + enableval=$enable_lapack; ac_LAPACK=${enable_lapack} +else + ac_LAPACK=no +fi + + +case ${ac_LAPACK} in + yes) + echo Enabling lapack + ;; + no) + echo Disabling lapack + ;; + *) + echo Enabling lapack at ${ac_LAPACK} + ;; +esac + + if test "X${ac_LAPACK}X" != "XnoX" ; then + USE_LAPACK_TRUE= + USE_LAPACK_FALSE='#' +else + USE_LAPACK_TRUE='#' + USE_LAPACK_FALSE= +fi + + if test "X${ac_LAPACK}X" != "XyesX" ; then + USE_LAPACK_LIB_TRUE= + USE_LAPACK_LIB_FALSE='#' +else + USE_LAPACK_LIB_TRUE='#' + USE_LAPACK_LIB_FALSE= +fi + + +################################################################### +# Checks for doxygen support +# if present enables the "make doxyfile" command +#echo +#echo Checking doxygen support +#echo ::::::::::::::::::::::::::::::::::::::::::: +#AC_PROG_DOXYGEN + +#if test -n "$DOXYGEN" +#then +#AC_CONFIG_FILES([docs/doxy.cfg]) +#fi + +echo +echo Creating configuration files +echo ::::::::::::::::::::::::::::::::::::::::::: +ac_config_files="$ac_config_files Makefile" + +ac_config_files="$ac_config_files lib/Makefile" + +ac_config_files="$ac_config_files tests/Makefile" + +ac_config_files="$ac_config_files tests/qdpxx/Makefile" + +ac_config_files="$ac_config_files benchmarks/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_ZMM_TRUE}" && test -z "${BUILD_ZMM_FALSE}"; then + as_fn_error $? "conditional \"BUILD_ZMM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_COMMS_SHMEM_TRUE}" && test -z "${BUILD_COMMS_SHMEM_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_SHMEM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_CHROMA_REGRESSION_TRUE}" && test -z "${BUILD_CHROMA_REGRESSION_FALSE}"; then + as_fn_error $? "conditional \"BUILD_CHROMA_REGRESSION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LAPACK_TRUE}" && test -z "${USE_LAPACK_FALSE}"; then + as_fn_error $? "conditional \"USE_LAPACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LAPACK_LIB_TRUE}" && test -z "${USE_LAPACK_LIB_FALSE}"; then + as_fn_error $? "conditional \"USE_LAPACK_LIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Grid $as_me 1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Grid config.status 1.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "lib/Config.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/Config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/qdpxx/Makefile") CONFIG_FILES="$CONFIG_FILES tests/qdpxx/Makefile" ;; + "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + +echo " +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Summary of configuration for $PACKAGE v$VERSION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following features are enabled: + +- architecture (build) : $build_cpu +- os (build) : $build_os +- architecture (target) : $target_cpu +- os (target) : $target_os +- build DOXYGEN documentation : `if test "x$enable_doc" = xyes; then echo yes; else echo no; fi` +- graphs and diagrams : `if test "x$enable_dot" = xyes; then echo yes; else echo no; fi` +- Supported SIMD flags : $SIMD_FLAGS +---------------------------------------------------------- +- enabled simd support : ${ac_SIMD} (config macro says supported: $supported ) +- communications type : ${ac_COMMS} +- default precision : ${ac_PRECISION} +- RNG choice : ${ac_RNG} +- LAPACK : ${ac_LAPACK} + + +" diff --git a/lib/Algorithms.h b/lib/Algorithms.h index 6f147186..e5d1606e 100644 --- a/lib/Algorithms.h +++ b/lib/Algorithms.h @@ -43,7 +43,8 @@ Author: Peter Boyle #include #include -#include +#include +#include // Lanczos support #include diff --git a/lib/Init.cc b/lib/Init.cc index 3b413177..6543435c 100644 --- a/lib/Init.cc +++ b/lib/Init.cc @@ -193,7 +193,7 @@ void Grid_init(int *argc,char ***argv) std::cout< Author: Azusa Yamaguchi Author: Peter Boyle Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #include namespace Grid { GridStopWatch Logger::StopWatch; -std::ostream Logger::devnull(0); -std::string Logger::BLACK("\033[30m"); -std::string Logger::RED("\033[31m"); -std::string Logger::GREEN("\033[32m"); -std::string Logger::YELLOW("\033[33m"); -std::string Logger::BLUE("\033[34m"); -std::string Logger::PURPLE("\033[35m"); -std::string Logger::CYAN("\033[36m"); -std::string Logger::WHITE("\033[37m"); -std::string Logger::NORMAL("\033[0;39m"); -std::string EMPTY(""); +std::ostream Logger::devnull(0); -#if 0 - GridLogger GridLogError (1,"Error",Logger::RED); - GridLogger GridLogWarning (1,"Warning",Logger::YELLOW); - GridLogger GridLogMessage (1,"Message",Logger::BLACK); - GridLogger GridLogDebug (1,"Debug",Logger::PURPLE); - GridLogger GridLogPerformance(1,"Performance",Logger::GREEN); - GridLogger GridLogIterative (1,"Iterative",Logger::BLUE); - GridLogger GridLogIntegrator (1,"Integrator",Logger::BLUE); -#else - GridLogger GridLogError (1,"Error",EMPTY); - GridLogger GridLogWarning (1,"Warning",EMPTY); - GridLogger GridLogMessage (1,"Message",EMPTY); - GridLogger GridLogDebug (1,"Debug",EMPTY); - GridLogger GridLogPerformance(1,"Performance",EMPTY); - GridLogger GridLogIterative (1,"Iterative",EMPTY); - GridLogger GridLogIntegrator (1,"Integrator",EMPTY); -#endif +Colours GridLogColours(0); +GridLogger GridLogError(1, "Error", GridLogColours, "RED"); +GridLogger GridLogWarning(1, "Warning", GridLogColours, "YELLOW"); +GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL"); +GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE"); +GridLogger GridLogPerformance(1, "Performance", GridLogColours, "GREEN"); +GridLogger GridLogIterative(1, "Iterative", GridLogColours, "BLUE"); +GridLogger GridLogIntegrator(1, "Integrator", GridLogColours, "BLUE"); -void GridLogConfigure(std::vector &logstreams) -{ +void GridLogConfigure(std::vector &logstreams) { GridLogError.Active(0); GridLogWarning.Active(0); - GridLogMessage.Active(0); + GridLogMessage.Active(1); // at least the messages should be always on GridLogIterative.Active(0); GridLogDebug.Active(0); GridLogPerformance.Active(0); GridLogIntegrator.Active(0); + GridLogColours.Active(0); - int blackAndWhite = 1; - if(blackAndWhite){ - Logger::BLACK = std::string(""); - Logger::RED =Logger::BLACK; - Logger::GREEN =Logger::BLACK; - Logger::YELLOW =Logger::BLACK; - Logger::BLUE =Logger::BLACK; - Logger::PURPLE =Logger::BLACK; - Logger::CYAN =Logger::BLACK; - Logger::WHITE =Logger::BLACK; - Logger::NORMAL =Logger::BLACK; - } - - for(int i=0;i -Author: Azusa Yamaguchi -Author: Peter Boyle + Author: Antonin Portelli + Author: Azusa Yamaguchi + Author: Peter Boyle This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +27,9 @@ Author: Peter Boyle See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ + +#include + #ifndef GRID_LOG_H #define GRID_LOG_H @@ -34,56 +37,99 @@ Author: Peter Boyle #include #endif -namespace Grid { + namespace Grid { // Dress the output; use std::chrono for time stamping via the StopWatch class int Rank(void); // used for early stage debug before library init +class Colours{ +protected: + bool is_active; +public: + std::map colour; + + Colours(bool activate=false){ + Active(activate); + }; + + void Active(bool activate){ + is_active=activate; + + if (is_active){ + colour["BLACK"] ="\033[30m"; + colour["RED"] ="\033[31m"; + colour["GREEN"] ="\033[32m"; + colour["YELLOW"] ="\033[33m"; + colour["BLUE"] ="\033[34m"; + colour["PURPLE"] ="\033[35m"; + colour["CYAN"] ="\033[36m"; + colour["WHITE"] ="\033[37m"; + colour["NORMAL"] ="\033[0;39m"; + } else { + colour["BLACK"] =""; + colour["RED"] =""; + colour["GREEN"] =""; + colour["YELLOW"]=""; + colour["BLUE"] =""; + colour["PURPLE"]=""; + colour["CYAN"] =""; + colour["WHITE"] =""; + colour["NORMAL"]=""; + } + + +}; + +}; + + class Logger { protected: - int active; - std::string name, topName, COLOUR; -public: - static GridStopWatch StopWatch; - static std::ostream devnull; + Colours &Painter; + int active; + std::string name, topName; + std::string COLOUR; - static std::string BLACK; - static std::string RED ; - static std::string GREEN; - static std::string YELLOW; - static std::string BLUE ; - static std::string PURPLE; - static std::string CYAN ; - static std::string WHITE ; - static std::string NORMAL; - - Logger(std::string topNm, int on, std::string nm,std::string col) - : active(on), name(nm), topName(topNm), COLOUR(col) {}; - - void Active(int on) {active = on;}; - int isActive(void) {return active;}; - - friend std::ostream& operator<< (std::ostream& stream, const Logger& log){ - if ( log.active ) { - StopWatch.Stop(); - GridTime now = StopWatch.Elapsed(); - StopWatch.Start(); - stream << BLACK < &logstreams); @@ -95,38 +141,40 @@ extern GridLogger GridLogDebug ; extern GridLogger GridLogPerformance; extern GridLogger GridLogIterative ; extern GridLogger GridLogIntegrator ; +extern Colours GridLogColours; #define _NBACKTRACE (256) extern void * Grid_backtrace_buffer[_NBACKTRACE]; #define BACKTRACEFILE() {\ - char string[20]; \ - std::sprintf(string,"backtrace.%d",Rank()); \ - std::FILE * fp = std::fopen(string,"w"); \ - BACKTRACEFP(fp)\ - std::fclose(fp); \ +char string[20]; \ +std::sprintf(string,"backtrace.%d",Rank()); \ +std::FILE * fp = std::fopen(string,"w"); \ +BACKTRACEFP(fp)\ +std::fclose(fp); \ } #ifdef HAVE_EXECINFO_H #define BACKTRACEFP(fp) { \ - int symbols = backtrace (Grid_backtrace_buffer,_NBACKTRACE);\ - char **strings = backtrace_symbols(Grid_backtrace_buffer,symbols);\ - for (int i = 0; i < symbols; i++){\ - std::fprintf (fp,"BackTrace Strings: %d %s\n",i, strings[i]); std::fflush(fp); \ - }\ +int symbols = backtrace (Grid_backtrace_buffer,_NBACKTRACE);\ +char **strings = backtrace_symbols(Grid_backtrace_buffer,symbols);\ +for (int i = 0; i < symbols; i++){\ + std::fprintf (fp,"BackTrace Strings: %d %s\n",i, strings[i]); std::fflush(fp); \ +}\ } #else #define BACKTRACEFP(fp) { \ - std::fprintf (fp,"BT %d %lx\n",0, __builtin_return_address(0)); std::fflush(fp); \ - std::fprintf (fp,"BT %d %lx\n",1, __builtin_return_address(1)); std::fflush(fp); \ - std::fprintf (fp,"BT %d %lx\n",2, __builtin_return_address(2)); std::fflush(fp); \ - std::fprintf (fp,"BT %d %lx\n",3, __builtin_return_address(3)); std::fflush(fp); \ +std::fprintf (fp,"BT %d %lx\n",0, __builtin_return_address(0)); std::fflush(fp); \ +std::fprintf (fp,"BT %d %lx\n",1, __builtin_return_address(1)); std::fflush(fp); \ +std::fprintf (fp,"BT %d %lx\n",2, __builtin_return_address(2)); std::fflush(fp); \ +std::fprintf (fp,"BT %d %lx\n",3, __builtin_return_address(3)); std::fflush(fp); \ } #endif #define BACKTRACE() BACKTRACEFP(stdout) + } #endif diff --git a/lib/Make.inc b/lib/Make.inc index c4380b48..94528a50 100644 --- a/lib/Make.inc +++ b/lib/Make.inc @@ -1,4 +1,4 @@ -HFILES=./algorithms/approx/bigfloat.h ./algorithms/approx/bigfloat_double.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Remez.h ./algorithms/approx/Zolotarev.h ./algorithms/CoarsenedMatrix.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/Francis.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/MatrixUtils.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/SchurRedBlack.h ./algorithms/LinearOperator.h ./algorithms/Preconditioner.h ./algorithms/SparseMatrix.h ./Algorithms.h ./AlignedAllocator.h ./cartesian/Cartesian_base.h ./cartesian/Cartesian_full.h ./cartesian/Cartesian_red_black.h ./Cartesian.h ./communicator/Communicator_base.h ./Communicator.h ./cshift/Cshift_common.h ./cshift/Cshift_mpi.h ./cshift/Cshift_none.h ./Cshift.h ./Eigen/src/Cholesky/LDLT.h ./Eigen/src/Cholesky/LLT.h ./Eigen/src/Cholesky/LLT_MKL.h ./Eigen/src/CholmodSupport/CholmodSupport.h ./Eigen/src/Core/arch/AltiVec/Complex.h ./Eigen/src/Core/arch/AltiVec/PacketMath.h ./Eigen/src/Core/arch/Default/Settings.h ./Eigen/src/Core/arch/NEON/Complex.h ./Eigen/src/Core/arch/NEON/PacketMath.h ./Eigen/src/Core/arch/SSE/Complex.h ./Eigen/src/Core/arch/SSE/MathFunctions.h ./Eigen/src/Core/arch/SSE/PacketMath.h ./Eigen/src/Core/Array.h ./Eigen/src/Core/ArrayBase.h ./Eigen/src/Core/ArrayWrapper.h ./Eigen/src/Core/Assign.h ./Eigen/src/Core/Assign_MKL.h ./Eigen/src/Core/BandMatrix.h ./Eigen/src/Core/Block.h ./Eigen/src/Core/BooleanRedux.h ./Eigen/src/Core/CommaInitializer.h ./Eigen/src/Core/CoreIterators.h ./Eigen/src/Core/CwiseBinaryOp.h ./Eigen/src/Core/CwiseNullaryOp.h ./Eigen/src/Core/CwiseUnaryOp.h ./Eigen/src/Core/CwiseUnaryView.h ./Eigen/src/Core/DenseBase.h ./Eigen/src/Core/DenseCoeffsBase.h ./Eigen/src/Core/DenseStorage.h ./Eigen/src/Core/Diagonal.h ./Eigen/src/Core/DiagonalMatrix.h ./Eigen/src/Core/DiagonalProduct.h ./Eigen/src/Core/Dot.h ./Eigen/src/Core/EigenBase.h ./Eigen/src/Core/Flagged.h ./Eigen/src/Core/ForceAlignedAccess.h ./Eigen/src/Core/Functors.h ./Eigen/src/Core/Fuzzy.h ./Eigen/src/Core/GeneralProduct.h ./Eigen/src/Core/GenericPacketMath.h ./Eigen/src/Core/GlobalFunctions.h ./Eigen/src/Core/IO.h ./Eigen/src/Core/Map.h ./Eigen/src/Core/MapBase.h ./Eigen/src/Core/MathFunctions.h ./Eigen/src/Core/Matrix.h ./Eigen/src/Core/MatrixBase.h ./Eigen/src/Core/NestByValue.h ./Eigen/src/Core/NoAlias.h ./Eigen/src/Core/NumTraits.h ./Eigen/src/Core/PermutationMatrix.h ./Eigen/src/Core/PlainObjectBase.h ./Eigen/src/Core/ProductBase.h ./Eigen/src/Core/products/CoeffBasedProduct.h ./Eigen/src/Core/products/GeneralBlockPanelKernel.h ./Eigen/src/Core/products/GeneralMatrixMatrix.h ./Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h ./Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h ./Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h ./Eigen/src/Core/products/GeneralMatrixVector.h ./Eigen/src/Core/products/GeneralMatrixVector_MKL.h ./Eigen/src/Core/products/Parallelizer.h ./Eigen/src/Core/products/SelfadjointMatrixMatrix.h ./Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h ./Eigen/src/Core/products/SelfadjointMatrixVector.h ./Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h ./Eigen/src/Core/products/SelfadjointProduct.h ./Eigen/src/Core/products/SelfadjointRank2Update.h ./Eigen/src/Core/products/TriangularMatrixMatrix.h ./Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h ./Eigen/src/Core/products/TriangularMatrixVector.h ./Eigen/src/Core/products/TriangularMatrixVector_MKL.h ./Eigen/src/Core/products/TriangularSolverMatrix.h ./Eigen/src/Core/products/TriangularSolverMatrix_MKL.h ./Eigen/src/Core/products/TriangularSolverVector.h ./Eigen/src/Core/Random.h ./Eigen/src/Core/Redux.h ./Eigen/src/Core/Ref.h ./Eigen/src/Core/Replicate.h ./Eigen/src/Core/ReturnByValue.h ./Eigen/src/Core/Reverse.h ./Eigen/src/Core/Select.h ./Eigen/src/Core/SelfAdjointView.h ./Eigen/src/Core/SelfCwiseBinaryOp.h ./Eigen/src/Core/SolveTriangular.h ./Eigen/src/Core/StableNorm.h ./Eigen/src/Core/Stride.h ./Eigen/src/Core/Swap.h ./Eigen/src/Core/Transpose.h ./Eigen/src/Core/Transpositions.h ./Eigen/src/Core/TriangularMatrix.h ./Eigen/src/Core/util/BlasUtil.h ./Eigen/src/Core/util/Constants.h ./Eigen/src/Core/util/DisableStupidWarnings.h ./Eigen/src/Core/util/ForwardDeclarations.h ./Eigen/src/Core/util/Macros.h ./Eigen/src/Core/util/Memory.h ./Eigen/src/Core/util/Meta.h ./Eigen/src/Core/util/MKL_support.h ./Eigen/src/Core/util/NonMPL2.h ./Eigen/src/Core/util/ReenableStupidWarnings.h ./Eigen/src/Core/util/StaticAssert.h ./Eigen/src/Core/util/XprHelper.h ./Eigen/src/Core/VectorBlock.h ./Eigen/src/Core/VectorwiseOp.h ./Eigen/src/Core/Visitor.h ./Eigen/src/Eigen2Support/Block.h ./Eigen/src/Eigen2Support/Cwise.h ./Eigen/src/Eigen2Support/CwiseOperators.h ./Eigen/src/Eigen2Support/Geometry/AlignedBox.h ./Eigen/src/Eigen2Support/Geometry/All.h ./Eigen/src/Eigen2Support/Geometry/AngleAxis.h ./Eigen/src/Eigen2Support/Geometry/Hyperplane.h ./Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h ./Eigen/src/Eigen2Support/Geometry/Quaternion.h ./Eigen/src/Eigen2Support/Geometry/Rotation2D.h ./Eigen/src/Eigen2Support/Geometry/RotationBase.h ./Eigen/src/Eigen2Support/Geometry/Scaling.h ./Eigen/src/Eigen2Support/Geometry/Transform.h ./Eigen/src/Eigen2Support/Geometry/Translation.h ./Eigen/src/Eigen2Support/Lazy.h ./Eigen/src/Eigen2Support/LeastSquares.h ./Eigen/src/Eigen2Support/LU.h ./Eigen/src/Eigen2Support/Macros.h ./Eigen/src/Eigen2Support/MathFunctions.h ./Eigen/src/Eigen2Support/Memory.h ./Eigen/src/Eigen2Support/Meta.h ./Eigen/src/Eigen2Support/Minor.h ./Eigen/src/Eigen2Support/QR.h ./Eigen/src/Eigen2Support/SVD.h ./Eigen/src/Eigen2Support/TriangularSolver.h ./Eigen/src/Eigen2Support/VectorBlock.h ./Eigen/src/Eigenvalues/ComplexEigenSolver.h ./Eigen/src/Eigenvalues/ComplexSchur.h ./Eigen/src/Eigenvalues/ComplexSchur_MKL.h ./Eigen/src/Eigenvalues/EigenSolver.h ./Eigen/src/Eigenvalues/GeneralizedEigenSolver.h ./Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h ./Eigen/src/Eigenvalues/HessenbergDecomposition.h ./Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h ./Eigen/src/Eigenvalues/RealQZ.h ./Eigen/src/Eigenvalues/RealSchur.h ./Eigen/src/Eigenvalues/RealSchur_MKL.h ./Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h ./Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h ./Eigen/src/Eigenvalues/Tridiagonalization.h ./Eigen/src/Geometry/AlignedBox.h ./Eigen/src/Geometry/AngleAxis.h ./Eigen/src/Geometry/arch/Geometry_SSE.h ./Eigen/src/Geometry/EulerAngles.h ./Eigen/src/Geometry/Homogeneous.h ./Eigen/src/Geometry/Hyperplane.h ./Eigen/src/Geometry/OrthoMethods.h ./Eigen/src/Geometry/ParametrizedLine.h ./Eigen/src/Geometry/Quaternion.h ./Eigen/src/Geometry/Rotation2D.h ./Eigen/src/Geometry/RotationBase.h ./Eigen/src/Geometry/Scaling.h ./Eigen/src/Geometry/Transform.h ./Eigen/src/Geometry/Translation.h ./Eigen/src/Geometry/Umeyama.h ./Eigen/src/Householder/BlockHouseholder.h ./Eigen/src/Householder/Householder.h ./Eigen/src/Householder/HouseholderSequence.h ./Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h ./Eigen/src/IterativeLinearSolvers/BiCGSTAB.h ./Eigen/src/IterativeLinearSolvers/ConjugateGradient.h ./Eigen/src/IterativeLinearSolvers/IncompleteLUT.h ./Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h ./Eigen/src/Jacobi/Jacobi.h ./Eigen/src/LU/arch/Inverse_SSE.h ./Eigen/src/LU/Determinant.h ./Eigen/src/LU/FullPivLU.h ./Eigen/src/LU/Inverse.h ./Eigen/src/LU/PartialPivLU.h ./Eigen/src/LU/PartialPivLU_MKL.h ./Eigen/src/MetisSupport/MetisSupport.h ./Eigen/src/misc/blas.h ./Eigen/src/misc/Image.h ./Eigen/src/misc/Kernel.h ./Eigen/src/misc/Solve.h ./Eigen/src/misc/SparseSolve.h ./Eigen/src/OrderingMethods/Amd.h ./Eigen/src/OrderingMethods/Eigen_Colamd.h ./Eigen/src/OrderingMethods/Ordering.h ./Eigen/src/PardisoSupport/PardisoSupport.h ./Eigen/src/PaStiXSupport/PaStiXSupport.h ./Eigen/src/plugins/ArrayCwiseBinaryOps.h ./Eigen/src/plugins/ArrayCwiseUnaryOps.h ./Eigen/src/plugins/BlockMethods.h ./Eigen/src/plugins/CommonCwiseBinaryOps.h ./Eigen/src/plugins/CommonCwiseUnaryOps.h ./Eigen/src/plugins/MatrixCwiseBinaryOps.h ./Eigen/src/plugins/MatrixCwiseUnaryOps.h ./Eigen/src/QR/ColPivHouseholderQR.h ./Eigen/src/QR/ColPivHouseholderQR_MKL.h ./Eigen/src/QR/FullPivHouseholderQR.h ./Eigen/src/QR/HouseholderQR.h ./Eigen/src/QR/HouseholderQR_MKL.h ./Eigen/src/SparseCholesky/SimplicialCholesky.h ./Eigen/src/SparseCholesky/SimplicialCholesky_impl.h ./Eigen/src/SparseCore/AmbiVector.h ./Eigen/src/SparseCore/CompressedStorage.h ./Eigen/src/SparseCore/ConservativeSparseSparseProduct.h ./Eigen/src/SparseCore/MappedSparseMatrix.h ./Eigen/src/SparseCore/SparseBlock.h ./Eigen/src/SparseCore/SparseColEtree.h ./Eigen/src/SparseCore/SparseCwiseBinaryOp.h ./Eigen/src/SparseCore/SparseCwiseUnaryOp.h ./Eigen/src/SparseCore/SparseDenseProduct.h ./Eigen/src/SparseCore/SparseDiagonalProduct.h ./Eigen/src/SparseCore/SparseDot.h ./Eigen/src/SparseCore/SparseFuzzy.h ./Eigen/src/SparseCore/SparseMatrix.h ./Eigen/src/SparseCore/SparseMatrixBase.h ./Eigen/src/SparseCore/SparsePermutation.h ./Eigen/src/SparseCore/SparseProduct.h ./Eigen/src/SparseCore/SparseRedux.h ./Eigen/src/SparseCore/SparseSelfAdjointView.h ./Eigen/src/SparseCore/SparseSparseProductWithPruning.h ./Eigen/src/SparseCore/SparseTranspose.h ./Eigen/src/SparseCore/SparseTriangularView.h ./Eigen/src/SparseCore/SparseUtil.h ./Eigen/src/SparseCore/SparseVector.h ./Eigen/src/SparseCore/SparseView.h ./Eigen/src/SparseCore/TriangularSolver.h ./Eigen/src/SparseLU/SparseLU.h ./Eigen/src/SparseLU/SparseLU_column_bmod.h ./Eigen/src/SparseLU/SparseLU_column_dfs.h ./Eigen/src/SparseLU/SparseLU_copy_to_ucol.h ./Eigen/src/SparseLU/SparseLU_gemm_kernel.h ./Eigen/src/SparseLU/SparseLU_heap_relax_snode.h ./Eigen/src/SparseLU/SparseLU_kernel_bmod.h ./Eigen/src/SparseLU/SparseLU_Memory.h ./Eigen/src/SparseLU/SparseLU_panel_bmod.h ./Eigen/src/SparseLU/SparseLU_panel_dfs.h ./Eigen/src/SparseLU/SparseLU_pivotL.h ./Eigen/src/SparseLU/SparseLU_pruneL.h ./Eigen/src/SparseLU/SparseLU_relax_snode.h ./Eigen/src/SparseLU/SparseLU_Structs.h ./Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h ./Eigen/src/SparseLU/SparseLU_Utils.h ./Eigen/src/SparseLU/SparseLUImpl.h ./Eigen/src/SparseQR/SparseQR.h ./Eigen/src/SPQRSupport/SuiteSparseQRSupport.h ./Eigen/src/StlSupport/details.h ./Eigen/src/StlSupport/StdDeque.h ./Eigen/src/StlSupport/StdList.h ./Eigen/src/StlSupport/StdVector.h ./Eigen/src/SuperLUSupport/SuperLUSupport.h ./Eigen/src/SVD/JacobiSVD.h ./Eigen/src/SVD/JacobiSVD_MKL.h ./Eigen/src/SVD/UpperBidiagonalization.h ./Eigen/src/UmfPackSupport/UmfPackSupport.h ./Grid.h ./Init.h ./lattice/Lattice_arith.h ./lattice/Lattice_base.h ./lattice/Lattice_comparison.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_conformable.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_ET.h ./lattice/Lattice_local.h ./lattice/Lattice_overload.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_reality.h ./lattice/Lattice_reduction.h ./lattice/Lattice_rng.h ./lattice/Lattice_trace.h ./lattice/Lattice_transfer.h ./lattice/Lattice_transpose.h ./lattice/Lattice_unary.h ./lattice/Lattice_where.h ./Lattice.h ./Lexicographic.h ./Log.h ./Old/Tensor_peek.h ./Old/Tensor_poke.h ./parallelIO/BinaryIO.h ./parallelIO/NerscIO.h ./PerfCount.h ./pugixml/pugixml.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/WilsonKernelsAsmBody.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/hmc/HMC.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/hmc/NerscCheckpointer.h ./qcd/QCD.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./qcd/utils/CovariantCshift.h ./qcd/utils/LinalgUtils.h ./qcd/utils/SpaceTimeGrid.h ./qcd/utils/SUn.h ./qcd/utils/WilsonLoops.h ./serialisation/BaseIO.h ./serialisation/BinaryIO.h ./serialisation/MacroMagic.h ./serialisation/Serialisation.h ./serialisation/TextIO.h ./serialisation/XmlIO.h ./simd/Grid_avx.h ./simd/Grid_avx512.h ./simd/Grid_empty.h ./simd/Grid_imci.h ./simd/Grid_neon.h ./simd/Grid_qpx.h ./simd/Grid_sse4.h ./simd/Grid_vector_types.h ./simd/Grid_vector_unops.h ./simd/Intel512avx.h ./simd/Intel512common.h ./simd/Intel512double.h ./simd/Intel512imci.h ./simd/Intel512single.h ./simd/Intel512wilson.h ./Simd.h ./stencil/Lebesgue.h ./Stencil.h ./tensors/Tensor_arith.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_arith_mac.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_class.h ./tensors/Tensor_determinant.h ./tensors/Tensor_exp.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_index.h ./tensors/Tensor_inner.h ./tensors/Tensor_logical.h ./tensors/Tensor_outer.h ./tensors/Tensor_reality.h ./tensors/Tensor_Ta.h ./tensors/Tensor_trace.h ./tensors/Tensor_traits.h ./tensors/Tensor_transpose.h ./tensors/Tensor_unary.h ./Tensors.h ./Threads.h ./Timer.h +HFILES=./algorithms/approx/bigfloat.h ./algorithms/approx/bigfloat_double.h ./algorithms/approx/Chebyshev.h ./algorithms/approx/MultiShiftFunction.h ./algorithms/approx/Remez.h ./algorithms/approx/Zolotarev.h ./algorithms/CoarsenedMatrix.h ./algorithms/iterative/AdefGeneric.h ./algorithms/iterative/ConjugateGradient.h ./algorithms/iterative/ConjugateGradientMixedPrec.h ./algorithms/iterative/ConjugateGradientMultiShift.h ./algorithms/iterative/ConjugateResidual.h ./algorithms/iterative/DenseMatrix.h ./algorithms/iterative/EigenSort.h ./algorithms/iterative/Francis.h ./algorithms/iterative/Householder.h ./algorithms/iterative/ImplicitlyRestartedLanczos.h ./algorithms/iterative/Matrix.h ./algorithms/iterative/MatrixUtils.h ./algorithms/iterative/NormalEquations.h ./algorithms/iterative/PrecConjugateResidual.h ./algorithms/iterative/PrecGeneralisedConjugateResidual.h ./algorithms/iterative/SchurRedBlack.h ./algorithms/LinearOperator.h ./algorithms/Preconditioner.h ./algorithms/SparseMatrix.h ./Algorithms.h ./AlignedAllocator.h ./cartesian/Cartesian_base.h ./cartesian/Cartesian_full.h ./cartesian/Cartesian_red_black.h ./Cartesian.h ./communicator/Communicator_base.h ./Communicator.h ./cshift/Cshift_common.h ./cshift/Cshift_mpi.h ./cshift/Cshift_none.h ./Cshift.h ./Eigen/src/Cholesky/LDLT.h ./Eigen/src/Cholesky/LLT.h ./Eigen/src/Cholesky/LLT_MKL.h ./Eigen/src/CholmodSupport/CholmodSupport.h ./Eigen/src/Core/arch/AltiVec/Complex.h ./Eigen/src/Core/arch/AltiVec/PacketMath.h ./Eigen/src/Core/arch/Default/Settings.h ./Eigen/src/Core/arch/NEON/Complex.h ./Eigen/src/Core/arch/NEON/PacketMath.h ./Eigen/src/Core/arch/SSE/Complex.h ./Eigen/src/Core/arch/SSE/MathFunctions.h ./Eigen/src/Core/arch/SSE/PacketMath.h ./Eigen/src/Core/Array.h ./Eigen/src/Core/ArrayBase.h ./Eigen/src/Core/ArrayWrapper.h ./Eigen/src/Core/Assign.h ./Eigen/src/Core/Assign_MKL.h ./Eigen/src/Core/BandMatrix.h ./Eigen/src/Core/Block.h ./Eigen/src/Core/BooleanRedux.h ./Eigen/src/Core/CommaInitializer.h ./Eigen/src/Core/CoreIterators.h ./Eigen/src/Core/CwiseBinaryOp.h ./Eigen/src/Core/CwiseNullaryOp.h ./Eigen/src/Core/CwiseUnaryOp.h ./Eigen/src/Core/CwiseUnaryView.h ./Eigen/src/Core/DenseBase.h ./Eigen/src/Core/DenseCoeffsBase.h ./Eigen/src/Core/DenseStorage.h ./Eigen/src/Core/Diagonal.h ./Eigen/src/Core/DiagonalMatrix.h ./Eigen/src/Core/DiagonalProduct.h ./Eigen/src/Core/Dot.h ./Eigen/src/Core/EigenBase.h ./Eigen/src/Core/Flagged.h ./Eigen/src/Core/ForceAlignedAccess.h ./Eigen/src/Core/Functors.h ./Eigen/src/Core/Fuzzy.h ./Eigen/src/Core/GeneralProduct.h ./Eigen/src/Core/GenericPacketMath.h ./Eigen/src/Core/GlobalFunctions.h ./Eigen/src/Core/IO.h ./Eigen/src/Core/Map.h ./Eigen/src/Core/MapBase.h ./Eigen/src/Core/MathFunctions.h ./Eigen/src/Core/Matrix.h ./Eigen/src/Core/MatrixBase.h ./Eigen/src/Core/NestByValue.h ./Eigen/src/Core/NoAlias.h ./Eigen/src/Core/NumTraits.h ./Eigen/src/Core/PermutationMatrix.h ./Eigen/src/Core/PlainObjectBase.h ./Eigen/src/Core/ProductBase.h ./Eigen/src/Core/products/CoeffBasedProduct.h ./Eigen/src/Core/products/GeneralBlockPanelKernel.h ./Eigen/src/Core/products/GeneralMatrixMatrix.h ./Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h ./Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h ./Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h ./Eigen/src/Core/products/GeneralMatrixVector.h ./Eigen/src/Core/products/GeneralMatrixVector_MKL.h ./Eigen/src/Core/products/Parallelizer.h ./Eigen/src/Core/products/SelfadjointMatrixMatrix.h ./Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h ./Eigen/src/Core/products/SelfadjointMatrixVector.h ./Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h ./Eigen/src/Core/products/SelfadjointProduct.h ./Eigen/src/Core/products/SelfadjointRank2Update.h ./Eigen/src/Core/products/TriangularMatrixMatrix.h ./Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h ./Eigen/src/Core/products/TriangularMatrixVector.h ./Eigen/src/Core/products/TriangularMatrixVector_MKL.h ./Eigen/src/Core/products/TriangularSolverMatrix.h ./Eigen/src/Core/products/TriangularSolverMatrix_MKL.h ./Eigen/src/Core/products/TriangularSolverVector.h ./Eigen/src/Core/Random.h ./Eigen/src/Core/Redux.h ./Eigen/src/Core/Ref.h ./Eigen/src/Core/Replicate.h ./Eigen/src/Core/ReturnByValue.h ./Eigen/src/Core/Reverse.h ./Eigen/src/Core/Select.h ./Eigen/src/Core/SelfAdjointView.h ./Eigen/src/Core/SelfCwiseBinaryOp.h ./Eigen/src/Core/SolveTriangular.h ./Eigen/src/Core/StableNorm.h ./Eigen/src/Core/Stride.h ./Eigen/src/Core/Swap.h ./Eigen/src/Core/Transpose.h ./Eigen/src/Core/Transpositions.h ./Eigen/src/Core/TriangularMatrix.h ./Eigen/src/Core/util/BlasUtil.h ./Eigen/src/Core/util/Constants.h ./Eigen/src/Core/util/DisableStupidWarnings.h ./Eigen/src/Core/util/ForwardDeclarations.h ./Eigen/src/Core/util/Macros.h ./Eigen/src/Core/util/Memory.h ./Eigen/src/Core/util/Meta.h ./Eigen/src/Core/util/MKL_support.h ./Eigen/src/Core/util/NonMPL2.h ./Eigen/src/Core/util/ReenableStupidWarnings.h ./Eigen/src/Core/util/StaticAssert.h ./Eigen/src/Core/util/XprHelper.h ./Eigen/src/Core/VectorBlock.h ./Eigen/src/Core/VectorwiseOp.h ./Eigen/src/Core/Visitor.h ./Eigen/src/Eigen2Support/Block.h ./Eigen/src/Eigen2Support/Cwise.h ./Eigen/src/Eigen2Support/CwiseOperators.h ./Eigen/src/Eigen2Support/Geometry/AlignedBox.h ./Eigen/src/Eigen2Support/Geometry/All.h ./Eigen/src/Eigen2Support/Geometry/AngleAxis.h ./Eigen/src/Eigen2Support/Geometry/Hyperplane.h ./Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h ./Eigen/src/Eigen2Support/Geometry/Quaternion.h ./Eigen/src/Eigen2Support/Geometry/Rotation2D.h ./Eigen/src/Eigen2Support/Geometry/RotationBase.h ./Eigen/src/Eigen2Support/Geometry/Scaling.h ./Eigen/src/Eigen2Support/Geometry/Transform.h ./Eigen/src/Eigen2Support/Geometry/Translation.h ./Eigen/src/Eigen2Support/Lazy.h ./Eigen/src/Eigen2Support/LeastSquares.h ./Eigen/src/Eigen2Support/LU.h ./Eigen/src/Eigen2Support/Macros.h ./Eigen/src/Eigen2Support/MathFunctions.h ./Eigen/src/Eigen2Support/Memory.h ./Eigen/src/Eigen2Support/Meta.h ./Eigen/src/Eigen2Support/Minor.h ./Eigen/src/Eigen2Support/QR.h ./Eigen/src/Eigen2Support/SVD.h ./Eigen/src/Eigen2Support/TriangularSolver.h ./Eigen/src/Eigen2Support/VectorBlock.h ./Eigen/src/Eigenvalues/ComplexEigenSolver.h ./Eigen/src/Eigenvalues/ComplexSchur.h ./Eigen/src/Eigenvalues/ComplexSchur_MKL.h ./Eigen/src/Eigenvalues/EigenSolver.h ./Eigen/src/Eigenvalues/GeneralizedEigenSolver.h ./Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h ./Eigen/src/Eigenvalues/HessenbergDecomposition.h ./Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h ./Eigen/src/Eigenvalues/RealQZ.h ./Eigen/src/Eigenvalues/RealSchur.h ./Eigen/src/Eigenvalues/RealSchur_MKL.h ./Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h ./Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h ./Eigen/src/Eigenvalues/Tridiagonalization.h ./Eigen/src/Geometry/AlignedBox.h ./Eigen/src/Geometry/AngleAxis.h ./Eigen/src/Geometry/arch/Geometry_SSE.h ./Eigen/src/Geometry/EulerAngles.h ./Eigen/src/Geometry/Homogeneous.h ./Eigen/src/Geometry/Hyperplane.h ./Eigen/src/Geometry/OrthoMethods.h ./Eigen/src/Geometry/ParametrizedLine.h ./Eigen/src/Geometry/Quaternion.h ./Eigen/src/Geometry/Rotation2D.h ./Eigen/src/Geometry/RotationBase.h ./Eigen/src/Geometry/Scaling.h ./Eigen/src/Geometry/Transform.h ./Eigen/src/Geometry/Translation.h ./Eigen/src/Geometry/Umeyama.h ./Eigen/src/Householder/BlockHouseholder.h ./Eigen/src/Householder/Householder.h ./Eigen/src/Householder/HouseholderSequence.h ./Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h ./Eigen/src/IterativeLinearSolvers/BiCGSTAB.h ./Eigen/src/IterativeLinearSolvers/ConjugateGradient.h ./Eigen/src/IterativeLinearSolvers/IncompleteLUT.h ./Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h ./Eigen/src/Jacobi/Jacobi.h ./Eigen/src/LU/arch/Inverse_SSE.h ./Eigen/src/LU/Determinant.h ./Eigen/src/LU/FullPivLU.h ./Eigen/src/LU/Inverse.h ./Eigen/src/LU/PartialPivLU.h ./Eigen/src/LU/PartialPivLU_MKL.h ./Eigen/src/MetisSupport/MetisSupport.h ./Eigen/src/misc/blas.h ./Eigen/src/misc/Image.h ./Eigen/src/misc/Kernel.h ./Eigen/src/misc/Solve.h ./Eigen/src/misc/SparseSolve.h ./Eigen/src/OrderingMethods/Amd.h ./Eigen/src/OrderingMethods/Eigen_Colamd.h ./Eigen/src/OrderingMethods/Ordering.h ./Eigen/src/PardisoSupport/PardisoSupport.h ./Eigen/src/PaStiXSupport/PaStiXSupport.h ./Eigen/src/plugins/ArrayCwiseBinaryOps.h ./Eigen/src/plugins/ArrayCwiseUnaryOps.h ./Eigen/src/plugins/BlockMethods.h ./Eigen/src/plugins/CommonCwiseBinaryOps.h ./Eigen/src/plugins/CommonCwiseUnaryOps.h ./Eigen/src/plugins/MatrixCwiseBinaryOps.h ./Eigen/src/plugins/MatrixCwiseUnaryOps.h ./Eigen/src/QR/ColPivHouseholderQR.h ./Eigen/src/QR/ColPivHouseholderQR_MKL.h ./Eigen/src/QR/FullPivHouseholderQR.h ./Eigen/src/QR/HouseholderQR.h ./Eigen/src/QR/HouseholderQR_MKL.h ./Eigen/src/SparseCholesky/SimplicialCholesky.h ./Eigen/src/SparseCholesky/SimplicialCholesky_impl.h ./Eigen/src/SparseCore/AmbiVector.h ./Eigen/src/SparseCore/CompressedStorage.h ./Eigen/src/SparseCore/ConservativeSparseSparseProduct.h ./Eigen/src/SparseCore/MappedSparseMatrix.h ./Eigen/src/SparseCore/SparseBlock.h ./Eigen/src/SparseCore/SparseColEtree.h ./Eigen/src/SparseCore/SparseCwiseBinaryOp.h ./Eigen/src/SparseCore/SparseCwiseUnaryOp.h ./Eigen/src/SparseCore/SparseDenseProduct.h ./Eigen/src/SparseCore/SparseDiagonalProduct.h ./Eigen/src/SparseCore/SparseDot.h ./Eigen/src/SparseCore/SparseFuzzy.h ./Eigen/src/SparseCore/SparseMatrix.h ./Eigen/src/SparseCore/SparseMatrixBase.h ./Eigen/src/SparseCore/SparsePermutation.h ./Eigen/src/SparseCore/SparseProduct.h ./Eigen/src/SparseCore/SparseRedux.h ./Eigen/src/SparseCore/SparseSelfAdjointView.h ./Eigen/src/SparseCore/SparseSparseProductWithPruning.h ./Eigen/src/SparseCore/SparseTranspose.h ./Eigen/src/SparseCore/SparseTriangularView.h ./Eigen/src/SparseCore/SparseUtil.h ./Eigen/src/SparseCore/SparseVector.h ./Eigen/src/SparseCore/SparseView.h ./Eigen/src/SparseCore/TriangularSolver.h ./Eigen/src/SparseLU/SparseLU.h ./Eigen/src/SparseLU/SparseLU_column_bmod.h ./Eigen/src/SparseLU/SparseLU_column_dfs.h ./Eigen/src/SparseLU/SparseLU_copy_to_ucol.h ./Eigen/src/SparseLU/SparseLU_gemm_kernel.h ./Eigen/src/SparseLU/SparseLU_heap_relax_snode.h ./Eigen/src/SparseLU/SparseLU_kernel_bmod.h ./Eigen/src/SparseLU/SparseLU_Memory.h ./Eigen/src/SparseLU/SparseLU_panel_bmod.h ./Eigen/src/SparseLU/SparseLU_panel_dfs.h ./Eigen/src/SparseLU/SparseLU_pivotL.h ./Eigen/src/SparseLU/SparseLU_pruneL.h ./Eigen/src/SparseLU/SparseLU_relax_snode.h ./Eigen/src/SparseLU/SparseLU_Structs.h ./Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h ./Eigen/src/SparseLU/SparseLU_Utils.h ./Eigen/src/SparseLU/SparseLUImpl.h ./Eigen/src/SparseQR/SparseQR.h ./Eigen/src/SPQRSupport/SuiteSparseQRSupport.h ./Eigen/src/StlSupport/details.h ./Eigen/src/StlSupport/StdDeque.h ./Eigen/src/StlSupport/StdList.h ./Eigen/src/StlSupport/StdVector.h ./Eigen/src/SuperLUSupport/SuperLUSupport.h ./Eigen/src/SVD/JacobiSVD.h ./Eigen/src/SVD/JacobiSVD_MKL.h ./Eigen/src/SVD/UpperBidiagonalization.h ./Eigen/src/UmfPackSupport/UmfPackSupport.h ./Grid.h ./Init.h ./lattice/Lattice_arith.h ./lattice/Lattice_base.h ./lattice/Lattice_comparison.h ./lattice/Lattice_comparison_utils.h ./lattice/Lattice_conformable.h ./lattice/Lattice_coordinate.h ./lattice/Lattice_ET.h ./lattice/Lattice_local.h ./lattice/Lattice_overload.h ./lattice/Lattice_peekpoke.h ./lattice/Lattice_reality.h ./lattice/Lattice_reduction.h ./lattice/Lattice_rng.h ./lattice/Lattice_trace.h ./lattice/Lattice_transfer.h ./lattice/Lattice_transpose.h ./lattice/Lattice_unary.h ./lattice/Lattice_where.h ./Lattice.h ./Lexicographic.h ./Log.h ./parallelIO/BinaryIO.h ./parallelIO/NerscIO.h ./PerfCount.h ./pugixml/pugixml.h ./qcd/action/ActionBase.h ./qcd/action/ActionParams.h ./qcd/action/Actions.h ./qcd/action/fermion/CayleyFermion5D.h ./qcd/action/fermion/ContinuedFractionFermion5D.h ./qcd/action/fermion/DomainWallFermion.h ./qcd/action/fermion/FermionOperator.h ./qcd/action/fermion/FermionOperatorImpl.h ./qcd/action/fermion/g5HermitianLinop.h ./qcd/action/fermion/MobiusFermion.h ./qcd/action/fermion/MobiusZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonCayleyTanhFermion.h ./qcd/action/fermion/OverlapWilsonCayleyZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonContfracTanhFermion.h ./qcd/action/fermion/OverlapWilsonContfracZolotarevFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionTanhFermion.h ./qcd/action/fermion/OverlapWilsonPartialFractionZolotarevFermion.h ./qcd/action/fermion/PartialFractionFermion5D.h ./qcd/action/fermion/ScaledShamirFermion.h ./qcd/action/fermion/ShamirZolotarevFermion.h ./qcd/action/fermion/WilsonCompressor.h ./qcd/action/fermion/WilsonFermion.h ./qcd/action/fermion/WilsonFermion5D.h ./qcd/action/fermion/WilsonKernels.h ./qcd/action/fermion/WilsonKernelsAsmBody.h ./qcd/action/fermion/WilsonTMFermion.h ./qcd/action/gauge/GaugeImpl.h ./qcd/action/gauge/PlaqPlusRectangleAction.h ./qcd/action/gauge/WilsonGaugeAction.h ./qcd/action/pseudofermion/EvenOddSchurDifferentiable.h ./qcd/action/pseudofermion/OneFlavourEvenOddRational.h ./qcd/action/pseudofermion/OneFlavourEvenOddRationalRatio.h ./qcd/action/pseudofermion/OneFlavourRational.h ./qcd/action/pseudofermion/OneFlavourRationalRatio.h ./qcd/action/pseudofermion/TwoFlavour.h ./qcd/action/pseudofermion/TwoFlavourEvenOdd.h ./qcd/action/pseudofermion/TwoFlavourEvenOddRatio.h ./qcd/action/pseudofermion/TwoFlavourRatio.h ./qcd/hmc/HMC.h ./qcd/hmc/HmcRunner.h ./qcd/hmc/integrators/Integrator.h ./qcd/hmc/integrators/Integrator_algorithm.h ./qcd/hmc/NerscCheckpointer.h ./qcd/QCD.h ./qcd/smearing/APEsmearing.h ./qcd/smearing/BaseSmearing.h ./qcd/smearing/GaugeConfiguration.h ./qcd/smearing/Smearing.h ./qcd/smearing/StoutSmearing.h ./qcd/spin/Dirac.h ./qcd/spin/TwoSpinor.h ./qcd/utils/CovariantCshift.h ./qcd/utils/LinalgUtils.h ./qcd/utils/SpaceTimeGrid.h ./qcd/utils/SUn.h ./qcd/utils/WilsonLoops.h ./serialisation/BaseIO.h ./serialisation/BinaryIO.h ./serialisation/MacroMagic.h ./serialisation/Serialisation.h ./serialisation/TextIO.h ./serialisation/XmlIO.h ./simd/Grid_avx.h ./simd/Grid_avx512.h ./simd/Grid_empty.h ./simd/Grid_imci.h ./simd/Grid_neon.h ./simd/Grid_qpx.h ./simd/Grid_sse4.h ./simd/Grid_vector_types.h ./simd/Grid_vector_unops.h ./simd/Intel512avx.h ./simd/Intel512common.h ./simd/Intel512double.h ./simd/Intel512imci.h ./simd/Intel512single.h ./simd/Intel512wilson.h ./Simd.h ./stencil/Lebesgue.h ./Stencil.h ./tensors/Tensor_arith.h ./tensors/Tensor_arith_add.h ./tensors/Tensor_arith_mac.h ./tensors/Tensor_arith_mul.h ./tensors/Tensor_arith_scalar.h ./tensors/Tensor_arith_sub.h ./tensors/Tensor_class.h ./tensors/Tensor_determinant.h ./tensors/Tensor_exp.h ./tensors/Tensor_extract_merge.h ./tensors/Tensor_index.h ./tensors/Tensor_inner.h ./tensors/Tensor_logical.h ./tensors/Tensor_outer.h ./tensors/Tensor_reality.h ./tensors/Tensor_Ta.h ./tensors/Tensor_trace.h ./tensors/Tensor_traits.h ./tensors/Tensor_transpose.h ./tensors/Tensor_unary.h ./Tensors.h ./Threads.h ./Timer.h Config.h CCFILES=./algorithms/approx/MultiShiftFunction.cc ./algorithms/approx/Remez.cc ./algorithms/approx/Zolotarev.cc ./Init.cc ./Log.cc ./PerfCount.cc ./pugixml/pugixml.cc ./qcd/action/fermion/CayleyFermion5D.cc ./qcd/action/fermion/CayleyFermion5Dcache.cc ./qcd/action/fermion/CayleyFermion5Ddense.cc ./qcd/action/fermion/CayleyFermion5Dssp.cc ./qcd/action/fermion/CayleyFermion5Dvec.cc ./qcd/action/fermion/ContinuedFractionFermion5D.cc ./qcd/action/fermion/PartialFractionFermion5D.cc ./qcd/action/fermion/WilsonFermion.cc ./qcd/action/fermion/WilsonFermion5D.cc ./qcd/action/fermion/WilsonKernels.cc ./qcd/action/fermion/WilsonKernelsAsm.cc ./qcd/action/fermion/WilsonKernelsHand.cc ./qcd/action/fermion/WilsonTMFermion.cc ./qcd/hmc/HMC.cc ./qcd/spin/Dirac.cc ./qcd/utils/SpaceTimeGrid.cc ./serialisation/BinaryIO.cc ./serialisation/TextIO.cc ./serialisation/XmlIO.cc ./stencil/Lebesgue.cc ./stencil/Stencil_common.cc diff --git a/lib/Simd.h b/lib/Simd.h index 7728dbdb..9568c555 100644 --- a/lib/Simd.h +++ b/lib/Simd.h @@ -1,32 +1,33 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/Simd.h +Source file: ./lib/Simd.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Peter Boyle Author: neo Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_SIMD_H #define GRID_SIMD_H @@ -118,6 +119,14 @@ namespace Grid { inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} inline ComplexF timesMinusI(const ComplexF &r){ return(r*ComplexF(0.0,-1.0));} inline ComplexD timesMinusI(const ComplexD &r){ return(r*ComplexD(0.0,-1.0));} + + // define projections to real and imaginay parts + inline ComplexF projReal(const ComplexF &r){return( ComplexF(std::real(r), 0.0));} + inline ComplexD projReal(const ComplexD &r){return( ComplexD(std::real(r), 0.0));} + inline ComplexF projImag(const ComplexF &r){return (ComplexF(std::imag(r), 0.0 ));} + inline ComplexD projImag(const ComplexD &r){return (ComplexD(std::imag(r), 0.0));} + + // define auxiliary functions for complex computations inline void timesI(ComplexF &ret,const ComplexF &r) { ret = timesI(r);} inline void timesI(ComplexD &ret,const ComplexD &r) { ret = timesI(r);} inline void timesMinusI(ComplexF &ret,const ComplexF &r){ ret = timesMinusI(r);} diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index e0431a53..f5102019 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -40,9 +40,10 @@ namespace Grid { template class ConjugateGradient : public OperatorFunction { public: + bool ErrorOnNoConverge; //throw an assert when the CG fails to converge. Defaults true. RealD Tolerance; Integer MaxIterations; - ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) { + ConjugateGradient(RealD tol,Integer maxit, bool err_on_no_conv = true) : Tolerance(tol), MaxIterations(maxit), ErrorOnNoConverge(err_on_no_conv){ }; @@ -137,13 +138,15 @@ public: std::cout< + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#ifndef GRID_CONJUGATE_GRADIENT_MIXED_PREC_H +#define GRID_CONJUGATE_GRADIENT_MIXED_PREC_H + +namespace Grid { + + //Mixed precision restarted defect correction CG + template::value == 2, int>::type = 0,typename std::enable_if< getPrecision::value == 1, int>::type = 0> + class MixedPrecisionConjugateGradient : public LinearFunction { + public: + RealD Tolerance; + Integer MaxInnerIterations; + Integer MaxOuterIterations; + GridBase* SinglePrecGrid; //Grid for single-precision fields + RealD OuterLoopNormMult; //Stop the outer loop and move to a final double prec solve when the residual is OuterLoopNormMult * Tolerance + LinearOperatorBase &Linop_f; + LinearOperatorBase &Linop_d; + + //Option to speed up *inner single precision* solves using a LinearFunction that produces a guess + LinearFunction *guesser; + + MixedPrecisionConjugateGradient(RealD tol, Integer maxinnerit, Integer maxouterit, GridBase* _sp_grid, LinearOperatorBase &_Linop_f, LinearOperatorBase &_Linop_d) : + Linop_f(_Linop_f), Linop_d(_Linop_d), + Tolerance(tol), MaxInnerIterations(maxinnerit), MaxOuterIterations(maxouterit), SinglePrecGrid(_sp_grid), + OuterLoopNormMult(100.), guesser(NULL){ }; + + void useGuesser(LinearFunction &g){ + guesser = &g; + } + + void operator() (const FieldD &src_d_in, FieldD &sol_d){ + GridStopWatch TotalTimer; + TotalTimer.Start(); + + int cb = src_d_in.checkerboard; + sol_d.checkerboard = cb; + + RealD src_norm = norm2(src_d_in); + RealD stop = src_norm * Tolerance*Tolerance; + + GridBase* DoublePrecGrid = src_d_in._grid; + FieldD tmp_d(DoublePrecGrid); + tmp_d.checkerboard = cb; + + FieldD tmp2_d(DoublePrecGrid); + tmp2_d.checkerboard = cb; + + FieldD src_d(DoublePrecGrid); + src_d = src_d_in; //source for next inner iteration, computed from residual during operation + + RealD inner_tol = Tolerance; + + FieldF src_f(SinglePrecGrid); + src_f.checkerboard = cb; + + FieldF sol_f(SinglePrecGrid); + sol_f.checkerboard = cb; + + ConjugateGradient CG_f(inner_tol, MaxInnerIterations); + CG_f.ErrorOnNoConverge = false; + + GridStopWatch InnerCGtimer; + + GridStopWatch PrecChangeTimer; + + for(Integer outer_iter = 0; outer_iter < MaxOuterIterations; outer_iter++){ + //Compute double precision rsd and also new RHS vector. + Linop_d.HermOp(sol_d, tmp_d); + RealD norm = axpy_norm(src_d, -1., tmp_d, src_d_in); //src_d is residual vector + + std::cout< CG_d(Tolerance, MaxInnerIterations); + CG_d(Linop_d, src_d_in, sol_d); + + TotalTimer.Stop(); + std::cout< &lcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); + return idx; + } inline void iCoorFromIindex(std::vector &coor,int lane) { Lexicographic::CoorFromIndex(coor,lane,_simd_layout); diff --git a/lib/cartesian/Cartesian_red_black.h b/lib/cartesian/Cartesian_red_black.h index 2f37334e..9f5a1103 100644 --- a/lib/cartesian/Cartesian_red_black.h +++ b/lib/cartesian/Cartesian_red_black.h @@ -218,7 +218,7 @@ protected: idx+=_ostride[d]*(coor[d]%_rdimensions[d]); } } - return idx; + return idx; }; virtual int iIndex(std::vector &lcoor) diff --git a/lib/lattice/Lattice_ET.h b/lib/lattice/Lattice_ET.h index 7644f9da..7ebac99d 100644 --- a/lib/lattice/Lattice_ET.h +++ b/lib/lattice/Lattice_ET.h @@ -1,73 +1,74 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/lattice/Lattice_ET.h +Source file: ./lib/lattice/Lattice_ET.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: neo - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_LATTICE_ET_H #define GRID_LATTICE_ET_H #include -#include #include #include +#include namespace Grid { - //////////////////////////////////////////////////// - // Predicated where support - //////////////////////////////////////////////////// - template - inline vobj predicatedWhere(const iobj &predicate,const vobj &iftrue,const robj &iffalse) { +//////////////////////////////////////////////////// +// Predicated where support +//////////////////////////////////////////////////// +template +inline vobj predicatedWhere(const iobj &predicate, const vobj &iftrue, + const robj &iffalse) { + typename std::remove_const::type ret; - typename std::remove_const::type ret; + typedef typename vobj::scalar_object scalar_object; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_object scalar_object; - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; + const int Nsimd = vobj::vector_type::Nsimd(); + const int words = sizeof(vobj) / sizeof(vector_type); - const int Nsimd = vobj::vector_type::Nsimd(); - const int words = sizeof(vobj)/sizeof(vector_type); + std::vector mask(Nsimd); + std::vector truevals(Nsimd); + std::vector falsevals(Nsimd); - std::vector mask(Nsimd); - std::vector truevals (Nsimd); - std::vector falsevals(Nsimd); + extract(iftrue, truevals); + extract(iffalse, falsevals); + extract(TensorRemove(predicate), mask); - extract(iftrue ,truevals); - extract(iffalse ,falsevals); - extract(TensorRemove(predicate),mask); - - for(int s=0;s +using is_lattice = std::is_base_of; -template using is_lattice = std::is_base_of; +template +using is_lattice_expr = std::is_base_of; template using is_lattice_expr = std::is_base_of; +//Specialization of getVectorType for lattices +template +struct getVectorType >{ + typedef typename Lattice::vector_object type; +}; + template inline sobj eval(const unsigned int ss, const sobj &arg) { return arg; } -template -inline const lobj &eval(const unsigned int ss, const Lattice &arg) -{ - return arg._odata[ss]; +template +inline const lobj &eval(const unsigned int ss, const Lattice &arg) { + return arg._odata[ss]; } // handle nodes in syntax tree template -auto inline eval(const unsigned int ss, const LatticeUnaryExpression &expr) // eval one operand - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second))); +auto inline eval( + const unsigned int ss, + const LatticeUnaryExpression &expr) // eval one operand + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second))); } template -auto inline eval(const unsigned int ss, const LatticeBinaryExpression &expr) // eval two operands - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second))); +auto inline eval( + const unsigned int ss, + const LatticeBinaryExpression &expr) // eval two operands + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second))); } template -auto inline eval(const unsigned int ss, const LatticeTrinaryExpression &expr) // eval three operands - -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)))) -{ - return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)) ); +auto inline eval(const unsigned int ss, + const LatticeTrinaryExpression + &expr) // eval three operands + -> decltype(expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)), + eval(ss, std::get<2>(expr.second)))) { + return expr.first.func(eval(ss, std::get<0>(expr.second)), + eval(ss, std::get<1>(expr.second)), + eval(ss, std::get<2>(expr.second))); } ////////////////////////////////////////////////////////////////////////// -// Obtain the grid from an expression, ensuring conformable. This must follow a tree recursion +// Obtain the grid from an expression, ensuring conformable. This must follow a +// tree recursion ////////////////////////////////////////////////////////////////////////// -template::value, T1>::type * =nullptr > -inline void GridFromExpression(GridBase * &grid,const T1& lat) // Lattice leaf -{ - if ( grid ) { - conformable(grid,lat._grid); - } - grid=lat._grid; -} -template::value, T1>::type * = nullptr > -inline void GridFromExpression(GridBase * &grid,const T1& notlat) // non-lattice leaf +template ::value, T1>::type * = nullptr> +inline void GridFromExpression(GridBase *&grid, const T1 &lat) // Lattice leaf { + if (grid) { + conformable(grid, lat._grid); + } + grid = lat._grid; } +template ::value, T1>::type * = nullptr> +inline void GridFromExpression(GridBase *&grid, + const T1 ¬lat) // non-lattice leaf +{} template -inline void GridFromExpression(GridBase * &grid,const LatticeUnaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse +inline void GridFromExpression(GridBase *&grid, + const LatticeUnaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse } template -inline void GridFromExpression(GridBase * &grid,const LatticeBinaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse - GridFromExpression(grid,std::get<1>(expr.second)); +inline void GridFromExpression( + GridBase *&grid, const LatticeBinaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse + GridFromExpression(grid, std::get<1>(expr.second)); } template -inline void GridFromExpression( GridBase * &grid,const LatticeTrinaryExpression &expr) -{ - GridFromExpression(grid,std::get<0>(expr.second));// recurse - GridFromExpression(grid,std::get<1>(expr.second)); - GridFromExpression(grid,std::get<2>(expr.second)); +inline void GridFromExpression( + GridBase *&grid, const LatticeTrinaryExpression &expr) { + GridFromExpression(grid, std::get<0>(expr.second)); // recurse + GridFromExpression(grid, std::get<1>(expr.second)); + GridFromExpression(grid, std::get<2>(expr.second)); } - ////////////////////////////////////////////////////////////////////////// -// Obtain the CB from an expression, ensuring conformable. This must follow a tree recursion +// Obtain the CB from an expression, ensuring conformable. This must follow a +// tree recursion ////////////////////////////////////////////////////////////////////////// -template::value, T1>::type * =nullptr > -inline void CBFromExpression(int &cb,const T1& lat) // Lattice leaf +template ::value, T1>::type * = nullptr> +inline void CBFromExpression(int &cb, const T1 &lat) // Lattice leaf { - if ( (cb==Odd) || (cb==Even) ) { - assert(cb==lat.checkerboard); - } - cb=lat.checkerboard; + if ((cb == Odd) || (cb == Even)) { + assert(cb == lat.checkerboard); + } + cb = lat.checkerboard; // std::cout<::value, T1>::type * = nullptr > -inline void CBFromExpression(int &cb,const T1& notlat) // non-lattice leaf +template ::value, T1>::type * = nullptr> +inline void CBFromExpression(int &cb, const T1 ¬lat) // non-lattice leaf { // std::cout< -inline void CBFromExpression(int &cb,const LatticeUnaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse +inline void CBFromExpression(int &cb, + const LatticeUnaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse // std::cout< -inline void CBFromExpression(int &cb,const LatticeBinaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse - CBFromExpression(cb,std::get<1>(expr.second)); +inline void CBFromExpression(int &cb, + const LatticeBinaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse + CBFromExpression(cb, std::get<1>(expr.second)); // std::cout< -inline void CBFromExpression( int &cb,const LatticeTrinaryExpression &expr) -{ - CBFromExpression(cb,std::get<0>(expr.second));// recurse - CBFromExpression(cb,std::get<1>(expr.second)); - CBFromExpression(cb,std::get<2>(expr.second)); +inline void CBFromExpression( + int &cb, const LatticeTrinaryExpression &expr) { + CBFromExpression(cb, std::get<0>(expr.second)); // recurse + CBFromExpression(cb, std::get<1>(expr.second)); + CBFromExpression(cb, std::get<2>(expr.second)); // std::cout< struct name\ -{\ - static auto inline func(const arg a)-> decltype(ret) { return ret; } \ -}; +#define GridUnopClass(name, ret) \ + template \ + struct name { \ + static auto inline func(const arg a) -> decltype(ret) { return ret; } \ + }; -GridUnopClass(UnarySub,-a); -GridUnopClass(UnaryNot,Not(a)); -GridUnopClass(UnaryAdj,adj(a)); -GridUnopClass(UnaryConj,conjugate(a)); -GridUnopClass(UnaryTrace,trace(a)); -GridUnopClass(UnaryTranspose,transpose(a)); -GridUnopClass(UnaryTa,Ta(a)); -GridUnopClass(UnaryProjectOnGroup,ProjectOnGroup(a)); -GridUnopClass(UnaryReal,real(a)); -GridUnopClass(UnaryImag,imag(a)); -GridUnopClass(UnaryToReal,toReal(a)); -GridUnopClass(UnaryToComplex,toComplex(a)); -GridUnopClass(UnaryAbs,abs(a)); -GridUnopClass(UnarySqrt,sqrt(a)); -GridUnopClass(UnaryRsqrt,rsqrt(a)); -GridUnopClass(UnarySin,sin(a)); -GridUnopClass(UnaryCos,cos(a)); -GridUnopClass(UnaryLog,log(a)); -GridUnopClass(UnaryExp,exp(a)); +GridUnopClass(UnarySub, -a); +GridUnopClass(UnaryNot, Not(a)); +GridUnopClass(UnaryAdj, adj(a)); +GridUnopClass(UnaryConj, conjugate(a)); +GridUnopClass(UnaryTrace, trace(a)); +GridUnopClass(UnaryTranspose, transpose(a)); +GridUnopClass(UnaryTa, Ta(a)); +GridUnopClass(UnaryProjectOnGroup, ProjectOnGroup(a)); +GridUnopClass(UnaryReal, real(a)); +GridUnopClass(UnaryImag, imag(a)); +GridUnopClass(UnaryToReal, toReal(a)); +GridUnopClass(UnaryToComplex, toComplex(a)); +GridUnopClass(UnaryTimesI, timesI(a)); +GridUnopClass(UnaryTimesMinusI, timesMinusI(a)); +GridUnopClass(UnaryAbs, abs(a)); +GridUnopClass(UnarySqrt, sqrt(a)); +GridUnopClass(UnaryRsqrt, rsqrt(a)); +GridUnopClass(UnarySin, sin(a)); +GridUnopClass(UnaryCos, cos(a)); +GridUnopClass(UnaryAsin, asin(a)); +GridUnopClass(UnaryAcos, acos(a)); +GridUnopClass(UnaryLog, log(a)); +GridUnopClass(UnaryExp, exp(a)); //////////////////////////////////////////// // Binary operators //////////////////////////////////////////// -#define GridBinOpClass(name,combination)\ -template \ -struct name\ -{\ - static auto inline func(const left &lhs,const right &rhs)-> decltype(combination) const \ - {\ - return combination;\ - }\ -} -GridBinOpClass(BinaryAdd,lhs+rhs); -GridBinOpClass(BinarySub,lhs-rhs); -GridBinOpClass(BinaryMul,lhs*rhs); +#define GridBinOpClass(name, combination) \ + template \ + struct name { \ + static auto inline func(const left &lhs, const right &rhs) \ + -> decltype(combination) const { \ + return combination; \ + } \ + } +GridBinOpClass(BinaryAdd, lhs + rhs); +GridBinOpClass(BinarySub, lhs - rhs); +GridBinOpClass(BinaryMul, lhs *rhs); -GridBinOpClass(BinaryAnd ,lhs&rhs); -GridBinOpClass(BinaryOr ,lhs|rhs); -GridBinOpClass(BinaryAndAnd,lhs&&rhs); -GridBinOpClass(BinaryOrOr ,lhs||rhs); +GridBinOpClass(BinaryAnd, lhs &rhs); +GridBinOpClass(BinaryOr, lhs | rhs); +GridBinOpClass(BinaryAndAnd, lhs &&rhs); +GridBinOpClass(BinaryOrOr, lhs || rhs); //////////////////////////////////////////////////// // Trinary conditional op //////////////////////////////////////////////////// -#define GridTrinOpClass(name,combination)\ -template \ -struct name\ -{\ - static auto inline func(const predicate &pred,const left &lhs,const right &rhs)-> decltype(combination) const \ - {\ - return combination;\ - }\ -} +#define GridTrinOpClass(name, combination) \ + template \ + struct name { \ + static auto inline func(const predicate &pred, const left &lhs, \ + const right &rhs) -> decltype(combination) const { \ + return combination; \ + } \ + } -GridTrinOpClass(TrinaryWhere,(predicatedWhere::type, \ - typename std::remove_reference::type> (pred,lhs,rhs))); +GridTrinOpClass( + TrinaryWhere, + (predicatedWhere::type, + typename std::remove_reference::type>(pred, lhs, + rhs))); //////////////////////////////////////////// // Operator syntactical glue //////////////////////////////////////////// - -#define GRID_UNOP(name) name -#define GRID_BINOP(name) name -#define GRID_TRINOP(name) name -#define GRID_DEF_UNOP(op, name)\ -template ::value||is_lattice_expr::value, T1>::type* = nullptr> inline auto op(const T1 &arg) \ - -> decltype(LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg)))) \ -{ return LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg))); } +#define GRID_UNOP(name) name +#define GRID_BINOP(name) name +#define GRID_TRINOP(name) \ + name -#define GRID_BINOP_LEFT(op, name)\ -template ::value||is_lattice_expr::value, T1>::type* = nullptr>\ -inline auto op(const T1 &lhs,const T2&rhs) \ - -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs)))) \ -{\ - return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs))); \ -} +#define GRID_DEF_UNOP(op, name) \ + template ::value || \ + is_lattice_expr::value, \ + T1>::type * = nullptr> \ + inline auto op(const T1 &arg) \ + ->decltype(LatticeUnaryExpression( \ + std::make_pair(GRID_UNOP(name)(), std::forward_as_tuple(arg)))) { \ + return LatticeUnaryExpression( \ + std::make_pair(GRID_UNOP(name)(), std::forward_as_tuple(arg))); \ + } -#define GRID_BINOP_RIGHT(op, name)\ - template ::value && !is_lattice_expr::value, T1>::type* = nullptr,\ - typename std::enable_if< is_lattice::value || is_lattice_expr::value, T2>::type* = nullptr> \ -inline auto op(const T1 &lhs,const T2&rhs) \ - -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs)))) \ -{\ - return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ - std::forward_as_tuple(lhs, rhs))); \ -} +#define GRID_BINOP_LEFT(op, name) \ + template ::value || \ + is_lattice_expr::value, \ + T1>::type * = nullptr> \ + inline auto op(const T1 &lhs, const T2 &rhs) \ + ->decltype( \ + LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), \ + std::forward_as_tuple(lhs, rhs)))) { \ + return LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), std::forward_as_tuple(lhs, rhs))); \ + } -#define GRID_DEF_BINOP(op, name)\ - GRID_BINOP_LEFT(op,name);\ - GRID_BINOP_RIGHT(op,name); +#define GRID_BINOP_RIGHT(op, name) \ + template ::value && \ + !is_lattice_expr::value, \ + T1>::type * = nullptr, \ + typename std::enable_if::value || \ + is_lattice_expr::value, \ + T2>::type * = nullptr> \ + inline auto op(const T1 &lhs, const T2 &rhs) \ + ->decltype( \ + LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), \ + std::forward_as_tuple(lhs, rhs)))) { \ + return LatticeBinaryExpression( \ + std::make_pair(GRID_BINOP(name)(), std::forward_as_tuple(lhs, rhs))); \ + } +#define GRID_DEF_BINOP(op, name) \ + GRID_BINOP_LEFT(op, name); \ + GRID_BINOP_RIGHT(op, name); -#define GRID_DEF_TRINOP(op, name)\ -template inline auto op(const T1 &pred,const T2&lhs,const T3 &rhs) \ - -> decltype(LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(),\ - std::forward_as_tuple(pred,lhs,rhs)))) \ -{\ - return LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(), \ - std::forward_as_tuple(pred,lhs, rhs))); \ -} +#define GRID_DEF_TRINOP(op, name) \ + template \ + inline auto op(const T1 &pred, const T2 &lhs, const T3 &rhs) \ + ->decltype( \ + LatticeTrinaryExpression(std::make_pair( \ + GRID_TRINOP(name)(), std::forward_as_tuple(pred, lhs, rhs)))) { \ + return LatticeTrinaryExpression(std::make_pair( \ + GRID_TRINOP(name)(), std::forward_as_tuple(pred, lhs, rhs))); \ + } //////////////////////// -//Operator definitions +// Operator definitions //////////////////////// -GRID_DEF_UNOP(operator -,UnarySub); -GRID_DEF_UNOP(Not,UnaryNot); -GRID_DEF_UNOP(operator !,UnaryNot); -GRID_DEF_UNOP(adj,UnaryAdj); -GRID_DEF_UNOP(conjugate,UnaryConj); -GRID_DEF_UNOP(trace,UnaryTrace); -GRID_DEF_UNOP(transpose,UnaryTranspose); -GRID_DEF_UNOP(Ta,UnaryTa); -GRID_DEF_UNOP(ProjectOnGroup,UnaryProjectOnGroup); -GRID_DEF_UNOP(real,UnaryReal); -GRID_DEF_UNOP(imag,UnaryImag); -GRID_DEF_UNOP(toReal,UnaryToReal); -GRID_DEF_UNOP(toComplex,UnaryToComplex); -GRID_DEF_UNOP(abs ,UnaryAbs); //abs overloaded in cmath C++98; DON'T do the abs-fabs-dabs-labs thing -GRID_DEF_UNOP(sqrt ,UnarySqrt); -GRID_DEF_UNOP(rsqrt,UnaryRsqrt); -GRID_DEF_UNOP(sin ,UnarySin); -GRID_DEF_UNOP(cos ,UnaryCos); -GRID_DEF_UNOP(log ,UnaryLog); -GRID_DEF_UNOP(exp ,UnaryExp); +GRID_DEF_UNOP(operator-, UnarySub); +GRID_DEF_UNOP(Not, UnaryNot); +GRID_DEF_UNOP(operator!, UnaryNot); +GRID_DEF_UNOP(adj, UnaryAdj); +GRID_DEF_UNOP(conjugate, UnaryConj); +GRID_DEF_UNOP(trace, UnaryTrace); +GRID_DEF_UNOP(transpose, UnaryTranspose); +GRID_DEF_UNOP(Ta, UnaryTa); +GRID_DEF_UNOP(ProjectOnGroup, UnaryProjectOnGroup); +GRID_DEF_UNOP(real, UnaryReal); +GRID_DEF_UNOP(imag, UnaryImag); +GRID_DEF_UNOP(toReal, UnaryToReal); +GRID_DEF_UNOP(toComplex, UnaryToComplex); +GRID_DEF_UNOP(timesI, UnaryTimesI); +GRID_DEF_UNOP(timesMinusI, UnaryTimesMinusI); +GRID_DEF_UNOP(abs, UnaryAbs); // abs overloaded in cmath C++98; DON'T do the + // abs-fabs-dabs-labs thing +GRID_DEF_UNOP(sqrt, UnarySqrt); +GRID_DEF_UNOP(rsqrt, UnaryRsqrt); +GRID_DEF_UNOP(sin, UnarySin); +GRID_DEF_UNOP(cos, UnaryCos); +GRID_DEF_UNOP(asin, UnaryAsin); +GRID_DEF_UNOP(acos, UnaryAcos); +GRID_DEF_UNOP(log, UnaryLog); +GRID_DEF_UNOP(exp, UnaryExp); -GRID_DEF_BINOP(operator+,BinaryAdd); -GRID_DEF_BINOP(operator-,BinarySub); -GRID_DEF_BINOP(operator*,BinaryMul); +GRID_DEF_BINOP(operator+, BinaryAdd); +GRID_DEF_BINOP(operator-, BinarySub); +GRID_DEF_BINOP(operator*, BinaryMul); -GRID_DEF_BINOP(operator&,BinaryAnd); -GRID_DEF_BINOP(operator|,BinaryOr); -GRID_DEF_BINOP(operator&&,BinaryAndAnd); -GRID_DEF_BINOP(operator||,BinaryOrOr); +GRID_DEF_BINOP(operator&, BinaryAnd); +GRID_DEF_BINOP(operator|, BinaryOr); +GRID_DEF_BINOP(operator&&, BinaryAndAnd); +GRID_DEF_BINOP(operator||, BinaryOrOr); -GRID_DEF_TRINOP(where,TrinaryWhere); +GRID_DEF_TRINOP(where, TrinaryWhere); ///////////////////////////////////////////////////////////// // Closure convenience to force expression to evaluate ///////////////////////////////////////////////////////////// -template - auto closure(const LatticeUnaryExpression & expr) - -> Lattice(expr.second))))> -{ - Lattice(expr.second))))> ret(expr); +template +auto closure(const LatticeUnaryExpression &expr) + -> Lattice(expr.second))))> { + Lattice(expr.second))))> ret( + expr); return ret; } -template - auto closure(const LatticeBinaryExpression & expr) - -> Lattice(expr.second)), - eval(0,std::get<1>(expr.second))))> -{ - Lattice(expr.second)), - eval(0,std::get<1>(expr.second))))> ret(expr); +template +auto closure(const LatticeBinaryExpression &expr) + -> Lattice(expr.second)), + eval(0, std::get<1>(expr.second))))> { + Lattice(expr.second)), + eval(0, std::get<1>(expr.second))))> + ret(expr); return ret; } -template - auto closure(const LatticeTrinaryExpression & expr) - -> Lattice(expr.second)), - eval(0,std::get<1>(expr.second)), - eval(0,std::get<2>(expr.second))))> -{ - Lattice(expr.second)), - eval(0,std::get<1>(expr.second)), - eval(0,std::get<2>(expr.second))))> ret(expr); +template +auto closure(const LatticeTrinaryExpression &expr) + -> Lattice(expr.second)), + eval(0, std::get<1>(expr.second)), + eval(0, std::get<2>(expr.second))))> { + Lattice(expr.second)), + eval(0, std::get<1>(expr.second)), + eval(0, std::get<2>(expr.second))))> + ret(expr); return ret; } @@ -382,12 +431,11 @@ template #undef GRID_DEF_UNOP #undef GRID_DEF_BINOP #undef GRID_DEF_TRINOP - } #if 0 using namespace Grid; - + int main(int argc,char **argv){ Lattice v1(16); @@ -397,7 +445,7 @@ using namespace Grid; BinaryAdd tmp; LatticeBinaryExpression,Lattice &,Lattice &> expr(std::make_pair(tmp, - std::forward_as_tuple(v1,v2))); + std::forward_as_tuple(v1,v2))); tmp.func(eval(0,v1),eval(0,v2)); auto var = v1+v2; diff --git a/lib/lattice/Lattice_base.h b/lib/lattice/Lattice_base.h index fb679323..3bfa5613 100644 --- a/lib/lattice/Lattice_base.h +++ b/lib/lattice/Lattice_base.h @@ -1,32 +1,33 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/lattice/Lattice_base.h +Source file: ./lib/lattice/Lattice_base.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_LATTICE_BASE_H #define GRID_LATTICE_BASE_H @@ -256,6 +257,18 @@ PARALLEL_FOR_LOOP checkerboard=0; } + Lattice(const Lattice& r){ // copy constructor + _grid = r._grid; + checkerboard = r.checkerboard; + _odata.resize(_grid->oSites());// essential + PARALLEL_FOR_LOOP + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss]=r._odata[ss]; + } + } + + + virtual ~Lattice(void) = default; template strong_inline Lattice & operator = (const sobj & r){ @@ -268,7 +281,7 @@ PARALLEL_FOR_LOOP template strong_inline Lattice & operator = (const Lattice & r){ this->checkerboard = r.checkerboard; conformable(*this,r); - std::cout< class WilsonLoops; +template class WilsonLoops; -#define INHERIT_GIMPL_TYPES(GImpl) \ - typedef typename GImpl::Simd Simd;\ - typedef typename GImpl::GaugeLinkField GaugeLinkField;\ - typedef typename GImpl::GaugeField GaugeField;\ - typedef typename GImpl::SiteGaugeField SiteGaugeField;\ - typedef typename GImpl::SiteGaugeLink SiteGaugeLink; +#define INHERIT_GIMPL_TYPES(GImpl) \ + typedef typename GImpl::Simd Simd; \ + typedef typename GImpl::GaugeLinkField GaugeLinkField; \ + typedef typename GImpl::GaugeField GaugeField; \ + typedef typename GImpl::SiteGaugeField SiteGaugeField; \ + typedef typename GImpl::SiteGaugeLink SiteGaugeLink; +// +template class GaugeImplTypes { +public: + typedef S Simd; - // - template - class GaugeImplTypes { - public: - - typedef S Simd; - - template using iImplGaugeLink = iScalar > >; - template using iImplGaugeField = iVector >, Nd >; - - typedef iImplGaugeLink SiteGaugeLink; - typedef iImplGaugeField SiteGaugeField; - - typedef Lattice GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly - typedef Lattice GaugeField; + template + using iImplGaugeLink = iScalar>>; + template + using iImplGaugeField = iVector>, Nd>; - }; + typedef iImplGaugeLink SiteGaugeLink; + typedef iImplGaugeField SiteGaugeField; - // Composition with smeared link, bc's etc.. probably need multiple inheritance - // Variable precision "S" and variable Nc - template - class PeriodicGaugeImpl : public GimplTypes { - public: + typedef Lattice GaugeLinkField; // bit ugly naming; polarised + // gauge field, lorentz... all + // ugly + typedef Lattice GaugeField; - INHERIT_GIMPL_TYPES(GimplTypes); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Support needed for the assembly of loops including all boundary condition effects such as conjugate bcs - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - - template static inline - Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { - return PeriodicBC::CovShiftForward(Link,mu,field); - } - - template static inline - Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { - return PeriodicBC::CovShiftBackward(Link,mu,field); - } - static inline - GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { - return Cshift(adj(Link),mu,-1); - } - static inline - GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { - return Link; - } - static inline - GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { - return Cshift(Link,mu,1); - } - - static inline bool isPeriodicGaugeField(void) { - return true; - } - - }; - - - // Composition with smeared link, bc's etc.. probably need multiple inheritance - // Variable precision "S" and variable Nc - template - class ConjugateGaugeImpl : public GimplTypes { - public: - - INHERIT_GIMPL_TYPES(GimplTypes); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Support needed for the assembly of loops including all boundary condition effects such as Gparity. - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - template static - Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { - return ConjugateBC::CovShiftForward(Link,mu,field); + // Move this elsewhere? + static inline void AddGaugeLink(GaugeField &U, GaugeLinkField &W, + int mu) { // U[mu] += W + PARALLEL_FOR_LOOP + for (auto ss = 0; ss < U._grid->oSites(); ss++) { + U._odata[ss]._internal[mu] = + U._odata[ss]._internal[mu] + W._odata[ss]._internal; } - - template static - Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { - return ConjugateBC::CovShiftBackward(Link,mu,field); - } - - static inline - GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { - GridBase *grid = Link._grid; - int Lmu = grid->GlobalDimensions()[mu]-1; - - Lattice > coor(grid); LatticeCoordinate(coor,mu); - - GaugeLinkField tmp (grid); - tmp=adj(Link); - tmp = where(coor==Lmu,conjugate(tmp),tmp); - return Cshift(tmp,mu,-1);// moves towards positive mu - } - static inline - GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { - return Link; - } - - static inline - GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { - GridBase *grid = Link._grid; - int Lmu = grid->GlobalDimensions()[mu]-1; - - Lattice > coor(grid); LatticeCoordinate(coor,mu); - - GaugeLinkField tmp (grid); - tmp=Cshift(Link,mu,1); - tmp=where(coor==Lmu,conjugate(tmp),tmp); - return tmp; - } - - static inline bool isPeriodicGaugeField(void) { - return false; - } - - }; - - typedef GaugeImplTypes GimplTypesR; - typedef GaugeImplTypes GimplTypesF; - typedef GaugeImplTypes GimplTypesD; - - typedef PeriodicGaugeImpl PeriodicGimplR; // Real.. whichever prec - typedef PeriodicGaugeImpl PeriodicGimplF; // Float - typedef PeriodicGaugeImpl PeriodicGimplD; // Double - - typedef ConjugateGaugeImpl ConjugateGimplR; // Real.. whichever prec - typedef ConjugateGaugeImpl ConjugateGimplF; // Float - typedef ConjugateGaugeImpl ConjugateGimplD; // Double - } +}; + +// Composition with smeared link, bc's etc.. probably need multiple inheritance +// Variable precision "S" and variable Nc +template class PeriodicGaugeImpl : public GimplTypes { +public: + INHERIT_GIMPL_TYPES(GimplTypes); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Support needed for the assembly of loops including all boundary condition + // effects such as conjugate bcs + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + + template + static inline Lattice + CovShiftForward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return PeriodicBC::CovShiftForward(Link, mu, field); + } + + template + static inline Lattice + CovShiftBackward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return PeriodicBC::CovShiftBackward(Link, mu, field); + } + static inline GaugeLinkField + CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { + return Cshift(adj(Link), mu, -1); + } + static inline GaugeLinkField + CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { + return Link; + } + static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { + return Cshift(Link, mu, 1); + } + + static inline bool isPeriodicGaugeField(void) { return true; } +}; + +// Composition with smeared link, bc's etc.. probably need multiple inheritance +// Variable precision "S" and variable Nc +template class ConjugateGaugeImpl : public GimplTypes { +public: + INHERIT_GIMPL_TYPES(GimplTypes); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Support needed for the assembly of loops including all boundary condition + // effects such as Gparity. + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + template + static Lattice CovShiftForward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return ConjugateBC::CovShiftForward(Link, mu, field); + } + + template + static Lattice CovShiftBackward(const GaugeLinkField &Link, int mu, + const Lattice &field) { + return ConjugateBC::CovShiftBackward(Link, mu, field); + } + + static inline GaugeLinkField + CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { + GridBase *grid = Link._grid; + int Lmu = grid->GlobalDimensions()[mu] - 1; + + Lattice> coor(grid); + LatticeCoordinate(coor, mu); + + GaugeLinkField tmp(grid); + tmp = adj(Link); + tmp = where(coor == Lmu, conjugate(tmp), tmp); + return Cshift(tmp, mu, -1); // moves towards positive mu + } + static inline GaugeLinkField + CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { + return Link; + } + + static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { + GridBase *grid = Link._grid; + int Lmu = grid->GlobalDimensions()[mu] - 1; + + Lattice> coor(grid); + LatticeCoordinate(coor, mu); + + GaugeLinkField tmp(grid); + tmp = Cshift(Link, mu, 1); + tmp = where(coor == Lmu, conjugate(tmp), tmp); + return tmp; + } + + static inline bool isPeriodicGaugeField(void) { return false; } +}; + +typedef GaugeImplTypes GimplTypesR; +typedef GaugeImplTypes GimplTypesF; +typedef GaugeImplTypes GimplTypesD; + +typedef PeriodicGaugeImpl PeriodicGimplR; // Real.. whichever prec +typedef PeriodicGaugeImpl PeriodicGimplF; // Float +typedef PeriodicGaugeImpl PeriodicGimplD; // Double + +typedef ConjugateGaugeImpl + ConjugateGimplR; // Real.. whichever prec +typedef ConjugateGaugeImpl ConjugateGimplF; // Float +typedef ConjugateGaugeImpl ConjugateGimplD; // Double +} } #endif diff --git a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h index d7d08516..080b1be2 100644 --- a/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h +++ b/lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h @@ -1,212 +1,214 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h +Source file: ./lib/qcd/action/pseudofermion/OneFlavourEvenOddRational.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Peter Boyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H #define QCD_PSEUDOFERMION_ONE_FLAVOUR_EVEN_ODD_RATIONAL_H -namespace Grid{ - namespace QCD{ +namespace Grid { +namespace QCD { - /////////////////////////////////////// - // One flavour rational - /////////////////////////////////////// +/////////////////////////////////////// +// One flavour rational +/////////////////////////////////////// - // S_f = chi^dag * N(Mpc^dag*Mpc)/D(Mpc^dag*Mpc) * chi +// S_f = chi^dag * N(Mpc^dag*Mpc)/D(Mpc^dag*Mpc) * chi +// +// Here, M is some operator +// N and D makeup the rat. poly +// + +template +class OneFlavourEvenOddRationalPseudoFermionAction + : public Action { + public: + INHERIT_IMPL_TYPES(Impl); + + typedef OneFlavourRationalParams Params; + Params param; + + MultiShiftFunction PowerHalf; + MultiShiftFunction PowerNegHalf; + MultiShiftFunction PowerQuarter; + MultiShiftFunction PowerNegQuarter; + + private: + FermionOperator &FermOp; // the basic operator + + // NOT using "Nroots"; IroIro is -- perhaps later, but this wasn't good for us + // historically + // and hasenbusch works better + + FermionField PhiEven; // the pseudo fermion field for this trajectory + FermionField PhiOdd; // the pseudo fermion field for this trajectory + + public: + OneFlavourEvenOddRationalPseudoFermionAction(FermionOperator &Op, + Params &p) + : FermOp(Op), + PhiEven(Op.FermionRedBlackGrid()), + PhiOdd(Op.FermionRedBlackGrid()), + param(p) { + AlgRemez remez(param.lo, param.hi, param.precision); + + // MdagM^(+- 1/2) + std::cout << GridLogMessage << "Generating degree " << param.degree + << " for x^(1/2)" << std::endl; + remez.generateApprox(param.degree, 1, 2); + PowerHalf.Init(remez, param.tolerance, false); + PowerNegHalf.Init(remez, param.tolerance, true); + + // MdagM^(+- 1/4) + std::cout << GridLogMessage << "Generating degree " << param.degree + << " for x^(1/4)" << std::endl; + remez.generateApprox(param.degree, 1, 4); + PowerQuarter.Init(remez, param.tolerance, false); + PowerNegQuarter.Init(remez, param.tolerance, true); + }; + + virtual void refresh(const GaugeField &U, GridParallelRNG &pRNG) { + // P(phi) = e^{- phi^dag (MpcdagMpc)^-1/2 phi} + // = e^{- phi^dag (MpcdagMpc)^-1/4 (MpcdagMpc)^-1/4 phi} + // Phi = MpcdagMpc^{1/4} eta // - // Here, M is some operator - // N and D makeup the rat. poly + // P(eta) = e^{- eta^dag eta} // - - template - class OneFlavourEvenOddRationalPseudoFermionAction : public Action { - public: - INHERIT_IMPL_TYPES(Impl); + // e^{x^2/2 sig^2} => sig^2 = 0.5. + // + // So eta should be of width sig = 1/sqrt(2). - typedef OneFlavourRationalParams Params; - Params param; + RealD scale = std::sqrt(0.5); - MultiShiftFunction PowerHalf ; - MultiShiftFunction PowerNegHalf; - MultiShiftFunction PowerQuarter; - MultiShiftFunction PowerNegQuarter; + FermionField eta(FermOp.FermionGrid()); + FermionField etaOdd(FermOp.FermionRedBlackGrid()); + FermionField etaEven(FermOp.FermionRedBlackGrid()); - private: - - FermionOperator & FermOp;// the basic operator + gaussian(pRNG, eta); + eta = eta * scale; - // NOT using "Nroots"; IroIro is -- perhaps later, but this wasn't good for us historically - // and hasenbusch works better + pickCheckerboard(Even, etaEven, eta); + pickCheckerboard(Odd, etaOdd, eta); - FermionField PhiEven; // the pseudo fermion field for this trajectory - FermionField PhiOdd; // the pseudo fermion field for this trajectory - + FermOp.ImportGauge(U); - public: + // mutishift CG + SchurDifferentiableOperator Mpc(FermOp); + ConjugateGradientMultiShift msCG(param.MaxIter, PowerQuarter); + msCG(Mpc, etaOdd, PhiOdd); - OneFlavourEvenOddRationalPseudoFermionAction(FermionOperator &Op, - Params & p ) : FermOp(Op), - PhiEven(Op.FermionRedBlackGrid()), - PhiOdd (Op.FermionRedBlackGrid()), - param(p) - { - AlgRemez remez(param.lo,param.hi,param.precision); + ////////////////////////////////////////////////////// + // FIXME : Clover term not yet.. + ////////////////////////////////////////////////////// - // MdagM^(+- 1/2) - std::cout< sig^2 = 0.5. - // - // So eta should be of width sig = 1/sqrt(2). + FermionField Y(FermOp.FermionRedBlackGrid()); - RealD scale = std::sqrt(0.5); + SchurDifferentiableOperator Mpc(FermOp); - FermionField eta (FermOp.FermionGrid()); - FermionField etaOdd (FermOp.FermionRedBlackGrid()); - FermionField etaEven(FermOp.FermionRedBlackGrid()); + ConjugateGradientMultiShift msCG(param.MaxIter, + PowerNegQuarter); - gaussian(pRNG,eta); eta=eta*scale; + msCG(Mpc, PhiOdd, Y); - pickCheckerboard(Even,etaEven,eta); - pickCheckerboard(Odd,etaOdd,eta); + RealD action = norm2(Y); + std::cout << GridLogMessage << "Pseudofermion action FIXME -- is -1/4 " + "solve or -1/2 solve faster??? " + << action << std::endl; - FermOp.ImportGauge(U); + return action; + }; - // mutishift CG - SchurDifferentiableOperator Mpc(FermOp); - ConjugateGradientMultiShift msCG(param.MaxIter,PowerQuarter); - msCG(Mpc,etaOdd,PhiOdd); + ////////////////////////////////////////////////////// + // Need + // dS_f/dU = chi^dag d[N/D] chi + // + // N/D is expressed as partial fraction expansion: + // + // a0 + \sum_k ak/(M^dagM + bk) + // + // d[N/D] is then + // + // \sum_k -ak [M^dagM+bk]^{-1} [ dM^dag M + M^dag dM ] [M^dag M + + // bk]^{-1} + // + // Need + // Mf Phi_k = [MdagM+bk]^{-1} Phi + // Mf Phi = \sum_k ak [MdagM+bk]^{-1} Phi + // + // With these building blocks + // + // dS/dU = \sum_k -ak Mf Phi_k^dag [ dM^dag M + M^dag dM ] Mf + // Phi_k + // S = innerprodReal(Phi,Mf Phi); + ////////////////////////////////////////////////////// + virtual void deriv(const GaugeField &U, GaugeField &dSdU) { + const int Npole = PowerNegHalf.poles.size(); - ////////////////////////////////////////////////////// - // FIXME : Clover term not yet.. - ////////////////////////////////////////////////////// + std::vector MPhi_k(Npole, FermOp.FermionRedBlackGrid()); - assert(FermOp.ConstEE() == 1); - PhiEven = zero; - - }; + FermionField X(FermOp.FermionRedBlackGrid()); + FermionField Y(FermOp.FermionRedBlackGrid()); - ////////////////////////////////////////////////////// - // S = phi^dag (Mdag M)^-1/2 phi - ////////////////////////////////////////////////////// - virtual RealD S(const GaugeField &U) { + GaugeField tmp(FermOp.GaugeGrid()); - FermOp.ImportGauge(U); + FermOp.ImportGauge(U); - FermionField Y(FermOp.FermionRedBlackGrid()); - - SchurDifferentiableOperator Mpc(FermOp); + SchurDifferentiableOperator Mpc(FermOp); - ConjugateGradientMultiShift msCG(param.MaxIter,PowerNegQuarter); + ConjugateGradientMultiShift msCG(param.MaxIter, PowerNegHalf); - msCG(Mpc,PhiOdd,Y); + msCG(Mpc, PhiOdd, MPhi_k); - RealD action = norm2(Y); - std::cout << GridLogMessage << "Pseudofermion action FIXME -- is -1/4 solve or -1/2 solve faster??? "< MPhi_k (Npole,FermOp.FermionRedBlackGrid()); - - FermionField X(FermOp.FermionRedBlackGrid()); - FermionField Y(FermOp.FermionRedBlackGrid()); - - GaugeField tmp(FermOp.GaugeGrid()); - - FermOp.ImportGauge(U); - - SchurDifferentiableOperator Mpc(FermOp); - - ConjugateGradientMultiShift msCG(param.MaxIter,PowerNegHalf); - - msCG(Mpc,PhiOdd,MPhi_k); - - dSdU = zero; - for(int k=0;k Author: Peter Boyle Author: neo Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ //-------------------------------------------------------------------- /*! @file HMC.h * @brief Classes for Hybrid Monte Carlo update @@ -41,172 +42,195 @@ Author: paboyle #include +namespace Grid { +namespace QCD { -namespace Grid{ - namespace QCD{ - +struct HMCparameters { + Integer StartTrajectory; + Integer Trajectories; /* @brief Number of sweeps in this run */ + bool MetropolisTest; + Integer NoMetropolisUntil; - struct HMCparameters{ + HMCparameters() { + ////////////////////////////// Default values + MetropolisTest = true; + NoMetropolisUntil = 10; + StartTrajectory = 0; + Trajectories = 200; + ///////////////////////////////// + } - Integer StartTrajectory; - Integer Trajectories; /* @brief Number of sweeps in this run */ - bool MetropolisTest; - Integer NoMetropolisUntil; + void print() const { + std::cout << GridLogMessage << "[HMC parameter] Trajectories : " << Trajectories << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Start trajectory : " << StartTrajectory << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Metropolis test (on/off): " << MetropolisTest << "\n"; + std::cout << GridLogMessage << "[HMC parameter] Thermalization trajs : " << NoMetropolisUntil << "\n"; + } + +}; - HMCparameters(){ - ////////////////////////////// Default values - MetropolisTest = true; - NoMetropolisUntil = 10; - StartTrajectory = 0; - Trajectories = 200; - ///////////////////////////////// - } - }; +template +class HmcObservable { + public: + virtual void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) = 0; +}; - template - class HmcObservable { - public: - virtual void TrajectoryComplete (int traj, GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG & pRNG )=0; - }; +template +class PlaquetteLogger : public HmcObservable { + private: + std::string Stem; - template - class PlaquetteLogger : public HmcObservable { - private: - std::string Stem; - public: - INHERIT_GIMPL_TYPES(Gimpl); - PlaquetteLogger(std::string cf) { - Stem = cf; - }; + public: + INHERIT_GIMPL_TYPES(Gimpl); + PlaquetteLogger(std::string cf) { Stem = cf; }; - void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, GridParallelRNG & pRNG ) - { - std::string file; { std::ostringstream os; os << Stem <<"."<< traj; file = os.str(); } - std::ofstream of(file); + void TrajectoryComplete(int traj, GaugeField &U, GridSerialRNG &sRNG, + GridParallelRNG &pRNG) { + std::string file; + { + std::ostringstream os; + os << Stem << "." << traj; + file = os.str(); + } + std::ofstream of(file); - RealD peri_plaq = WilsonLoops::avgPlaquette(U); - RealD peri_rect = WilsonLoops::avgRectangle(U); + RealD peri_plaq = WilsonLoops::avgPlaquette(U); + RealD peri_rect = WilsonLoops::avgRectangle(U); - RealD impl_plaq = WilsonLoops::avgPlaquette(U); - RealD impl_rect = WilsonLoops::avgRectangle(U); + RealD impl_plaq = WilsonLoops::avgPlaquette(U); + RealD impl_rect = WilsonLoops::avgRectangle(U); - of << traj<<" "<< impl_plaq << " " << impl_rect << " "<< peri_plaq<<" "< - template - class HybridMonteCarlo { - private: +// template +template +class HybridMonteCarlo { + private: + const HMCparameters Params; - const HMCparameters Params; - - GridSerialRNG &sRNG; // Fixme: need a RNG management strategy. - GridParallelRNG &pRNG; // Fixme: need a RNG management strategy. - GaugeField & Ucur; + GridSerialRNG &sRNG; // Fixme: need a RNG management strategy. + GridParallelRNG &pRNG; // Fixme: need a RNG management strategy. + GaugeField &Ucur; - IntegratorType &TheIntegrator; - std::vector *> Observables; + IntegratorType &TheIntegrator; + std::vector *> Observables; - ///////////////////////////////////////////////////////// - // Metropolis step - ///////////////////////////////////////////////////////// - bool metropolis_test(const RealD DeltaH){ + ///////////////////////////////////////////////////////// + // Metropolis step + ///////////////////////////////////////////////////////// + bool metropolis_test(const RealD DeltaH) { + RealD rn_test; - RealD rn_test; + RealD prob = std::exp(-DeltaH); - RealD prob = std::exp(-DeltaH); + random(sRNG, rn_test); - random(sRNG,rn_test); - - std::cout<1.0) || (rn_test <= prob)){ // accepted - std::cout< 1.0) || (rn_test <= prob)) { // accepted + std::cout << GridLogMessage << "Metropolis_test -- ACCEPTED\n"; + std::cout << GridLogMessage + << "--------------------------------------------------\n"; + return true; + } else { // rejected + std::cout << GridLogMessage << "Metropolis_test -- REJECTED\n"; + std::cout << GridLogMessage + << "--------------------------------------------------\n"; + return false; + } + } + + ///////////////////////////////////////////////////////// + // Evolution + ///////////////////////////////////////////////////////// + RealD evolve_step(GaugeField &U) { + TheIntegrator.refresh(U, pRNG); // set U and initialize P and phi's + + RealD H0 = TheIntegrator.S(U); // initial state action + + std::streamsize current_precision = std::cout.precision(); + std::cout.precision(17); + std::cout << GridLogMessage << "Total H before trajectory = " << H0 << "\n"; + std::cout.precision(current_precision); + + TheIntegrator.integrate(U); + + RealD H1 = TheIntegrator.S(U); // updated state action + + std::cout.precision(17); + std::cout << GridLogMessage << "Total H after trajectory = " << H1 + << " dH = " << H1 - H0 << "\n"; + std::cout.precision(current_precision); + + return (H1 - H0); + } + + public: + ///////////////////////////////////////// + // Constructor + ///////////////////////////////////////// + HybridMonteCarlo(HMCparameters Pams, IntegratorType &_Int, + GridSerialRNG &_sRNG, GridParallelRNG &_pRNG, GaugeField &_U) + : Params(Pams), TheIntegrator(_Int), sRNG(_sRNG), pRNG(_pRNG), Ucur(_U) {} + ~HybridMonteCarlo(){}; + + void AddObservable(HmcObservable *obs) { + Observables.push_back(obs); + } + + void evolve(void) { + Real DeltaH; + + GaugeField Ucopy(Ucur._grid); + + Params.print(); + + // Actual updates (evolve a copy Ucopy then copy back eventually) + for (int traj = Params.StartTrajectory; + traj < Params.Trajectories + Params.StartTrajectory; ++traj) { + std::cout << GridLogMessage << "-- # Trajectory = " << traj << "\n"; + Ucopy = Ucur; + + DeltaH = evolve_step(Ucopy); + + bool accept = true; + if (traj >= Params.NoMetropolisUntil) { + accept = metropolis_test(DeltaH); } - ///////////////////////////////////////////////////////// - // Evolution - ///////////////////////////////////////////////////////// - RealD evolve_step(GaugeField& U){ - - TheIntegrator.refresh(U,pRNG); // set U and initialize P and phi's - - RealD H0 = TheIntegrator.S(U); // initial state action - - std::cout< *obs) { - Observables.push_back(obs); + if (accept) { + Ucur = Ucopy; } - void evolve(void){ - - Real DeltaH; - - GaugeField Ucopy(Ucur._grid); - - // Actual updates (evolve a copy Ucopy then copy back eventually) - for(int traj=Params.StartTrajectory; traj < Params.Trajectories+Params.StartTrajectory; ++traj){ - - std::cout< Params.NoMetropolisUntil) { - accept = metropolis_test(DeltaH); - } - - if ( accept ) { - Ucur = Ucopy; - } - - for(int obs = 0;obsTrajectoryComplete (traj+1,Ucur,sRNG,pRNG); - } - - } + for (int obs = 0; obs < Observables.size(); obs++) { + Observables[obs]->TrajectoryComplete(traj + 1, Ucur, sRNG, pRNG); } - }; - - }// QCD -}// Grid + } + } +}; +} // QCD +} // Grid -#endif +#endif diff --git a/lib/qcd/hmc/HmcRunner.h b/lib/qcd/hmc/HmcRunner.h index a9178c74..5616582f 100644 --- a/lib/qcd/hmc/HmcRunner.h +++ b/lib/qcd/hmc/HmcRunner.h @@ -47,7 +47,7 @@ public: GridRedBlackCartesian * UrbGrid ; GridRedBlackCartesian * FrbGrid ; - virtual void BuildTheAction (int argc, char **argv) = 0; + virtual void BuildTheAction (int argc, char **argv) = 0; // necessary? void Run (int argc, char **argv){ @@ -81,55 +81,78 @@ public: NumTraj = ivec[0]; } - // Create integrator - typedef MinimumNorm2 IntegratorType;// change here to change the algorithm - IntegratorParameters MDpar(20); - IntegratorType MDynamics(UGrid,MDpar, TheAction); + int NumThermalizations = 10; + if( GridCmdOptionExists(argv,argv+argc,"--Thermalizations") ){ + arg= GridCmdOptionPayload(argv,argv+argc,"--Thermalizations"); + std::vector ivec(0); + GridCmdOptionIntVector(arg,ivec); + NumThermalizations = ivec[0]; + } + + GridSerialRNG sRNG; + GridParallelRNG pRNG(UGrid); + LatticeGaugeField U(UGrid); // change this to an extended field (smearing class) + + std::vector SerSeed({1,2,3,4,5}); + std::vector ParSeed({6,7,8,9,10}); + + + // Create integrator, including the smearing policy + // Smearing policy + std::cout << GridLogDebug << " Creating the Stout class\n"; + double rho = 0.1; // smearing parameter, now hardcoded + int Nsmear = 1; // number of smearing levels + Smear_Stout Stout(rho); + std::cout << GridLogDebug << " Creating the SmearedConfiguration class\n"; + SmearedConfiguration SmearingPolicy(UGrid, Nsmear, Stout); + std::cout << GridLogDebug << " done\n"; + ////////////// + typedef MinimumNorm2 > IntegratorType;// change here to change the algorithm + IntegratorParameters MDpar(20); + IntegratorType MDynamics(UGrid, MDpar, TheAction, SmearingPolicy); + + // Checkpoint strategy NerscHmcCheckpointer Checkpoint(std::string("ckpoint_lat"),std::string("ckpoint_rng"),1); PlaquetteLogger PlaqLog(std::string("plaq")); HMCparameters HMCpar; - HMCpar.StartTrajectory = StartTraj; - HMCpar.Trajectories = NumTraj; + HMCpar.StartTrajectory = StartTraj; + HMCpar.Trajectories = NumTraj; + HMCpar.NoMetropolisUntil = NumThermalizations; - GridSerialRNG sRNG; - GridParallelRNG pRNG(UGrid); - LatticeGaugeField U(UGrid); - - std::vector SerSeed({1,2,3,4,5}); - std::vector ParSeed({6,7,8,9,10}); if ( StartType == HotStart ) { // Hot start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::HotConfiguration(pRNG, U); } else if ( StartType == ColdStart ) { // Cold start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::ColdConfiguration(pRNG, U); } else if ( StartType == TepidStart ) { // Tepid start - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; sRNG.SeedFixedIntegers(SerSeed); pRNG.SeedFixedIntegers(ParSeed); SU3::TepidConfiguration(pRNG, U); } else if ( StartType == CheckpointStart ) { - HMCpar.NoMetropolisUntil =10; HMCpar.MetropolisTest = true; // CheckpointRestart Checkpoint.CheckpointRestore(StartTraj, U, sRNG, pRNG); } - HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); + // Attach the gauge field to the smearing Policy and create the fill the smeared set + // notice that the unit configuration is singular in this procedure + std::cout << GridLogMessage << "Filling the smeared set\n"; + SmearingPolicy.set_GaugeField(U); + + HybridMonteCarlo HMC(HMCpar, MDynamics,sRNG,pRNG,U); HMC.AddObservable(&Checkpoint); HMC.AddObservable(&PlaqLog); diff --git a/lib/qcd/hmc/integrators/Integrator.h b/lib/qcd/hmc/integrators/Integrator.h index e6f6c1cd..db61b114 100644 --- a/lib/qcd/hmc/integrators/Integrator.h +++ b/lib/qcd/hmc/integrators/Integrator.h @@ -44,40 +44,40 @@ Author: paboyle #include -namespace Grid{ - namespace QCD{ + namespace Grid{ + namespace QCD{ - struct IntegratorParameters{ + struct IntegratorParameters{ - int Nexp; + int Nexp; int MDsteps; // number of outer steps RealD trajL; // trajectory length RealD stepsize; IntegratorParameters(int MDsteps_, - RealD trajL_=1.0, - int Nexp_=12): - Nexp(Nexp_), - MDsteps(MDsteps_), - trajL(trajL_), - stepsize(trajL/MDsteps) - { + RealD trajL_=1.0, + int Nexp_=12): + Nexp(Nexp_), + MDsteps(MDsteps_), + trajL(trajL_), + stepsize(trajL/MDsteps) + { // empty body constructor - }; + }; - }; + }; /*! @brief Class for Molecular Dynamics management */ - template - class Integrator { + template + class Integrator { - protected: + protected: - typedef IntegratorParameters ParameterType; + typedef IntegratorParameters ParameterType; - IntegratorParameters Params; + IntegratorParameters Params; - const ActionSet as; + const ActionSet as; int levels; // double t_U; // Track time passing on each level and for U and for P @@ -85,17 +85,19 @@ namespace Grid{ GaugeField P; + SmearingPolicy &Smearer; + // Should match any legal (SU(n)) gauge field // Need to use this template to match Ncol to pass to SU class template void generate_momenta(Lattice< iVector< iScalar< iMatrix >, Nd> > & P,GridParallelRNG& pRNG){ - typedef Lattice< iScalar< iScalar< iMatrix > > > GaugeLinkField; - GaugeLinkField Pmu(P._grid); - Pmu = zero; - for(int mu=0;mu::GaussianLieAlgebraMatrix(pRNG, Pmu); - PokeIndex(P, Pmu, mu); - } + typedef Lattice< iScalar< iScalar< iMatrix > > > GaugeLinkField; + GaugeLinkField Pmu(P._grid); + Pmu = zero; + for(int mu=0;mu::GaussianLieAlgebraMatrix(pRNG, Pmu); + PokeIndex(P, Pmu, mu); } + } //ObserverList observers; // not yet @@ -103,110 +105,128 @@ namespace Grid{ // void register_observers(); // void notify_observers(); - void update_P(GaugeField&U, int level,double ep){ - t_P[level]+=ep; - update_P(P,U,level,ep); + void update_P(GaugeField&U, int level, double ep){ + t_P[level]+=ep; + update_P(P,U,level,ep); - std::cout<deriv(U,force); - Mom = Mom - force*ep; + void update_P(GaugeField &Mom,GaugeField&U, int level,double ep){ + // input U actually not used... + for(int a=0; ais_smeared); + as[level].actions.at(a)->deriv(Us,force); // deriv should NOT include Ta + + std::cout<< GridLogIntegrator << "Smearing (on/off): "<is_smeared <is_smeared) Smearer.smeared_force(force); + force = Ta(force); + std::cout<< GridLogIntegrator << "Force average: "<< norm2(force)/(U._grid->gSites()) <(U, mu); - auto Pmu=PeekIndex(Mom, mu); - Umu = expMat(Pmu, ep, Params.Nexp)*Umu; - ProjectOnGroup(Umu); - PokeIndex(U, Umu, mu); + for (int mu = 0; mu < Nd; mu++){ + auto Umu=PeekIndex(U, mu); + auto Pmu=PeekIndex(Mom, mu); + Umu = expMat(Pmu, ep, Params.Nexp)*Umu; + ProjectOnGroup(Umu); + PokeIndex(U, Umu, mu); + } + // Update the smeared fields, can be implemented as observer + Smearer.set_GaugeField(U); } - } - - virtual void step (GaugeField& U,int level, int first,int last)=0; - public: + virtual void step (GaugeField& U,int level, int first,int last)=0; - Integrator(GridBase* grid, - IntegratorParameters Par, - ActionSet & Aset): - Params(Par), - as(Aset), - P(grid), - levels(Aset.size()) - { - t_P.resize(levels,0.0); - t_U=0.0; - }; - - virtual ~Integrator(){} +public: + + Integrator(GridBase* grid, + IntegratorParameters Par, + ActionSet & Aset, + SmearingPolicy &Sm): + Params(Par), + as(Aset), + P(grid), + levels(Aset.size()), + Smearer(Sm) + { + t_P.resize(levels,0.0); + t_U=0.0; + // initialization of smearer delegated outside of Integrator + }; + + virtual ~Integrator(){} //Initialization of momenta and actions - void refresh(GaugeField& U,GridParallelRNG &pRNG){ - std::cout<refresh(U, pRNG); - } + void refresh(GaugeField& U,GridParallelRNG &pRNG){ + std::cout<is_smeared); + as[level].actions.at(actionID)->refresh(Us, pRNG); + } + } } - } // Calculate action - RealD S(GaugeField& U){ + RealD S(GaugeField& U){// here also U not used - LatticeComplex Hloc(U._grid); Hloc = zero; + LatticeComplex Hloc(U._grid); Hloc = zero; // Momenta - for (int mu=0; mu (P, mu); - Hloc -= trace(Pmu*Pmu); - } - Complex Hsum = sum(Hloc); - - RealD H = Hsum.real(); - RealD Hterm; - std::cout<(P, mu); + Hloc -= trace(Pmu*Pmu); + } + Complex Hsum = sum(Hloc); + + RealD H = Hsum.real(); + RealD Hterm; + std::cout<S(U); - std::cout< +class SmearedConfiguration { + public: + INHERIT_GIMPL_TYPES(Gimpl); + + private: + const unsigned int smearingLevels; + Smear_Stout StoutSmearing; + std::vector SmearedSet; + + // Member functions + //==================================================================== + void fill_smearedSet(GaugeField& U) { + ThinLinks = &U; // attach the smearing routine to the field U + + // check the pointer is not null + if (ThinLinks == NULL) + std::cout << GridLogError + << "[SmearedConfiguration] Error in ThinLinks pointer\n"; + + if (smearingLevels > 0) { + std::cout << GridLogDebug + << "[SmearedConfiguration] Filling SmearedSet\n"; + GaugeField previous_u(ThinLinks->_grid); + + previous_u = *ThinLinks; + for (int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl) { + StoutSmearing.smear(SmearedSet[smearLvl], previous_u); + previous_u = SmearedSet[smearLvl]; + + // For debug purposes + RealD impl_plaq = WilsonLoops::avgPlaquette(previous_u); + std::cout << GridLogDebug + << "[SmearedConfiguration] Plaq: " << impl_plaq << std::endl; + } + } + } + //==================================================================== + GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime, + const GaugeField& GaugeK) const { + GridBase* grid = GaugeK._grid; + GaugeField C(grid), SigmaK(grid), iLambda(grid); + GaugeLinkField iLambda_mu(grid); + GaugeLinkField iQ(grid), e_iQ(grid); + GaugeLinkField SigmaKPrime_mu(grid); + GaugeLinkField GaugeKmu(grid), Cmu(grid); + + StoutSmearing.BaseSmear(C, GaugeK); + SigmaK = zero; + iLambda = zero; + + for (int mu = 0; mu < Nd; mu++) { + Cmu = peekLorentz(C, mu); + GaugeKmu = peekLorentz(GaugeK, mu); + SigmaKPrime_mu = peekLorentz(SigmaKPrime, mu); + iQ = Ta(Cmu * adj(GaugeKmu)); + set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu); + pokeLorentz(SigmaK, SigmaKPrime_mu * e_iQ + adj(Cmu) * iLambda_mu, mu); + pokeLorentz(iLambda, iLambda_mu, mu); + } + StoutSmearing.derivative(SigmaK, iLambda, + GaugeK); // derivative of SmearBase + return SigmaK; + } + + /*! @brief Returns smeared configuration at level 'Level' */ + const GaugeField& get_smeared_conf(int Level) const { + return SmearedSet[Level]; + } + + //==================================================================== + void set_iLambda(GaugeLinkField& iLambda, GaugeLinkField& e_iQ, + const GaugeLinkField& iQ, const GaugeLinkField& Sigmap, + const GaugeLinkField& GaugeK) const { + GridBase* grid = iQ._grid; + GaugeLinkField iQ2(grid), iQ3(grid), B1(grid), B2(grid), USigmap(grid); + GaugeLinkField unity(grid); + unity = 1.0; + + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); + LatticeComplex xi0(grid), xi1(grid), tmp(grid); + LatticeComplex u2(grid), w2(grid), cosw(grid); + LatticeComplex emiu(grid), e2iu(grid), qt(grid), fden(grid); + LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid); + LatticeComplex r22(grid), tr1(grid), tr2(grid); + LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), + b22(grid); + LatticeComplex LatticeUnitComplex(grid); + + LatticeUnitComplex = 1.0; + + // Exponential + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; + StoutSmearing.set_uw(u, w, iQ2, iQ3); + StoutSmearing.set_fj(f0, f1, f2, u, w); + e_iQ = f0 * unity + timesMinusI(f1) * iQ - f2 * iQ2; + + // Getting B1, B2, Gamma and Lambda + // simplify this part, reduntant calculations in set_fj + xi0 = StoutSmearing.func_xi0(w); + xi1 = StoutSmearing.func_xi1(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + + emiu = cos(u) - timesI(sin(u)); + e2iu = cos(2.0 * u) + timesI(sin(2.0 * u)); + + r01 = (2.0 * u + timesI(2.0 * (u2 - w2))) * e2iu + + emiu * ((16.0 * u * cosw + 2.0 * u * (3.0 * u2 + w2) * xi0) + + timesI(-8.0 * u2 * cosw + 2.0 * (9.0 * u2 + w2) * xi0)); + + r11 = (2.0 * LatticeUnitComplex + timesI(4.0 * u)) * e2iu + + emiu * ((-2.0 * cosw + (3.0 * u2 - w2) * xi0) + + timesI((2.0 * u * cosw + 6.0 * u * xi0))); + + r21 = + 2.0 * timesI(e2iu) + emiu * (-3.0 * u * xi0 + timesI(cosw - 3.0 * xi0)); + + r02 = -2.0 * e2iu + + emiu * (-8.0 * u2 * xi0 + + timesI(2.0 * u * (cosw + xi0 + 3.0 * u2 * xi1))); + + r12 = emiu * (2.0 * u * xi0 + timesI(-cosw - xi0 + 3.0 * u2 * xi1)); + + r22 = emiu * (xi0 - timesI(3.0 * u * xi1)); + + fden = LatticeUnitComplex / (2.0 * (9.0 * u2 - w2) * (9.0 * u2 - w2)); + + b10 = 2.0 * u * r01 + (3.0 * u2 - w2) * r02 - (30.0 * u2 + 2.0 * w2) * f0; + b11 = 2.0 * u * r11 + (3.0 * u2 - w2) * r12 - (30.0 * u2 + 2.0 * w2) * f1; + b12 = 2.0 * u * r21 + (3.0 * u2 - w2) * r22 - (30.0 * u2 + 2.0 * w2) * f2; + + b20 = r01 - (3.0 * u) * r02 - (24.0 * u) * f0; + b21 = r11 - (3.0 * u) * r12 - (24.0 * u) * f1; + b22 = r21 - (3.0 * u) * r22 - (24.0 * u) * f2; + + b10 *= fden; + b11 *= fden; + b12 *= fden; + b20 *= fden; + b21 *= fden; + b22 *= fden; + + B1 = b10 * unity + timesMinusI(b11) * iQ - b12 * iQ2; + B2 = b20 * unity + timesMinusI(b21) * iQ - b22 * iQ2; + USigmap = GaugeK * Sigmap; + + tr1 = trace(USigmap * B1); + tr2 = trace(USigmap * B2); + + GaugeLinkField QUS = iQ * USigmap; + GaugeLinkField USQ = USigmap * iQ; + + GaugeLinkField iGamma = tr1 * iQ - timesI(tr2) * iQ2 + + timesI(f1) * USigmap + f2 * QUS + f2 * USQ; + + iLambda = Ta(iGamma); + } + + //==================================================================== + public: + GaugeField* + ThinLinks; /*!< @brief Pointer to the thin + links configuration */ + + /*! @brief Standard constructor */ + SmearedConfiguration(GridCartesian* UGrid, unsigned int Nsmear, + Smear_Stout& Stout) + : smearingLevels(Nsmear), StoutSmearing(Stout), ThinLinks(NULL) { + for (unsigned int i = 0; i < smearingLevels; ++i) + SmearedSet.push_back(*(new GaugeField(UGrid))); + } + + /*! For just thin links */ + SmearedConfiguration() + : smearingLevels(0), StoutSmearing(), SmearedSet(), ThinLinks(NULL) {} + + // attach the smeared routines to the thin links U and fill the smeared set + void set_GaugeField(GaugeField& U) { fill_smearedSet(U); } + + //==================================================================== + void smeared_force(GaugeField& SigmaTilde) const { + if (smearingLevels > 0) { + GaugeField force = SigmaTilde; // actually = U*SigmaTilde + GaugeLinkField tmp_mu(SigmaTilde._grid); + + for (int mu = 0; mu < Nd; mu++) { + // to get just SigmaTilde + tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels - 1], mu)) * + peekLorentz(force, mu); + pokeLorentz(force, tmp_mu, mu); + } + + for (int ismr = smearingLevels - 1; ismr > 0; --ismr) + force = AnalyticSmearedForce(force, get_smeared_conf(ismr - 1)); + + force = AnalyticSmearedForce(force, *ThinLinks); + + for (int mu = 0; mu < Nd; mu++) { + tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu); + pokeLorentz(SigmaTilde, tmp_mu, mu); + } + } // if smearingLevels = 0 do nothing + } + //==================================================================== + + GaugeField& get_SmearedU() { return SmearedSet[smearingLevels - 1]; } + + GaugeField& get_U(bool smeared = false) { + // get the config, thin links by default + if (smeared) { + if (smearingLevels) { + RealD impl_plaq = + WilsonLoops::avgPlaquette(SmearedSet[smearingLevels - 1]); + std::cout << GridLogDebug << "getting Usmr Plaq: " << impl_plaq + << std::endl; + return get_SmearedU(); + + } else { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq + << std::endl; + return *ThinLinks; + } + } else { + RealD impl_plaq = WilsonLoops::avgPlaquette(*ThinLinks); + std::cout << GridLogDebug << "getting Thin Plaq: " << impl_plaq + << std::endl; + return *ThinLinks; + } + } +}; +} +} + +#endif diff --git a/lib/qcd/smearing/Smearing.h b/lib/qcd/smearing/Smearing.h new file mode 100644 index 00000000..89842c80 --- /dev/null +++ b/lib/qcd/smearing/Smearing.h @@ -0,0 +1,9 @@ +#ifndef GRID_QCD_SMEARING_H +#define GRID_QCD_SMEARING_H + +#include +#include +#include +#include + +#endif diff --git a/lib/qcd/smearing/StoutSmearing.h b/lib/qcd/smearing/StoutSmearing.h new file mode 100644 index 00000000..50a09972 --- /dev/null +++ b/lib/qcd/smearing/StoutSmearing.h @@ -0,0 +1,160 @@ +/* + @file stoutSmear.hpp + @brief Declares Stout smearing class +*/ +#ifndef STOUT_SMEAR_ +#define STOUT_SMEAR_ + +namespace Grid { +namespace QCD { + +/*! @brief Stout smearing of link variable. */ +template +class Smear_Stout : public Smear { + private: + const Smear* SmearBase; + + public: + INHERIT_GIMPL_TYPES(Gimpl) + + Smear_Stout(Smear* base) : SmearBase(base) { + static_assert(Nc == 3, + "Stout smearing currently implemented only for Nc==3"); + } + + /*! Default constructor */ + Smear_Stout(double rho = 1.0) : SmearBase(new Smear_APE(rho)) { + static_assert(Nc == 3, + "Stout smearing currently implemented only for Nc==3"); + } + + ~Smear_Stout() {} // delete SmearBase... + + void smear(GaugeField& u_smr, const GaugeField& U) const { + GaugeField C(U._grid); + GaugeLinkField tmp(U._grid), iq_mu(U._grid), Umu(U._grid); + + std::cout << GridLogDebug << "Stout smearing started\n"; + + // Smear the configurations + SmearBase->smear(C, U); + + for (int mu = 0; mu < Nd; mu++) { + tmp = peekLorentz(C, mu); + Umu = peekLorentz(U, mu); + iq_mu = Ta( + tmp * + adj(Umu)); // iq_mu = Ta(Omega_mu) to match the signs with the paper + exponentiate_iQ(tmp, iq_mu); + pokeLorentz(u_smr, tmp * Umu, mu); // u_smr = exp(iQ_mu)*U_mu + } + std::cout << GridLogDebug << "Stout smearing completed\n"; + }; + + void derivative(GaugeField& SigmaTerm, const GaugeField& iLambda, + const GaugeField& Gauge) const { + SmearBase->derivative(SigmaTerm, iLambda, Gauge); + }; + + void BaseSmear(GaugeField& C, const GaugeField& U) const { + SmearBase->smear(C, U); + }; + + void exponentiate_iQ(GaugeLinkField& e_iQ, const GaugeLinkField& iQ) const { + // Put this outside + // only valid for SU(3) matrices + + // only one Lorentz direction at a time + + // notice that it actually computes + // exp ( input matrix ) + // the i sign is coming from outside + // input matrix is anti-hermitian NOT hermitian + + GridBase* grid = iQ._grid; + GaugeLinkField unity(grid); + unity = 1.0; + + GaugeLinkField iQ2(grid), iQ3(grid); + LatticeComplex u(grid), w(grid); + LatticeComplex f0(grid), f1(grid), f2(grid); + + iQ2 = iQ * iQ; + iQ3 = iQ * iQ2; + + set_uw(u, w, iQ2, iQ3); + set_fj(f0, f1, f2, u, w); + + e_iQ = f0 * unity + timesMinusI(f1) * iQ - f2 * iQ2; + }; + + void set_uw(LatticeComplex& u, LatticeComplex& w, GaugeLinkField& iQ2, + GaugeLinkField& iQ3) const { + Complex one_over_three = 1.0 / 3.0; + Complex one_over_two = 1.0 / 2.0; + + GridBase* grid = u._grid; + LatticeComplex c0(grid), c1(grid), tmp(grid), c0max(grid), theta(grid); + + // sign in c0 from the conventions on the Ta + c0 = -imag(trace(iQ3)) * one_over_three; + c1 = -real(trace(iQ2)) * one_over_two; + + // Cayley Hamilton checks to machine precision, tested + tmp = c1 * one_over_three; + c0max = 2.0 * pow(tmp, 1.5); + + theta = acos(c0 / c0max) * + one_over_three; // divide by three here, now leave as it is + u = sqrt(tmp) * cos(theta); + w = sqrt(c1) * sin(theta); + } + + void set_fj(LatticeComplex& f0, LatticeComplex& f1, LatticeComplex& f2, + const LatticeComplex& u, const LatticeComplex& w) const { + GridBase* grid = u._grid; + LatticeComplex xi0(grid), u2(grid), w2(grid), cosw(grid); + LatticeComplex fden(grid); + LatticeComplex h0(grid), h1(grid), h2(grid); + LatticeComplex e2iu(grid), emiu(grid), ixi0(grid), qt(grid); + LatticeComplex unity(grid); + unity = 1.0; + + xi0 = func_xi0(w); + u2 = u * u; + w2 = w * w; + cosw = cos(w); + + ixi0 = timesI(xi0); + emiu = cos(u) - timesI(sin(u)); + e2iu = cos(2.0 * u) + timesI(sin(2.0 * u)); + + h0 = e2iu * (u2 - w2) + + emiu * ((8.0 * u2 * cosw) + (2.0 * u * (3.0 * u2 + w2) * ixi0)); + h1 = e2iu * (2.0 * u) - emiu * ((2.0 * u * cosw) - (3.0 * u2 - w2) * ixi0); + h2 = e2iu - emiu * (cosw + (3.0 * u) * ixi0); + + fden = unity / (9.0 * u2 - w2); // reals + f0 = h0 * fden; + f1 = h1 * fden; + f2 = h2 * fden; + } + + LatticeComplex func_xi0(const LatticeComplex& w) const { + // Define a function to do the check + // if( w < 1e-4 ) std::cout << GridLogWarning<< "[Smear_stout] w too small: + // "<< w <<"\n"; + return sin(w) / w; + } + + LatticeComplex func_xi1(const LatticeComplex& w) const { + // Define a function to do the check + // if( w < 1e-4 ) std::cout << GridLogWarning << "[Smear_stout] w too small: + // "<< w <<"\n"; + return cos(w) / (w * w) - sin(w) / (w * w * w); + } +}; +} +} + +#endif diff --git a/lib/qcd/utils/SUn.h b/lib/qcd/utils/SUn.h index 124e5f41..e9403836 100644 --- a/lib/qcd/utils/SUn.h +++ b/lib/qcd/utils/SUn.h @@ -43,7 +43,7 @@ public: template using iSUnMatrix = iScalar > > ; template using iSU2Matrix = iScalar > > ; - + ////////////////////////////////////////////////////////////////////////////////////////////////// // Types can be accessed as SU<2>::Matrix , SU<2>::vSUnMatrix, SU<2>::LatticeMatrix etc... ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -552,15 +552,24 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g } // reunitarise?? - static void LieRandomize(GridParallelRNG &pRNG,LatticeMatrix &out,double scale=1.0){ + template + static void LieRandomize(GridParallelRNG &pRNG,LatticeMatrixType &out,double scale=1.0){ GridBase *grid = out._grid; - - LatticeComplex ca (grid); - LatticeMatrix lie(grid); - LatticeMatrix la (grid); - Complex ci(0.0,scale); - Complex cone(1.0,0.0); - Matrix ta; + + typedef typename LatticeMatrixType::vector_type vector_type; + typedef typename LatticeMatrixType::scalar_type scalar_type; + + typedef iSinglet vTComplexType; + + typedef Lattice LatticeComplexType; + typedef typename GridTypeMapper::scalar_object MatrixType; + + LatticeComplexType ca (grid); + LatticeMatrixType lie(grid); + LatticeMatrixType la (grid); + ComplexD ci(0.0,scale); + ComplexD cone(1.0,0.0); + MatrixType ta; lie=zero; for(int a=0;a + static void HotConfiguration(GridParallelRNG &pRNG,GaugeField &out){ + typedef typename GaugeField::vector_type vector_type; + typedef iSUnMatrix vMatrixType; + typedef Lattice LatticeMatrixType; + + LatticeMatrixType Umu(out._grid); for(int mu=0;mu(out,Umu,mu); @@ -622,13 +635,15 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g static void taProj( const LatticeMatrix &in, LatticeMatrix &out){ out = Ta(in); } - static void taExp( const LatticeMatrix &x, LatticeMatrix &ex){ - - LatticeMatrix xn(x._grid); + template + static void taExp( const LatticeMatrixType &x, LatticeMatrixType &ex){ + typedef typename LatticeMatrixType::scalar_type ComplexType; + + LatticeMatrixType xn(x._grid); RealD nfac = 1.0; xn = x; - ex =xn+Complex(1.0); // 1+x + ex =xn+ComplexType(1.0); // 1+x // Do a 12th order exponentiation for(int i=2; i <= 12; ++i) diff --git a/lib/qcd/utils/WilsonLoops.h b/lib/qcd/utils/WilsonLoops.h index 66f65296..10022f50 100644 --- a/lib/qcd/utils/WilsonLoops.h +++ b/lib/qcd/utils/WilsonLoops.h @@ -1,6 +1,6 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/qcd/utils/WilsonLoops.h @@ -25,391 +25,501 @@ Author: paboyle with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ + See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef QCD_UTILS_WILSON_LOOPS_H #define QCD_UTILS_WILSON_LOOPS_H namespace Grid { namespace QCD { // Common wilson loop observables -template -class WilsonLoops : public Gimpl { +template class WilsonLoops : public Gimpl { public: - INHERIT_GIMPL_TYPES(Gimpl); typedef typename Gimpl::GaugeLinkField GaugeMat; - typedef typename Gimpl::GaugeField GaugeLorentz; + typedef typename Gimpl::GaugeField GaugeLorentz; ////////////////////////////////////////////////// // directed plaquette oriented in mu,nu plane ////////////////////////////////////////////////// - static void dirPlaquette(GaugeMat &plaq,const std::vector &U, const int mu, const int nu) - { - // Annoyingly, must use either scope resolution to find dependent base class, - // or this-> ; there is no "this" in a static method. This forces explicit Gimpl scope - // resolution throughout the usage in this file, and rather defeats the purpose of deriving + static void dirPlaquette(GaugeMat &plaq, const std::vector &U, + const int mu, const int nu) { + // Annoyingly, must use either scope resolution to find dependent base + // class, + // or this-> ; there is no "this" in a static method. This forces explicit + // Gimpl scope + // resolution throughout the usage in this file, and rather defeats the + // purpose of deriving // from Gimpl. - plaq= Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftForward (U[mu],mu,U[nu]))); + plaq = Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftBackward( + U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu]))); } ////////////////////////////////////////////////// // trace of directed plaquette oriented in mu,nu plane ////////////////////////////////////////////////// - static void traceDirPlaquette(LatticeComplex &plaq, const std::vector &U, const int mu, const int nu) - { + static void traceDirPlaquette(LatticeComplex &plaq, + const std::vector &U, const int mu, + const int nu) { GaugeMat sp(U[0]._grid); - dirPlaquette(sp,U,mu,nu); - plaq=trace(sp); + dirPlaquette(sp, U, mu, nu); + plaq = trace(sp); } ////////////////////////////////////////////////// // sum over all planes of plaquette ////////////////////////////////////////////////// - static void sitePlaquette(LatticeComplex &Plaq,const std::vector &U) - { + static void sitePlaquette(LatticeComplex &Plaq, + const std::vector &U) { LatticeComplex sitePlaq(U[0]._grid); - Plaq=zero; - for(int mu=1;mu U(Nd,Umu._grid); + static RealD sumPlaquette(const GaugeLorentz &Umu) { + std::vector U(4, Umu._grid); - for(int mu=0;mu(Umu,mu); + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); } LatticeComplex Plaq(Umu._grid); - - sitePlaquette(Plaq,U); - + + sitePlaquette(Plaq, U); + TComplex Tp = sum(Plaq); - Complex p = TensorRemove(Tp); + Complex p = TensorRemove(Tp); return p.real(); } ////////////////////////////////////////////////// // average over all x,y,z,t and over all planes of plaquette ////////////////////////////////////////////////// - static RealD avgPlaquette(const GaugeLorentz &Umu){ - + static RealD avgPlaquette(const GaugeLorentz &Umu) { RealD sumplaq = sumPlaquette(Umu); - double vol = Umu._grid->gSites(); - - double faces = (1.0*Nd*(Nd-1))/2.0; - - return sumplaq/vol/faces/Nc; // Nd , Nc dependent... FIXME + double faces = (1.0 * Nd * (Nd - 1)) / 2.0; + return sumplaq / vol / faces / Nc; // Nd , Nc dependent... FIXME } - static RealD linkTrace(const GaugeLorentz &Umu){ - std::vector U(Nd,Umu._grid); - LatticeComplex Tr(Umu._grid); Tr=zero; - for(int mu=0;mu(Umu,mu); - Tr = Tr+trace(U[mu]); + ////////////////////////////////////////////////// + // average over traced single links + ////////////////////////////////////////////////// + static RealD linkTrace(const GaugeLorentz &Umu) { + std::vector U(4, Umu._grid); + + LatticeComplex Tr(Umu._grid); + Tr = zero; + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); + Tr = Tr + trace(U[mu]); } - + TComplex Tp = sum(Tr); - Complex p = TensorRemove(Tp); + Complex p = TensorRemove(Tp); double vol = Umu._grid->gSites(); - return p.real()/vol/((double)(Nd*(Nd-1))); + return p.real() / vol / 4.0 / 3.0; }; + ////////////////////////////////////////////////// - // the sum over all staples on each site + // the sum over all staples on each site in direction mu,nu ////////////////////////////////////////////////// - static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu){ + static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu, + int nu) { GridBase *grid = Umu._grid; - std::vector U(Nd,grid); - for(int d=0;d(Umu,d); + std::vector U(4, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); } staple = zero; - GaugeMat tmp(grid); - - for(int nu=0;nu nu - // __ + // __ // | // __| // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftForward (U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu, - Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu); + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); - // __ - // | - // |__ + // __ + // | + // |__ // // - staple+=Gimpl::ShiftStaple( - Gimpl::CovShiftBackward(U[nu],nu, - Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu); + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu], nu, + Gimpl::CovShiftBackward(U[mu], mu, U[nu])), + mu); + } + } + + ////////////////////////////////////////////////// + // the sum over all staples on each site + ////////////////////////////////////////////////// + static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu) { + + GridBase *grid = Umu._grid; + + std::vector U(Nd, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); + } + staple = zero; + GaugeMat tmp(grid); + + for (int nu = 0; nu < Nd; nu++) { + + if (nu != mu) { + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); + + // __ + // | + // |__ + // + // + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftBackward(U[nu], nu, + Gimpl::CovShiftBackward(U[mu], mu, U[nu])), + mu); } } } + ////////////////////////////////////////////////// + // the sum over all staples on each site in direction mu,nu, upper part + ////////////////////////////////////////////////// + static void StapleUpper(GaugeMat &staple, const GaugeLorentz &Umu, int mu, + int nu) { + + staple = zero; + + if (nu != mu) { + GridBase *grid = Umu._grid; + + std::vector U(4, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); + } + + // mu + // ^ + // |__> nu + + // __ + // | + // __| + // + + staple += Gimpl::ShiftStaple( + Gimpl::CovShiftForward( + U[nu], nu, + Gimpl::CovShiftBackward( + U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))), + mu); + } + } + ////////////////////////////////////////////////////// // Similar to above for rectangle is required ////////////////////////////////////////////////////// - static void dirRectangle(GaugeMat &rect,const std::vector &U, const int mu, const int nu) - { - rect = Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[mu],mu,U[nu]))* // ->->| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[mu],mu,U[mu]))) ; - rect = rect + - Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[nu],nu,U[nu]))* // ->|| - adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[nu],nu,U[mu]))) ; + static void dirRectangle(GaugeMat &rect, const std::vector &U, + const int mu, const int nu) { + rect = Gimpl::CovShiftForward( + U[mu], mu, Gimpl::CovShiftForward(U[mu], mu, U[nu])) * // ->->| + adj(Gimpl::CovShiftForward( + U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[mu]))); + rect = rect + + Gimpl::CovShiftForward( + U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[nu])) * // ->|| + adj(Gimpl::CovShiftForward( + U[nu], nu, Gimpl::CovShiftForward(U[nu], nu, U[mu]))); } - static void traceDirRectangle(LatticeComplex &rect, const std::vector &U, const int mu, const int nu) - { + static void traceDirRectangle(LatticeComplex &rect, + const std::vector &U, const int mu, + const int nu) { GaugeMat sp(U[0]._grid); - dirRectangle(sp,U,mu,nu); - rect=trace(sp); + dirRectangle(sp, U, mu, nu); + rect = trace(sp); } - static void siteRectangle(LatticeComplex &Rect,const std::vector &U) - { + static void siteRectangle(LatticeComplex &Rect, + const std::vector &U) { LatticeComplex siteRect(U[0]._grid); - Rect=zero; - for(int mu=1;mu U(Nd,Umu._grid); + static RealD sumRectangle(const GaugeLorentz &Umu) { + std::vector U(Nd, Umu._grid); - for(int mu=0;mu(Umu,mu); + for (int mu = 0; mu < Nd; mu++) { + U[mu] = PeekIndex(Umu, mu); } LatticeComplex Rect(Umu._grid); - - siteRectangle(Rect,U); - + + siteRectangle(Rect, U); + TComplex Tp = sum(Rect); - Complex p = TensorRemove(Tp); + Complex p = TensorRemove(Tp); return p.real(); } ////////////////////////////////////////////////// // average over all x,y,z,t and over all planes of plaquette ////////////////////////////////////////////////// - static RealD avgRectangle(const GaugeLorentz &Umu){ + static RealD avgRectangle(const GaugeLorentz &Umu) { RealD sumrect = sumRectangle(Umu); - + double vol = Umu._grid->gSites(); - - double faces = (1.0*Nd*(Nd-1)); // 2 distinct orientations summed - - return sumrect/vol/faces/Nc; // Nd , Nc dependent... FIXME + + double faces = (1.0 * Nd * (Nd - 1)); // 2 distinct orientations summed + + return sumrect / vol / faces / Nc; // Nd , Nc dependent... FIXME } ////////////////////////////////////////////////// // the sum over all staples on each site ////////////////////////////////////////////////// - static void RectStapleDouble(GaugeMat &U2,const GaugeMat & U,int mu){ - U2 = U * Cshift(U,mu,1); + static void RectStapleDouble(GaugeMat &U2, const GaugeMat &U, int mu) { + U2 = U * Cshift(U, mu, 1); } //////////////////////////////////////////////////////////////////////////// - // Hop by two optimisation strategy does not work nicely with Gparity. (could do, + // Hop by two optimisation strategy does not work nicely with Gparity. (could + // do, // but need to track two deep where cross boundary and apply a conjugation). - // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do so . + // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do + // so . //////////////////////////////////////////////////////////////////////////// - static void RectStapleOptimised(GaugeMat &Stap,std::vector &U2,std::vector &U,int mu){ + static void RectStapleOptimised(GaugeMat &Stap, std::vector &U2, + std::vector &U, int mu) { Stap = zero; GridBase *grid = U[0]._grid; - GaugeMat Staple2x1 (grid); - GaugeMat tmp (grid); + GaugeMat Staple2x1(grid); + GaugeMat tmp(grid); - for(int nu=0;nu &U2, - std::vector &U, int mu) - { - if ( Gimpl::isPeriodicGaugeField() ){ - RectStapleOptimised(Stap,U2,U,mu); - } else { - RectStapleUnoptimised(Stap,Umu,mu); + tmp = Gimpl::CovShiftBackward(U[mu], mu, U2[nu]); + tmp = adj(U2[nu]) * tmp; + tmp = Cshift(tmp, nu, -2); + Stap += Cshift(tmp, mu, 1); + } } } - static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){ + static void RectStaple(GaugeMat &Stap, const GaugeLorentz &Umu, int mu) { + RectStapleUnoptimised(Stap, Umu, mu); + } + static void RectStaple(const GaugeLorentz &Umu, GaugeMat &Stap, + std::vector &U2, std::vector &U, + int mu) { + if (Gimpl::isPeriodicGaugeField()) { + RectStapleOptimised(Stap, U2, U, mu); + } else { + RectStapleUnoptimised(Stap, Umu, mu); + } + } + + static void RectStapleUnoptimised(GaugeMat &Stap, const GaugeLorentz &Umu, + int mu) { GridBase *grid = Umu._grid; - std::vector U(Nd,grid); - for(int d=0;d(Umu,d); + std::vector U(Nd, grid); + for (int d = 0; d < Nd; d++) { + U[d] = PeekIndex(Umu, d); } - Stap=zero; + Stap = zero; - for(int nu=0;nu ColourWilsonLoops; +typedef WilsonLoops U1WilsonLoops; +typedef WilsonLoops SU2WilsonLoops; +typedef WilsonLoops SU3WilsonLoops; +} +} - typedef WilsonLoops ColourWilsonLoops; - typedef WilsonLoops U1WilsonLoops; - typedef WilsonLoops SU2WilsonLoops; - typedef WilsonLoops SU3WilsonLoops; - -}} - -#endif +#endif \ No newline at end of file diff --git a/lib/serialisation/.dirstamp b/lib/serialisation/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 1c113024..e4dab85a 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -1,33 +1,34 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/simd/Grid_vector_types.h +Source file: ./lib/simd/Grid_vector_types.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Guido Cossu Author: Peter Boyle Author: neo - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ //--------------------------------------------------------------------------- /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types @@ -43,7 +44,7 @@ Author: neo #ifdef SSE4 #include "Grid_sse4.h" #endif -#if defined (AVX1)|| defined (AVX2) || defined (AVXFMA4) +#if defined(AVX1) || defined(AVX2) || defined(AVXFMA4) #include "Grid_avx.h" #endif #if defined AVX512 @@ -61,224 +62,85 @@ Author: neo namespace Grid { - ////////////////////////////////////// - // To take the floating point type of real/complex type - ////////////////////////////////////// - template struct RealPart { - typedef T type; - }; - template struct RealPart< std::complex >{ - typedef T type; - }; - - ////////////////////////////////////// - // demote a vector to real type - ////////////////////////////////////// +////////////////////////////////////// +// To take the floating point type of real/complex type +////////////////////////////////////// +template +struct RealPart { + typedef T type; +}; +template +struct RealPart > { + typedef T type; +}; - // type alias used to simplify the syntax of std::enable_if - template using Invoke = typename T::type; - template using EnableIf = Invoke >; - template using NotEnableIf= Invoke >; +////////////////////////////////////// +// demote a vector to real type +////////////////////////////////////// +// type alias used to simplify the syntax of std::enable_if +template +using Invoke = typename T::type; +template +using EnableIf = Invoke >; +template +using NotEnableIf = Invoke >; - //////////////////////////////////////////////////////// - // Check for complexity with type traits - template struct is_complex : public std::false_type {}; - template <> struct is_complex >: public std::true_type {}; - template <> struct is_complex > : public std::true_type {}; +//////////////////////////////////////////////////////// +// Check for complexity with type traits +template +struct is_complex : public std::false_type {}; +template <> +struct is_complex > : public std::true_type {}; +template <> +struct is_complex > : public std::true_type {}; - template using IfReal = Invoke::value,int> > ; - template using IfComplex = Invoke::value,int> > ; - template using IfInteger = Invoke::value,int> > ; +template +using IfReal = Invoke::value, int> >; +template +using IfComplex = Invoke::value, int> >; +template +using IfInteger = Invoke::value, int> >; - template using IfNotReal = Invoke::value,int> > ; - template using IfNotComplex = Invoke::value,int> > ; - template using IfNotInteger = Invoke::value,int> > ; +template +using IfNotReal = + Invoke::value, int> >; +template +using IfNotComplex = Invoke::value, int> >; +template +using IfNotInteger = Invoke::value, int> >; - //////////////////////////////////////////////////////// - // Define the operation templates functors - // general forms to allow for vsplat syntax - // need explicit declaration of types when used since - // clang cannot automatically determine the output type sometimes - template < class Out, class Input1, class Input2, class Operation > - Out binary(Input1 src_1, Input2 src_2, Operation op){ - return op(src_1, src_2); - } +//////////////////////////////////////////////////////// +// Define the operation templates functors +// general forms to allow for vsplat syntax +// need explicit declaration of types when used since +// clang cannot automatically determine the output type sometimes +template +Out binary(Input1 src_1, Input2 src_2, Operation op) { + return op(src_1, src_2); +} - template < class Out, class Input, class Operation > - Out unary(Input src, Operation op){ - return op(src); - } - /////////////////////////////////////////////// +template +Out unary(Input src, Operation op) { + return op(src); +} +/////////////////////////////////////////////// +/* + @brief Grid_simd class for the SIMD vector type operations + */ +template +class Grid_simd { + public: + typedef typename RealPart::type Real; + typedef Vector_type vector_type; + typedef Scalar_type scalar_type; - - /* - @brief Grid_simd class for the SIMD vector type operations - */ - template < class Scalar_type, class Vector_type > - class Grid_simd { - - public: - typedef typename RealPart < Scalar_type >::type Real; - typedef Vector_type vector_type; - typedef Scalar_type scalar_type; - - - typedef union conv_t_union { - Vector_type v; - Scalar_type s[sizeof(Vector_type)/sizeof(Scalar_type)]; - conv_t_union(){}; - } conv_t; - - + typedef union conv_t_union { Vector_type v; - - static inline int Nsimd(void) { return sizeof(Vector_type)/sizeof(Scalar_type);} - - Grid_simd& operator=(const Grid_simd&& rhs){v=rhs.v;return *this;}; - Grid_simd& operator=(const Grid_simd& rhs){v=rhs.v;return *this;}; //faster than not declaring it and leaving to the compiler - Grid_simd()=default; - Grid_simd(const Grid_simd& rhs) :v(rhs.v){}; //compiles in movaps - Grid_simd(const Grid_simd&& rhs):v(rhs.v){}; - - ///////////////////////////// - // Constructors - ///////////////////////////// - Grid_simd & operator = ( Zero & z){ - vzero(*this); - return (*this); - } - - //Enable if complex type - template < typename S = Scalar_type > - Grid_simd(const typename std::enable_if< is_complex < S >::value, S>::type a){ - vsplat(*this,a); - }; - - Grid_simd(const Real a){ - vsplat(*this,Scalar_type(a)); - }; - - /////////////////////////////////////////////// - // mac, mult, sub, add, adj - /////////////////////////////////////////////// - - // FIXME -- alias this to an inline MAC struct. - friend inline void mac (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - - - friend inline void mult(Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } - - friend inline void mac (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } - - friend inline void mac (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ a,const Scalar_type *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) + (*r); } - - //////////////////////////////////////////////////////////////////////// - // FIXME: gonna remove these load/store, get, set, prefetch - //////////////////////////////////////////////////////////////////////// - friend inline void vset(Grid_simd &ret, Scalar_type *a){ - ret.v = unary(a, VsetSIMD()); - } - - /////////////////////// - // Vstore - /////////////////////// - friend inline void vstore(const Grid_simd &ret, Scalar_type *a){ - binary(ret.v, (Real*)a, VstoreSIMD()); - } - - /////////////////////// - // Vprefetch - /////////////////////// - friend inline void vprefetch(const Grid_simd &v) - { - prefetch_HINT_T0((const char*)&v.v); - } - - /////////////////////// - // Reduce - /////////////////////// - friend inline Scalar_type Reduce(const Grid_simd & in) - { - return unary(in.v, ReduceSIMD()); - } - - //////////////////////////// - // opreator scalar * simd - //////////////////////////// - friend inline Grid_simd operator * (const Scalar_type &a, Grid_simd b){ - Grid_simd va; - vsplat(va,a); - return va*b; - } - friend inline Grid_simd operator * (Grid_simd b,const Scalar_type &a){ - return a*b; - } - - /////////////////////// - // Unary negation - /////////////////////// - friend inline Grid_simd operator -(const Grid_simd &r) { - Grid_simd ret; - vzero(ret); - ret = ret - r; - return ret; - } - // *=,+=,-= operators - inline Grid_simd &operator *=(const Grid_simd &r) { - *this = (*this)*r; - return *this; - // return (*this)*r; ? - } - inline Grid_simd &operator +=(const Grid_simd &r) { - *this = *this+r; - return *this; - } - inline Grid_simd &operator -=(const Grid_simd &r) { - *this = *this-r; - return *this; - } - - /////////////////////////////////////// - // Not all functions are supported - // through SIMD and must breakout to - // scalar type and back again. This - // provides support - /////////////////////////////////////// - - template friend inline Grid_simd SimdApply (const functor &func,const Grid_simd &v) { - Grid_simd ret; - Grid_simd::conv_t conv; - - conv.v = v.v; - for(int i=0;i friend inline Grid_simd SimdApplyBinop (const functor &func,const Grid_simd &x,const Grid_simd &y) { - Grid_simd ret; - Grid_simd::conv_t cx; - Grid_simd::conv_t cy; - - cx.v = x.v; - cy.v = y.v; - for(int i=0;i =0> - inline Grid_simd rotate(Grid_simd b,int nrot) - { - nrot = nrot % Grid_simd::Nsimd(); - Grid_simd ret; - // std::cout << "Rotate Real by "< =0> - inline Grid_simd rotate(Grid_simd b,int nrot) - { - nrot = nrot % Grid_simd::Nsimd(); - Grid_simd ret; - // std::cout << "Rotate Complex by "< =0> inline void rotate( Grid_simd &ret,Grid_simd b,int nrot) @@ -379,218 +223,551 @@ namespace Grid { ret.v = unary(a, VsplatSIMD()); } ////////////////////////// +======= + Grid_simd &operator=(const Grid_simd &&rhs) { + v = rhs.v; + return *this; + }; + Grid_simd &operator=(const Grid_simd &rhs) { + v = rhs.v; + return *this; + }; // faster than not declaring it and leaving to the compiler + Grid_simd() = default; + Grid_simd(const Grid_simd &rhs) : v(rhs.v){}; // compiles in movaps + Grid_simd(const Grid_simd &&rhs) : v(rhs.v){}; + + ///////////////////////////// + // Constructors + ///////////////////////////// + Grid_simd &operator=(Zero &z) { + vzero(*this); + return (*this); + } + + // Enable if complex type + template + Grid_simd(const typename std::enable_if::value, S>::type a) { + vsplat(*this, a); + }; + + Grid_simd(const Real a) { vsplat(*this, Scalar_type(a)); }; +>>>>>>> 8b9301a74cde2f28a321baf4bca854d950585b56 /////////////////////////////////////////////// - // Initialise to 1,0,i for the correct types + // mac, mult, sub, add, adj /////////////////////////////////////////////// - // For complex types - template = 0 > inline void vone(Grid_simd &ret) { vsplat(ret,S(1.0,0.0)); } - template = 0 > inline void vzero(Grid_simd &ret) { vsplat(ret,S(0.0,0.0)); }// use xor? - template = 0 > inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,S(0.0,1.0));} - template = 0 > inline void visign(Grid_simd &ret){ vsplat(ret,S(1.0,-1.0));} - template = 0 > inline void vrsign(Grid_simd &ret){ vsplat(ret,S(-1.0,1.0));} - - // if not complex overload here - template = 0 > inline void vone (Grid_simd &ret){ vsplat(ret,S(1.0)); } - template = 0 > inline void vzero(Grid_simd &ret){ vsplat(ret,S(0.0)); } - - // For integral types - template = 0 > inline void vone(Grid_simd &ret) {vsplat(ret,1); } - template = 0 > inline void vzero(Grid_simd &ret) {vsplat(ret,0); } - template = 0 > inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} - template = 0 > inline void vfalse(Grid_simd &ret){vsplat(ret,0);} - - template inline void zeroit(Grid_simd &z){ vzero(z);} - - /////////////////////// - // Vstream - /////////////////////// - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - binary((S *)&out.v, in.v, VstreamSIMD()); - } - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - typedef typename S::value_type T; - binary((T *)&out.v, in.v, VstreamSIMD()); - } - - template = 0 > - inline void vstream(Grid_simd &out,const Grid_simd &in){ - out=in; - } - - //////////////////////////////////// - // Arithmetic operator overloads +,-,* - //////////////////////////////////// - template inline Grid_simd operator + (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v, b.v, SumSIMD()); - return ret; - }; - - template inline Grid_simd operator - (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v, b.v, SubSIMD()); - return ret; - }; - - // Distinguish between complex types and others - template = 0 > inline Grid_simd operator * (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v,b.v, MultComplexSIMD()); - return ret; + // FIXME -- alias this to an inline MAC struct. + friend inline void mac(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ a, + const Grid_simd *__restrict__ x) { + *y = (*a) * (*x) + (*y); }; - // Real/Integer types - template = 0 > inline Grid_simd operator * (Grid_simd a, Grid_simd b) { - Grid_simd ret; - ret.v = binary(a.v,b.v, MultSIMD()); - return ret; + friend inline void mult(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) * (*r); + } + friend inline void sub(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) + (*r); + } + + friend inline void mac(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ a, + const Grid_simd *__restrict__ x) { + *y = (*a) * (*x) + (*y); }; - - - /////////////////////// - // Conjugate - /////////////////////// - template = 0 > - inline Grid_simd conjugate(const Grid_simd &in){ - Grid_simd ret ; - ret.v = unary(in.v, ConjSIMD()); - return ret; + friend inline void mult(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) * (*r); } - template = 0 > inline Grid_simd conjugate(const Grid_simd &in){ - return in; // for real objects + friend inline void sub(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Scalar_type *__restrict__ l, + const Grid_simd *__restrict__ r) { + *y = (*l) + (*r); + } + + friend inline void mac(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ a, + const Scalar_type *__restrict__ x) { + *y = (*a) * (*x) + (*y); + }; + friend inline void mult(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) * (*r); + } + friend inline void sub(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) - (*r); + } + friend inline void add(Grid_simd *__restrict__ y, + const Grid_simd *__restrict__ l, + const Scalar_type *__restrict__ r) { + *y = (*l) + (*r); + } + + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// + friend inline void vset(Grid_simd &ret, Scalar_type *a) { + ret.v = unary(a, VsetSIMD()); } - //Suppress adj for integer types... // odd; why conjugate above but not adj?? - template < class S, class V, IfNotInteger = 0 > - inline Grid_simd adj(const Grid_simd &in){ return conjugate(in); } - /////////////////////// - // timesMinusI + // Vstore /////////////////////// - template = 0 > - inline void timesMinusI( Grid_simd &ret,const Grid_simd &in){ - ret.v = binary(in.v, ret.v, TimesMinusISIMD()); + friend inline void vstore(const Grid_simd &ret, Scalar_type *a) { + binary(ret.v, (Real *)a, VstoreSIMD()); } - template = 0 > - inline Grid_simd timesMinusI(const Grid_simd &in){ - Grid_simd ret; - timesMinusI(ret,in); + /////////////////////// + // Vprefetch + /////////////////////// + friend inline void vprefetch(const Grid_simd &v) { + prefetch_HINT_T0((const char *)&v.v); + } + + /////////////////////// + // Reduce + /////////////////////// + friend inline Scalar_type Reduce(const Grid_simd &in) { + return unary(in.v, ReduceSIMD()); + } + + //////////////////////////// + // opreator scalar * simd + //////////////////////////// + friend inline Grid_simd operator*(const Scalar_type &a, Grid_simd b) { + Grid_simd va; + vsplat(va, a); + return va * b; + } + friend inline Grid_simd operator*(Grid_simd b, const Scalar_type &a) { + return a * b; + } + + /////////////////////// + // Unary negation + /////////////////////// + friend inline Grid_simd operator-(const Grid_simd &r) { + Grid_simd ret; + vzero(ret); + ret = ret - r; return ret; } - - template = 0 > - inline Grid_simd timesMinusI(const Grid_simd &in){ - return in; + // *=,+=,-= operators + inline Grid_simd &operator*=(const Grid_simd &r) { + *this = (*this) * r; + return *this; + // return (*this)*r; ? + } + inline Grid_simd &operator+=(const Grid_simd &r) { + *this = *this + r; + return *this; + } + inline Grid_simd &operator-=(const Grid_simd &r) { + *this = *this - r; + return *this; } - /////////////////////// - // timesI - /////////////////////// - template = 0 > - inline void timesI(Grid_simd &ret,const Grid_simd &in){ - ret.v = binary(in.v, ret.v, TimesISIMD()); - } - - template = 0 > - inline Grid_simd timesI(const Grid_simd &in){ - Grid_simd ret; - timesI(ret,in); - return ret; - } + /////////////////////////////////////// + // Not all functions are supported + // through SIMD and must breakout to + // scalar type and back again. This + // provides support + /////////////////////////////////////// - template = 0 > - inline Grid_simd timesI(const Grid_simd &in){ - return in; - } + template + friend inline Grid_simd SimdApply(const functor &func, const Grid_simd &v) { + Grid_simd ret; + Grid_simd::conv_t conv; - ///////////////////// - // Inner, outer - ///////////////////// - - template - inline Grid_simd< S, V> innerProduct(const Grid_simd< S, V> & l, const Grid_simd< S, V> & r) - { - return conjugate(l)*r; - } - - template - inline Grid_simd< S, V> outerProduct(const Grid_simd< S, V> &l, const Grid_simd< S, V> & r) - { - return l*conjugate(r); - } - - template - inline Grid_simd< S, V> trace(const Grid_simd< S, V> &arg){ - return arg; - } - - - //////////////////////////////////////////////////////////// - // copy/splat complex real parts into real; - // insert real into complex and zero imag; - //////////////////////////////////////////////////////////// - - //real = toReal( complex ) - template = 0> - inline Grid_simd toReal(const Grid_simd,V> &in) - { - typedef Grid_simd simd; - simd ret; - typename simd::conv_t conv; - conv.v = in.v; - for(int i=0;i = 0 > // must be a real arg - inline Grid_simd,V> toComplex (const Grid_simd &in) - { - typedef Grid_simd Rsimd; - typedef Grid_simd,V> Csimd; - typename Rsimd::conv_t conv;// address as real - - conv.v = in.v; - for(int i=0;i + friend inline Grid_simd SimdApplyBinop(const functor &func, + const Grid_simd &x, + const Grid_simd &y) { + Grid_simd ret; + Grid_simd::conv_t cx; + Grid_simd::conv_t cy; + + cx.v = x.v; + cy.v = y.v; + for (int i = 0; i < Nsimd(); i++) { + cx.s[i] = func(cx.s[i], cy.s[i]); } - Csimd ret; - ret.v = conv.v; + ret.v = cx.v; return ret; } - /////////////////////////////// - // Define available types - /////////////////////////////// - typedef Grid_simd< float , SIMD_Ftype > vRealF; - typedef Grid_simd< double , SIMD_Dtype > vRealD; - typedef Grid_simd< std::complex< float > , SIMD_Ftype > vComplexF; - typedef Grid_simd< std::complex< double >, SIMD_Dtype > vComplexD; - typedef Grid_simd< Integer , SIMD_Itype > vInteger; + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// + friend inline void permute0(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute0(b.v); + } + friend inline void permute1(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute1(b.v); + } + friend inline void permute2(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute2(b.v); + } + friend inline void permute3(Grid_simd &y, Grid_simd b) { + y.v = Optimization::Permute::Permute3(b.v); + } + friend inline void permute(Grid_simd &y, Grid_simd b, int perm) { + if (perm & RotateBit) { + int dist = perm & 0xF; + y = rotate(b, dist); + return; + } + switch (perm) { + case 3: + permute3(y, b); + break; + case 2: + permute2(y, b); + break; + case 1: + permute1(y, b); + break; + case 0: + permute0(y, b); + break; + default: + assert(0); + } + } - ///////////////////////////////////////// - // Some traits to recognise the types - ///////////////////////////////////////// - template struct is_simd : public std::false_type{}; - template <> struct is_simd : public std::true_type {}; - template <> struct is_simd : public std::true_type {}; - template <> struct is_simd: public std::true_type {}; - template <> struct is_simd: public std::true_type {}; - template <> struct is_simd : public std::true_type {}; +}; // end of Grid_simd class definition - template using IfSimd = Invoke::value,int> > ; - template using IfNotSimd = Invoke::value,unsigned> > ; +//////////////////////////////////////////////////////////////////// +// General rotate +//////////////////////////////////////////////////////////////////// +template = 0> +inline Grid_simd rotate(Grid_simd b, int nrot) { + nrot = nrot % Grid_simd::Nsimd(); + Grid_simd ret; + // std::cout << "Rotate Real by "< = 0> +inline Grid_simd rotate(Grid_simd b, int nrot) { + nrot = nrot % Grid_simd::Nsimd(); + Grid_simd ret; + // std::cout << "Rotate Complex by "< = 0, class ABtype> +inline void vsplat(Grid_simd &ret, ABtype a, ABtype b) { + ret.v = binary(a, b, VsplatSIMD()); +} + +// overload if complex +template +inline void vsplat(Grid_simd &ret, EnableIf, S> c) { + vsplat(ret, real(c), imag(c)); +} + +// if real fill with a, if complex fill with a in the real part (first function +// above) +template +inline void vsplat(Grid_simd &ret, NotEnableIf, S> a) { + ret.v = unary(a, VsplatSIMD()); +} +////////////////////////// + +/////////////////////////////////////////////// +// Initialise to 1,0,i for the correct types +/////////////////////////////////////////////// +// For complex types +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, S(1.0, 0.0)); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, S(0.0, 0.0)); +} // use xor? +template = 0> +inline void vcomplex_i(Grid_simd &ret) { + vsplat(ret, S(0.0, 1.0)); +} + +template = 0> +inline void visign(Grid_simd &ret) { + vsplat(ret, S(1.0, -1.0)); +} +template = 0> +inline void vrsign(Grid_simd &ret) { + vsplat(ret, S(-1.0, 1.0)); +} + +// if not complex overload here +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, S(1.0)); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, S(0.0)); +} + +// For integral types +template = 0> +inline void vone(Grid_simd &ret) { + vsplat(ret, 1); +} +template = 0> +inline void vzero(Grid_simd &ret) { + vsplat(ret, 0); +} +template = 0> +inline void vtrue(Grid_simd &ret) { + vsplat(ret, 0xFFFFFFFF); +} +template = 0> +inline void vfalse(Grid_simd &ret) { + vsplat(ret, 0); +} + +template +inline void zeroit(Grid_simd &z) { + vzero(z); +} + +/////////////////////// +// Vstream +/////////////////////// +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + binary((S *)&out.v, in.v, VstreamSIMD()); +} +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + typedef typename S::value_type T; + binary((T *)&out.v, in.v, VstreamSIMD()); +} + +template = 0> +inline void vstream(Grid_simd &out, const Grid_simd &in) { + out = in; +} + +//////////////////////////////////// +// Arithmetic operator overloads +,-,* +//////////////////////////////////// +template +inline Grid_simd operator+(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, SumSIMD()); + return ret; +}; + +template +inline Grid_simd operator-(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, SubSIMD()); + return ret; +}; + +// Distinguish between complex types and others +template = 0> +inline Grid_simd operator*(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, MultComplexSIMD()); + return ret; +}; + +// Real/Integer types +template = 0> +inline Grid_simd operator*(Grid_simd a, Grid_simd b) { + Grid_simd ret; + ret.v = binary(a.v, b.v, MultSIMD()); + return ret; +}; + +/////////////////////// +// Conjugate +/////////////////////// +template = 0> +inline Grid_simd conjugate(const Grid_simd &in) { + Grid_simd ret; + ret.v = unary(in.v, ConjSIMD()); + return ret; +} +template = 0> +inline Grid_simd conjugate(const Grid_simd &in) { + return in; // for real objects +} + +// Suppress adj for integer types... // odd; why conjugate above but not adj?? +template = 0> +inline Grid_simd adj(const Grid_simd &in) { + return conjugate(in); +} + +/////////////////////// +// timesMinusI +/////////////////////// +template = 0> +inline void timesMinusI(Grid_simd &ret, const Grid_simd &in) { + ret.v = binary(in.v, ret.v, TimesMinusISIMD()); +} + +template = 0> +inline Grid_simd timesMinusI(const Grid_simd &in) { + Grid_simd ret; + timesMinusI(ret, in); + return ret; +} + +template = 0> +inline Grid_simd timesMinusI(const Grid_simd &in) { + return in; +} + +/////////////////////// +// timesI +/////////////////////// +template = 0> +inline void timesI(Grid_simd &ret, const Grid_simd &in) { + ret.v = binary(in.v, ret.v, TimesISIMD()); +} + +template = 0> +inline Grid_simd timesI(const Grid_simd &in) { + Grid_simd ret; + timesI(ret, in); + return ret; +} + +template = 0> +inline Grid_simd timesI(const Grid_simd &in) { + return in; +} + +///////////////////// +// Inner, outer +///////////////////// + +template +inline Grid_simd innerProduct(const Grid_simd &l, + const Grid_simd &r) { + return conjugate(l) * r; +} + +template +inline Grid_simd outerProduct(const Grid_simd &l, + const Grid_simd &r) { + return l * conjugate(r); +} + +template +inline Grid_simd trace(const Grid_simd &arg) { + return arg; +} + +//////////////////////////////////////////////////////////// +// copy/splat complex real parts into real; +// insert real into complex and zero imag; +//////////////////////////////////////////////////////////// + +// real = toReal( complex ) +template = 0> +inline Grid_simd toReal(const Grid_simd, V> &in) { + typedef Grid_simd simd; + simd ret; + typename simd::conv_t conv; + conv.v = in.v; // copy the vector content (bytewise) + for (int i = 0; i < simd::Nsimd(); i += 2) { + conv.s[i + 1] = conv.s[i]; // duplicate (r,r);(r,r);(r,r); etc... + } + ret.v = conv.v; + return ret; +} + +// complex = toComplex( real ) +template = 0> // must be a real arg +inline Grid_simd, V> toComplex(const Grid_simd &in) { + typedef Grid_simd Rsimd; + typedef Grid_simd, V> Csimd; + typename Rsimd::conv_t conv; // address as real + + conv.v = in.v; + for (int i = 0; i < Rsimd::Nsimd(); i += 2) { + assert(conv.s[i + 1] == + conv.s[i]); // trap any cases where real was not duplicated + // indicating the SIMD grids of real and imag assignment did not correctly + // match + conv.s[i + 1] = 0.0; // zero imaginary parts + } + Csimd ret; + ret.v = conv.v; + return ret; +} + +/////////////////////////////// +// Define available types +/////////////////////////////// +typedef Grid_simd vRealF; +typedef Grid_simd vRealD; +typedef Grid_simd, SIMD_Ftype> vComplexF; +typedef Grid_simd, SIMD_Dtype> vComplexD; +typedef Grid_simd vInteger; + +///////////////////////////////////////// +// Some traits to recognise the types +///////////////////////////////////////// +template +struct is_simd : public std::false_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; +template <> +struct is_simd : public std::true_type {}; + +template +using IfSimd = Invoke::value, int> >; +template +using IfNotSimd = Invoke::value, unsigned> >; } #endif diff --git a/lib/simd/Grid_vector_unops.h b/lib/simd/Grid_vector_unops.h index dd523817..a67f4e7d 100644 --- a/lib/simd/Grid_vector_unops.h +++ b/lib/simd/Grid_vector_unops.h @@ -1,227 +1,234 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/simd/Grid_vector_unops.h +Source file: ./lib/simd/Grid_vector_unops.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: neo Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_VECTOR_UNOPS #define GRID_VECTOR_UNOPS #include -namespace Grid { +namespace Grid { - template struct SqrtRealFunctor { - scalar operator()(const scalar &a) const { - return sqrt(real(a)); - } - }; +template +struct SqrtRealFunctor { + scalar operator()(const scalar &a) const { return sqrt(real(a)); } +}; - template struct RSqrtRealFunctor { - scalar operator()(const scalar &a) const { - return scalar(1.0/sqrt(real(a))); - } - }; +template +struct RSqrtRealFunctor { + scalar operator()(const scalar &a) const { + return scalar(1.0 / sqrt(real(a))); + } +}; - template struct CosRealFunctor { - scalar operator()(const scalar &a) const { - return cos(real(a)); - } - }; +template +struct CosRealFunctor { + scalar operator()(const scalar &a) const { return cos(real(a)); } +}; - template struct SinRealFunctor { - scalar operator()(const scalar &a) const { - return sin(real(a)); - } - }; +template +struct SinRealFunctor { + scalar operator()(const scalar &a) const { return sin(real(a)); } +}; - template struct LogRealFunctor { - scalar operator()(const scalar &a) const { - return log(real(a)); - } - }; +template +struct AcosRealFunctor { + scalar operator()(const scalar &a) const { return acos(real(a)); } +}; - template struct ExpRealFunctor { - scalar operator()(const scalar &a) const { - return exp(real(a)); - } - }; - template struct NotFunctor { - scalar operator()(const scalar &a) const { - return (!a); - } - }; - template struct AbsRealFunctor { - scalar operator()(const scalar &a) const { - return std::abs(real(a)); - } - }; +template +struct AsinRealFunctor { + scalar operator()(const scalar &a) const { return asin(real(a)); } +}; - template struct PowRealFunctor { - double y; - PowRealFunctor(double _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return pow(real(a),y); - } - }; +template +struct LogRealFunctor { + scalar operator()(const scalar &a) const { return log(real(a)); } +}; - template struct ModIntFunctor { - Integer y; - ModIntFunctor(Integer _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return Integer(a)%y; - } - }; +template +struct ExpRealFunctor { + scalar operator()(const scalar &a) const { return exp(real(a)); } +}; +template +struct NotFunctor { + scalar operator()(const scalar &a) const { return (!a); } +}; +template +struct AbsRealFunctor { + scalar operator()(const scalar &a) const { return std::abs(real(a)); } +}; - template struct DivIntFunctor { - Integer y; - DivIntFunctor(Integer _y) : y(_y) {}; - scalar operator()(const scalar &a) const { - return Integer(a)/y; - } - }; +template +struct PowRealFunctor { + double y; + PowRealFunctor(double _y) : y(_y){}; + scalar operator()(const scalar &a) const { return pow(real(a), y); } +}; - template struct RealFunctor { - scalar operator()(const scalar &a) const { - return real(a); - } - }; - template struct ImagFunctor { - scalar operator()(const scalar &a) const { - return imag(a); - } - }; - template < class S, class V > - inline Grid_simd real(const Grid_simd &r) { - return SimdApply(RealFunctor(),r); - } - template < class S, class V > - inline Grid_simd imag(const Grid_simd &r) { - return SimdApply(ImagFunctor(),r); - } +template +struct ModIntFunctor { + Integer y; + ModIntFunctor(Integer _y) : y(_y){}; + scalar operator()(const scalar &a) const { return Integer(a) % y; } +}; - template < class S, class V > - inline Grid_simd sqrt(const Grid_simd &r) { - return SimdApply(SqrtRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd rsqrt(const Grid_simd &r) { - return SimdApply(RSqrtRealFunctor(),r); - } - template < class Scalar > - inline Scalar rsqrt(const Scalar &r) { - return (RSqrtRealFunctor(),r); - } +template +struct DivIntFunctor { + Integer y; + DivIntFunctor(Integer _y) : y(_y){}; + scalar operator()(const scalar &a) const { return Integer(a) / y; } +}; - template < class S, class V > - inline Grid_simd cos(const Grid_simd &r) { - return SimdApply(CosRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd sin(const Grid_simd &r) { - return SimdApply(SinRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd log(const Grid_simd &r) { - return SimdApply(LogRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd abs(const Grid_simd &r) { - return SimdApply(AbsRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd exp(const Grid_simd &r) { - return SimdApply(ExpRealFunctor(),r); - } - template < class S, class V > - inline Grid_simd Not(const Grid_simd &r) { - return SimdApply(NotFunctor(),r); - } - template < class S, class V > - inline Grid_simd pow(const Grid_simd &r,double y) { - return SimdApply(PowRealFunctor(y),r); - } - template < class S, class V > - inline Grid_simd mod(const Grid_simd &r,Integer y) { - return SimdApply(ModIntFunctor(y),r); - } - template < class S, class V > - inline Grid_simd div(const Grid_simd &r,Integer y) { - return SimdApply(DivIntFunctor(y),r); - } - //////////////////////////////////////////////////////////////////////////// - // Allows us to assign into **conformable** real vectors from complex - //////////////////////////////////////////////////////////////////////////// - // template < class S, class V > - // inline auto ComplexRemove(const Grid_simd &c) -> Grid_simd::Real,V> { - // Grid_simd::Real,V> ret; - // ret.v = c.v; - // return ret; - // } - template struct AndFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x & y; - } - }; - template struct OrFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x | y; - } - }; - template struct AndAndFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x && y; - } - }; - template struct OrOrFunctor { - scalar operator()(const scalar &x, const scalar &y) const { - return x || y; - } - }; +template +struct RealFunctor { + scalar operator()(const scalar &a) const { return std::real(a); } +}; +template +struct ImagFunctor { + scalar operator()(const scalar &a) const { return std::imag(a); } +}; +template +inline Grid_simd real(const Grid_simd &r) { + return SimdApply(RealFunctor(), r); +} +template +inline Grid_simd imag(const Grid_simd &r) { + return SimdApply(ImagFunctor(), r); +} +template +inline Grid_simd sqrt(const Grid_simd &r) { + return SimdApply(SqrtRealFunctor(), r); +} +template +inline Grid_simd rsqrt(const Grid_simd &r) { + return SimdApply(RSqrtRealFunctor(), r); +} +template +inline Scalar rsqrt(const Scalar &r) { + return (RSqrtRealFunctor(), r); +} - //////////////////////////////// - // Calls to simd binop functors - //////////////////////////////// - template < class S, class V > - inline Grid_simd operator &(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(AndFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator &&(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(AndAndFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator |(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(OrFunctor(),x,y); - } - template < class S, class V > - inline Grid_simd operator ||(const Grid_simd &x,const Grid_simd &y) { - return SimdApplyBinop(OrOrFunctor(),x,y); - } +template +inline Grid_simd cos(const Grid_simd &r) { + return SimdApply(CosRealFunctor(), r); +} +template +inline Grid_simd sin(const Grid_simd &r) { + return SimdApply(SinRealFunctor(), r); +} +template +inline Grid_simd acos(const Grid_simd &r) { + return SimdApply(AcosRealFunctor(), r); +} +template +inline Grid_simd asin(const Grid_simd &r) { + return SimdApply(AsinRealFunctor(), r); +} +template +inline Grid_simd log(const Grid_simd &r) { + return SimdApply(LogRealFunctor(), r); +} +template +inline Grid_simd abs(const Grid_simd &r) { + return SimdApply(AbsRealFunctor(), r); +} +template +inline Grid_simd exp(const Grid_simd &r) { + return SimdApply(ExpRealFunctor(), r); +} +template +inline Grid_simd Not(const Grid_simd &r) { + return SimdApply(NotFunctor(), r); +} +template +inline Grid_simd pow(const Grid_simd &r, double y) { + return SimdApply(PowRealFunctor(y), r); +} +template +inline Grid_simd mod(const Grid_simd &r, Integer y) { + return SimdApply(ModIntFunctor(y), r); +} +template +inline Grid_simd div(const Grid_simd &r, Integer y) { + return SimdApply(DivIntFunctor(y), r); +} +//////////////////////////////////////////////////////////////////////////// +// Allows us to assign into **conformable** real vectors from complex +//////////////////////////////////////////////////////////////////////////// +// template < class S, class V > +// inline auto ComplexRemove(const Grid_simd &c) -> +// Grid_simd::Real,V> { +// Grid_simd::Real,V> ret; +// ret.v = c.v; +// return ret; +// } +template +struct AndFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x & y; } +}; +template +struct OrFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x | y; } +}; +template +struct AndAndFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x && y; } +}; +template +struct OrOrFunctor { + scalar operator()(const scalar &x, const scalar &y) const { return x || y; } +}; +//////////////////////////////// +// Calls to simd binop functors +//////////////////////////////// +template +inline Grid_simd operator&(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(AndFunctor(), x, y); +} +template +inline Grid_simd operator&&(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(AndAndFunctor(), x, y); +} +template +inline Grid_simd operator|(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(OrFunctor(), x, y); +} +template +inline Grid_simd operator||(const Grid_simd &x, + const Grid_simd &y) { + return SimdApplyBinop(OrOrFunctor(), x, y); +} } #endif diff --git a/lib/tensors/Tensor_class.h b/lib/tensors/Tensor_class.h index 15f37115..680d0f0c 100644 --- a/lib/tensors/Tensor_class.h +++ b/lib/tensors/Tensor_class.h @@ -1,31 +1,32 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./lib/tensors/Tensor_class.h +Source file: ./lib/tensors/Tensor_class.h - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution +directory +*************************************************************************************/ +/* END LEGAL */ #ifndef GRID_MATH_TENSORS_H #define GRID_MATH_TENSORS_H @@ -38,17 +39,18 @@ namespace Grid { // It is useful to NOT have any constructors // so that these classes assert "is_pod == true" -// because then the standard C++ valarray container eliminates fill overhead on new allocation and +// because then the standard C++ valarray container eliminates fill overhead on +// new allocation and // non-move copying. // -// However note that doing this eliminates some syntactical sugar such as +// However note that doing this eliminates some syntactical sugar such as // calling the constructor explicitly or implicitly // class GridTensorBase {}; -template class iScalar -{ -public: +template +class iScalar { + public: vtype _internal; typedef vtype element; @@ -60,13 +62,14 @@ public: typedef iScalar scalar_object; // substitutes a real or complex version with same tensor structure - typedef iScalar::Complexified > Complexified; - typedef iScalar::Realified > Realified; + typedef iScalar::Complexified> Complexified; + typedef iScalar::Realified> Realified; - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; // Scalar no action - // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; + // template using tensor_reduce_level = typename + // iScalar::tensor_reduce_level >; iScalar() = default; /* iScalar(const iScalar ©me)=default; @@ -74,15 +77,17 @@ public: iScalar & operator= (const iScalar ©me) = default; iScalar & operator= (iScalar &©me) = default; */ - iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type - iScalar(const Zero &z){ *this = zero; }; + iScalar(scalar_type s) + : _internal(s){}; // recurse down and hit the constructor for vector_type + iScalar(const Zero &z) { *this = zero; }; - iScalar & operator= (const Zero &hero){ + iScalar &operator=(const Zero &hero) { zeroit(*this); return *this; } - friend strong_inline void vstream(iScalar &out,const iScalar &in){ - vstream(out._internal,in._internal); + friend strong_inline void vstream(iScalar &out, + const iScalar &in) { + vstream(out._internal, in._internal); } friend strong_inline void vbroadcast(iScalar &out,const iScalar &in,int lane){ vbroadcast(out._internal,in._internal,lane); @@ -90,73 +95,94 @@ public: friend strong_inline void zeroit(iScalar &that){ zeroit(that._internal); } - friend strong_inline void prefetch(iScalar &that){ + friend strong_inline void prefetch(iScalar &that) { prefetch(that._internal); } - friend strong_inline void permute(iScalar &out,const iScalar &in,int permutetype){ - permute(out._internal,in._internal,permutetype); + friend strong_inline void permute(iScalar &out, + const iScalar &in, int permutetype) { + permute(out._internal, in._internal, permutetype); } friend strong_inline void rotate(iScalar &out,const iScalar &in,int rot){ rotate(out._internal,in._internal,rot); } // Unary negation - friend strong_inline iScalar operator -(const iScalar &r) { + friend strong_inline iScalar operator-(const iScalar &r) { iScalar ret; - ret._internal= -r._internal; + ret._internal = -r._internal; return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - strong_inline iScalar &operator *=(const iScalar &r) { - *this = (*this)*r; + strong_inline iScalar &operator*=(const iScalar &r) { + *this = (*this) * r; return *this; } - strong_inline iScalar &operator -=(const iScalar &r) { - *this = (*this)-r; + strong_inline iScalar &operator-=(const iScalar &r) { + *this = (*this) - r; return *this; } - strong_inline iScalar &operator +=(const iScalar &r) { - *this = (*this)+r; + strong_inline iScalar &operator+=(const iScalar &r) { + *this = (*this) + r; return *this; } - strong_inline vtype & operator ()(void) { - return _internal; - } - strong_inline const vtype & operator ()(void) const { - return _internal; - } + strong_inline vtype &operator()(void) { return _internal; } + strong_inline const vtype &operator()(void) const { return _internal; } // Type casts meta programmed, must be pure scalar to match TensorRemove - template = 0,IfNotSimd = 0> operator ComplexF () const { return(TensorRemove(_internal)); }; - template = 0,IfNotSimd = 0> operator ComplexD () const { return(TensorRemove(_internal)); }; - // template = 0,IfNotSimd = 0> operator RealD () const { return(real(TensorRemove(_internal))); } - template = 0,IfNotSimd = 0> operator RealD () const { return TensorRemove(_internal); } - template = 0,IfNotSimd = 0> operator Integer () const { return Integer(TensorRemove(_internal)); } - - // convert from a something to a scalar via constructor of something arg - template::value, T>::type* = nullptr > strong_inline iScalar operator = (T arg) - { - _internal = arg; - return *this; - } + template = 0, + IfNotSimd = 0> + operator ComplexF() const { + return (TensorRemove(_internal)); + }; + template = 0, + IfNotSimd = 0> + operator ComplexD() const { + return (TensorRemove(_internal)); + }; + // template = 0,IfNotSimd = + // 0> operator RealD () const { return(real(TensorRemove(_internal))); } + template = 0, + IfNotSimd = 0> + operator RealD() const { + return TensorRemove(_internal); + } + template = 0, + IfNotSimd = 0> + operator Integer() const { + return Integer(TensorRemove(_internal)); + } - friend std::ostream& operator<< (std::ostream& stream, const iScalar &o){ - stream<< "S {"<::value, T>::type + * = nullptr> + strong_inline iScalar operator=(T arg) { + _internal = arg; + return *this; + } + + friend std::ostream &operator<<(std::ostream &stream, + const iScalar &o) { + stream << "S {" << o._internal << "}"; + return stream; + }; }; /////////////////////////////////////////////////////////// // Allows to turn scalar>>> back to double. /////////////////////////////////////////////////////////// -template strong_inline typename std::enable_if::value, T>::type TensorRemove(T arg) { return arg;} -template strong_inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) -{ +template +strong_inline typename std::enable_if::value, T>::type +TensorRemove(T arg) { + return arg; +} +template +strong_inline auto TensorRemove(iScalar arg) + -> decltype(TensorRemove(arg._internal)) { return TensorRemove(arg._internal); } - -template class iVector -{ -public: + +template +class iVector { + public: vtype _internal[N]; typedef vtype element; @@ -165,23 +191,23 @@ public: typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; typedef typename GridTypeMapper::scalar_object recurse_scalar_object; typedef iScalar tensor_reduced; - typedef iVector scalar_object; + typedef iVector scalar_object; // substitutes a real or complex version with same tensor structure - typedef iVector::Complexified,N > Complexified; - typedef iVector::Realified,N > Realified; + typedef iVector::Complexified, N> Complexified; + typedef iVector::Realified, N> Realified; - template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iVector - { - zeroit(*this); - for(int i=0;i::value, T>::type + * = nullptr> + strong_inline auto operator=(T arg) -> iVector { + zeroit(*this); + for (int i = 0; i < N; i++) _internal[i] = arg; + return *this; + } - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - iVector(const Zero &z){ *this = zero; }; - iVector() =default; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; + iVector(const Zero &z) { *this = zero; }; + iVector() = default; /* iVector(const iVector ©me)=default; iVector(iVector &©me)=default; @@ -189,23 +215,25 @@ public: iVector & operator= (iVector &©me) = default; */ - iVector & operator= (const Zero &hero){ + iVector &operator=(const Zero &hero) { zeroit(*this); return *this; } - friend strong_inline void zeroit(iVector &that){ - for(int i=0;i &that) { + for (int i = 0; i < N; i++) { zeroit(that._internal[i]); } } - friend strong_inline void prefetch(iVector &that){ - for(int i=0;i &that) { + for (int i = 0; i < N; i++) prefetch(that._internal[i]); } - friend strong_inline void vstream(iVector &out,const iVector &in){ - for(int i=0;i &out, + const iVector &in) { + for (int i = 0; i < N; i++) { + vstream(out._internal[i], in._internal[i]); } } +<<<<<<< HEAD friend strong_inline void vbroadcast(iVector &out,const iVector &in,int lane){ for(int i=0;i &out,const iVector &in,int permutetype){ for(int i=0;i &out, + const iVector &in, + int permutetype) { + for (int i = 0; i < N; i++) { + permute(out._internal[i], in._internal[i], permutetype); +>>>>>>> 8b9301a74cde2f28a321baf4bca854d950585b56 } } friend strong_inline void rotate(iVector &out,const iVector &in,int rot){ @@ -223,47 +258,44 @@ public: } // Unary negation - friend strong_inline iVector operator -(const iVector &r) { - iVector ret; - for(int i=0;i operator-(const iVector &r) { + iVector ret; + for (int i = 0; i < N; i++) ret._internal[i] = -r._internal[i]; return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - strong_inline iVector &operator *=(const iScalar &r) { - *this = (*this)*r; + strong_inline iVector &operator*=(const iScalar &r) { + *this = (*this) * r; return *this; } - strong_inline iVector &operator -=(const iVector &r) { - *this = (*this)-r; + strong_inline iVector &operator-=(const iVector &r) { + *this = (*this) - r; return *this; } - strong_inline iVector &operator +=(const iVector &r) { - *this = (*this)+r; + strong_inline iVector &operator+=(const iVector &r) { + *this = (*this) + r; return *this; } - strong_inline vtype & operator ()(int i) { - return _internal[i]; - } - strong_inline const vtype & operator ()(int i) const { - return _internal[i]; - } - friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ - stream<< "V<"<{"; - for(int i=0;i &o) { + stream << "V<" << N << ">{"; + for (int i = 0; i < N; i++) { + stream << o._internal[i]; + if (i < N - 1) stream << ","; } - stream<<"}"; + stream << "}"; return stream; }; // strong_inline vtype && operator ()(int i) { // return _internal[i]; // } }; - -template class iMatrix -{ -public: + +template +class iMatrix { + public: vtype _internal[N][N]; typedef vtype element; @@ -273,29 +305,27 @@ public: typedef typename GridTypeMapper::scalar_object recurse_scalar_object; // substitutes a real or complex version with same tensor structure - typedef iMatrix::Complexified,N > Complexified; - typedef iMatrix::Realified,N > Realified; + typedef iMatrix::Complexified, N> Complexified; + typedef iMatrix::Realified, N> Realified; // Tensure removal typedef iScalar tensor_reduced; - typedef iMatrix scalar_object; + typedef iMatrix scalar_object; - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1 }; + iMatrix(const Zero &z) { *this = zero; }; + iMatrix() = default; - iMatrix(const Zero &z){ *this = zero; }; - iMatrix() =default; - - iMatrix& operator=(const iMatrix& rhs){ - for(int i=0;i ©me)=default; @@ -304,20 +334,19 @@ public: iMatrix & operator= (iMatrix &©me) = default; */ - - - iMatrix & operator= (const Zero &hero){ + iMatrix &operator=(const Zero &hero) { zeroit(*this); return *this; } - template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iMatrix - { - zeroit(*this); - for(int i=0;i::value, T>::type + * = nullptr> + strong_inline auto operator=(T arg) -> iMatrix { + zeroit(*this); + for (int i = 0; i < N; i++) _internal[i][i] = arg; + return *this; + } +<<<<<<< HEAD friend strong_inline void zeroit(iMatrix &that){ for(int i=0;i &that) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + zeroit(that._internal[i][j]); + } + } + } + friend strong_inline void prefetch(iMatrix &that) { + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) prefetch(that._internal[i][j]); + } + friend strong_inline void vstream(iMatrix &out, + const iMatrix &in) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + vstream(out._internal[i][j], in._internal[i][j]); + } + } +>>>>>>> 8b9301a74cde2f28a321baf4bca854d950585b56 } friend strong_inline void rotate(iMatrix &out,const iMatrix &in,int rot){ for(int i=0;i &out, + const iMatrix &in, + int permutetype) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + permute(out._internal[i][j], in._internal[i][j], permutetype); + } + } + } // Unary negation - friend strong_inline iMatrix operator -(const iMatrix &r) { - iMatrix ret; - for(int i=0;i operator-(const iMatrix &r) { + iMatrix ret; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + ret._internal[i][j] = -r._internal[i][j]; + } + } return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - template - strong_inline iMatrix &operator *=(const T &r) { - *this = (*this)*r; + template + strong_inline iMatrix &operator*=(const T &r) { + *this = (*this) * r; return *this; } - template - strong_inline iMatrix &operator -=(const T &r) { - *this = (*this)-r; + template + strong_inline iMatrix &operator-=(const T &r) { + *this = (*this) - r; return *this; } - template - strong_inline iMatrix &operator +=(const T &r) { - *this = (*this)+r; + template + strong_inline iMatrix &operator+=(const T &r) { + *this = (*this) + r; return *this; } // returns an lvalue reference - strong_inline vtype & operator ()(int i,int j) { + strong_inline vtype &operator()(int i, int j) { return _internal[i][j]; } + strong_inline const vtype &operator()(int i, int j) const { return _internal[i][j]; } - strong_inline const vtype & operator ()(int i,int j) const { - return _internal[i][j]; - } - friend std::ostream& operator<< (std::ostream& stream, const iMatrix &o){ - stream<< "M<"<{"; - for(int i=0;i &o) { + stream << "M<" << N << ">{"; + for (int i = 0; i < N; i++) { + stream << "{"; + for (int j = 0; j < N; j++) { + stream << o._internal[i][j]; + if (i < N - 1) stream << ","; } - stream<<"}"; - if(i!=N-1) stream<<"\n\t\t"; + stream << "}"; + if (i != N - 1) stream << "\n\t\t"; } - stream<<"}"; + stream << "}"; return stream; }; // strong_inline vtype && operator ()(int i,int j) { // return _internal[i][j]; // } - }; -template void vprefetch(const iScalar &vv) -{ +template +void vprefetch(const iScalar &vv) { vprefetch(vv._internal); } -template void vprefetch(const iVector &vv) -{ - for(int i=0;i +void vprefetch(const iVector &vv) { + for (int i = 0; i < N; i++) { vprefetch(vv._internal[i]); } } -template void vprefetch(const iMatrix &vv) -{ - for(int i=0;i +void vprefetch(const iMatrix &vv) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + vprefetch(vv._internal[i][j]); + } + } } - - } #endif diff --git a/lib/tensors/Tensor_extract_merge.h b/lib/tensors/Tensor_extract_merge.h index ad98213d..41a431ad 100644 --- a/lib/tensors/Tensor_extract_merge.h +++ b/lib/tensors/Tensor_extract_merge.h @@ -10,6 +10,7 @@ Author: Azusa Yamaguchi Author: Peter Boyle Author: neo Author: paboyle +Author: Christopher Kelly This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -167,6 +168,33 @@ void extract(const vobj &vec,std::vector &extrac } } +//////////////////////////////////////////////////////////////////////// +// Extract to a bunch of scalar object pointers of different scalar type, with offset. Useful for precision change +//////////////////////////////////////////////////////////////////////// +template inline +void extract1(const vobj &vec,std::vector &extracted, int offset) +{ + typedef typename vobj::scalar_type vobj_scalar_type ; + typedef typename vobj::vector_type vobj_vector_type ; + + typedef typename sobj::scalar_type sobj_scalar_type ; + + static const int words=sizeof(vobj)/sizeof(vobj_vector_type); + static const int Nsimd=vobj_vector_type::Nsimd(); + + int Nextr=extracted.size(); + int s = Nsimd/Nextr; + vobj_scalar_type * vp = (vobj_scalar_type *)&vec; + + for(int w=0;w inline static - void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal,0)),N> &arg, int i) + void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal[0],0)),N> &arg, int i) { for(int ii=0;ii::pokeIndex(ret._internal[ii],arg._internal[ii],i); } } template inline static - void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal,0)),N> &arg, int i,int j) + void pokeIndex(iVector &ret, const iVector::peekIndex(ret._internal[0],0)),N> &arg, int i,int j) { for(int ii=0;ii::pokeIndex(ret._internal[ii],arg._internal[ii],i,j); @@ -161,7 +161,7 @@ class TensorIndexRecursion { } template inline static - void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal,0)),N> &arg, int i) + void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal[0][0],0)),N> &arg, int i) { for(int ii=0;ii inline static - void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal,0)),N> &arg, int i,int j) + void pokeIndex(iMatrix &ret, const iMatrix::peekIndex(ret._internal[0][0],0)),N> &arg, int i,int j) { for(int ii=0;ii Author: Peter Boyle +Author: Christopher Kelly This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -230,6 +231,35 @@ namespace Grid { static const bool value = true; }; + //Get the SIMD vector type from a Grid tensor or Lattice + template + struct getVectorType{ + typedef T type; + }; + + //Query if a tensor or Lattice is SIMD vector or scalar + template + class isSIMDvectorized{ + template + static typename std::enable_if< !std::is_same< typename GridTypeMapper::type>::scalar_type, typename GridTypeMapper::type>::vector_type>::value, char>::type test(void *); + + template + static double test(...); + + public: + enum {value = sizeof(test(0)) == sizeof(char) }; + }; + + //Get the precision of a Lattice, tensor or scalar type in units of sizeof(float) + template + class getPrecision{ + typedef typename getVectorType::type vector_obj; //get the vector_obj (i.e. a grid Tensor) if its a Lattice, do nothing otherwise (i.e. if fundamental or grid Tensor) + + typedef typename GridTypeMapper::scalar_type scalar_type; //get the associated scalar type. Works on fundamental and tensor types + typedef typename GridTypeMapper::Realified real_scalar_type; //remove any std::complex wrapper, should get us to the fundamental type + public: + enum { value = sizeof(real_scalar_type)/sizeof(float) }; + }; } #endif diff --git a/lib/tensors/Tensor_unary.h b/lib/tensors/Tensor_unary.h index 1e1f09c0..dd05a4a7 100644 --- a/lib/tensors/Tensor_unary.h +++ b/lib/tensors/Tensor_unary.h @@ -86,6 +86,8 @@ UNARY(sqrt); UNARY(rsqrt); UNARY(sin); UNARY(cos); +UNARY(asin); +UNARY(acos); UNARY(log); UNARY(exp); UNARY(abs); diff --git a/scripts/Make.inc b/scripts/Make.inc new file mode 100644 index 00000000..e1b03d56 --- /dev/null +++ b/scripts/Make.inc @@ -0,0 +1,4 @@ + +HFILES= + +CCFILES= diff --git a/scripts/copyright b/scripts/copyright index 76ed6603..92772f16 100755 --- a/scripts/copyright +++ b/scripts/copyright @@ -5,13 +5,13 @@ while (( "$#" )); do echo $1 cat > message <> message cat >> message < tmp.fil diff --git a/scripts/filelist b/scripts/filelist index d6786687..e6a7993d 100755 --- a/scripts/filelist +++ b/scripts/filelist @@ -3,7 +3,8 @@ home=`pwd` cd $home/lib -HFILES=`find . -type f -name '*.h'` +HFILES=`find . -type f -name '*.h' -not -path '*/Old/*'` +HFILES="$HFILES Config.h" CCFILES=`find . -type f -name '*.cc' -not -name '*ommunicator*.cc'` echo> Make.inc echo HFILES=$HFILES >> Make.inc diff --git a/tests/Make.inc b/tests/Make.inc index 9200ac5d..2be1afae 100644 --- a/tests/Make.inc +++ b/tests/Make.inc @@ -1,11 +1,15 @@ -bin_PROGRAMS += Test_cshift Test_simd Test_stencil +bin_PROGRAMS += Test_cshift Test_dwf_mixedcg_prec Test_simd Test_stencil Test_cshift_SOURCES=Test_cshift.cc Test_cshift_LDADD=-lGrid +Test_dwf_mixedcg_prec_SOURCES=Test_dwf_mixedcg_prec.cc +Test_dwf_mixedcg_prec_LDADD=-lGrid + + Test_simd_SOURCES=Test_simd.cc Test_simd_LDADD=-lGrid diff --git a/tests/Test_dwf_mixedcg_prec.cc b/tests/Test_dwf_mixedcg_prec.cc new file mode 100644 index 00000000..637b8141 --- /dev/null +++ b/tests/Test_dwf_mixedcg_prec.cc @@ -0,0 +1,108 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_dwf_cg_prec.cc + + Copyright (C) 2015 + +Author: Peter Boyle + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + See the full license in the file "LICENSE" in the top level distribution directory + *************************************************************************************/ + /* END LEGAL */ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + const int Ls=8; + + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexD::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); + GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + + GridCartesian * UGrid_f = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid_f = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid_f); + GridCartesian * FGrid_f = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid_f); + GridRedBlackCartesian * FrbGrid_f = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid_f); + + std::vector seeds4({1,2,3,4}); + std::vector seeds5({5,6,7,8}); + GridParallelRNG RNG5(FGrid); RNG5.SeedFixedIntegers(seeds5); + GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); + + LatticeFermionD src(FGrid); random(RNG5,src); + LatticeFermionD result(FGrid); result=zero; + LatticeGaugeFieldD Umu(UGrid); + LatticeGaugeFieldF Umu_f(UGrid_f); + + SU3::HotConfiguration(RNG4,Umu); + + precisionChange(Umu_f,Umu); + + RealD mass=0.1; + RealD M5=1.8; + DomainWallFermionD Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); + DomainWallFermionF Ddwf_f(Umu_f,*FGrid_f,*FrbGrid_f,*UGrid_f,*UrbGrid_f,mass,M5); + + LatticeFermionD src_o(FrbGrid); + LatticeFermionD result_o(FrbGrid); + LatticeFermionD result_o_2(FrbGrid); + pickCheckerboard(Odd,src_o,src); + result_o.checkerboard = Odd; + result_o = zero; + result_o_2.checkerboard = Odd; + result_o_2 = zero; + + SchurDiagMooeeOperator HermOpEO(Ddwf); + SchurDiagMooeeOperator HermOpEO_f(Ddwf_f); + + std::cout << "Starting mixed CG" << std::endl; + MixedPrecisionConjugateGradient mCG(1.0e-8, 10000, 50, FrbGrid_f, HermOpEO_f, HermOpEO); + mCG(src_o,result_o); + + std::cout << "Starting regular CG" << std::endl; + ConjugateGradient CG(1.0e-8,10000); + CG(HermOpEO,src_o,result_o_2); + + LatticeFermionD diff_o(FrbGrid); + RealD diff = axpy_norm(diff_o, -1.0, result_o, result_o_2); + + std::cout << "Diff between mixed and regular CG: " << diff << std::endl; + + + Grid_finalize(); +} diff --git a/tests/Test_simd.cc b/tests/Test_simd.cc index 59f04083..5d84b9ef 100644 --- a/tests/Test_simd.cc +++ b/tests/Test_simd.cc @@ -1,27 +1,27 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_simd.cc +Source file: ./tests/Test_simd.cc - Copyright (C) 2015 +Copyright (C) 2015 Author: Peter Boyle Author: neo - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ @@ -62,6 +62,18 @@ public: template void operator()(vec &rr,vec &i1,vec &i2) const { rr = adj(i1);} std::string name(void) const { return std::string("Adj"); } }; +class funcImag { +public: + funcImag() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = imag(i1);} + std::string name(void) const { return std::string("imag"); } +}; +class funcReal { +public: + funcReal() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = real(i1);} + std::string name(void) const { return std::string("real"); } +}; class funcTimesI { public: @@ -141,7 +153,13 @@ void Tester(const functor &func) } extract(v_result,result); - std::cout<(funcTimes()); Tester(funcConj()); Tester(funcAdj()); + Tester(funcReal()); + Tester(funcImag()); Tester(funcInnerProduct()); ReductionTester(funcReduce()); @@ -421,17 +441,21 @@ int main (int argc, char ** argv) Tester(funcTimes()); Tester(funcConj()); Tester(funcAdj()); - Tester(funcInnerProduct()); - ReductionTester(funcReduce()); + Tester(funcReal()); + Tester(funcImag()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); - std::cout<(funcPermute(i)); + for (int i = 0; (1 << i) < vComplexD::Nsimd(); i++) { + PermTester(funcPermute(i)); } diff --git a/tests/core/Test_main.cc b/tests/core/Test_main.cc index 6ede3c77..78c28539 100644 --- a/tests/core/Test_main.cc +++ b/tests/core/Test_main.cc @@ -1,613 +1,665 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_main.cc +Source file: ./tests/Test_main.cc - Copyright (C) 2015 +Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: neo Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ #include - using namespace std; using namespace Grid; using namespace Grid::QCD; /* - Grid_main.cc(232): error: no suitable user-defined conversion from "Grid::iScalar, 4>>" to "const Grid::iScalar>>" exists + Grid_main.cc(232): error: no suitable user-defined conversion from +"Grid::iScalar, 4>>" to "const +Grid::iScalar>>" exists c_m = peekIdiot(scm,1,2); */ -template auto peekIdiot(const vobj &rhs,int i,int j) -> decltype(peekIndex<2>(rhs,0,0)) -{ - return peekIndex<2>(rhs,i,j); +template +auto peekIdiot(const vobj &rhs, int i, int j) + -> decltype(peekIndex<2>(rhs, 0, 0)) { + return peekIndex<2>(rhs, i, j); } -template auto peekDumKopf(const vobj &rhs,int i,int j) -> decltype(peekIndex<3>(rhs,0,0)) -{ - return peekIndex<3>(rhs,i,j); +template +auto peekDumKopf(const vobj &rhs, int i, int j) + -> decltype(peekIndex<3>(rhs, 0, 0)) { + return peekIndex<3>(rhs, i, j); } -template auto peekDumKopf(const vobj &rhs,int i) -> decltype(peekIndex<3>(rhs,0)) -{ - return peekIndex<3>(rhs,i); +template +auto peekDumKopf(const vobj &rhs, int i) -> decltype(peekIndex<3>(rhs, 0)) { + return peekIndex<3>(rhs, i); } -int main (int argc, char ** argv) -{ - Grid_init(&argc,&argv); +int main(int argc, char **argv) { + Grid_init(&argc, &argv); - std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(4,vComplex::Nsimd()); - std::vector mpi_layout = GridDefaultMpi(); + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(4, vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); latt_size.resize(4); #ifdef AVX512 - for(int omp=128;omp<236;omp+=16){ + for (int omp = 128; omp < 236; omp += 16) { #else - for(int omp=1;omp<2;omp*=20){ + for (int omp = 1; omp < 2; omp *= 20) { #endif #ifdef OMP - omp_set_num_threads(omp); -#endif - - for(int lat=8;lat<=16;lat+=40){ - - std::cout << "Lat "< saved; - SerialRNG.GetState(saved,0); - SerialRNG1.SetState(saved,0); - - RealD dd1,dd2; - - std::cout << "Testing RNG state save restore"< iGammaFive; - ColourMatrix cmat; - - random(FineRNG,Foo); - gaussian(FineRNG,Bar); - random(FineRNG,scFoo); - random(FineRNG,scBar); - - random(FineRNG,cMat); - random(FineRNG,sMat); - random(FineRNG,scMat); - random(FineRNG,lcMat); - random(FineRNG,cVec); - random(FineRNG,sVec); - random(FineRNG,scVec); - - - fflush(stdout); - - TComplex tr = trace(cmat); - - - cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix * LatticeColourVector - sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix * LatticeSpinVector - scVec= scMat * scVec;// LatticeSpinColourVector = LatticeSpinColourMatrix * LatticeSpinColourVector - scVec= cMat * scVec; // LatticeSpinColourVector = LatticeColourMatrix * LatticeSpinColourVector - scVec= sMat * scVec; // LatticeSpinColourVector = LatticeSpinMatrix * LatticeSpinColourVector - - cMat = outerProduct(cVec,cVec); - scalar = localInnerProduct(cVec,cVec); - - cMat = Ta(cMat); //traceless antihermitian - - - scalar += scalar; - scalar -= scalar; - scalar *= scalar; - add(scalar,scalar,scalar); - sub(scalar,scalar,scalar); - mult(scalar,scalar,scalar); - - mac(scalar,scalar,scalar); - scalar = scalar+scalar; - scalar = scalar-scalar; - scalar = scalar*scalar; - - scalar=outerProduct(scalar,scalar); - - scalar=adj(scalar); - - // rscalar=real(scalar); - // iscalar=imag(scalar); - // scalar =cmplx(rscalar,iscalar); - PokeIndex(cVec,scalar,1); - - - scalar=transpose(scalar); - scalar=TransposeIndex(scalar); - scalar=TraceIndex(scalar); - scalar=PeekIndex(cVec,0); - - scalar=trace(scalar); - scalar=localInnerProduct(cVec,cVec); - scalar=localNorm2(cVec); - -// -=,+=,*=,() -// add,+,sub,-,mult,mac,* -// adj,conjugate -// real,imag -// transpose,transposeIndex -// trace,traceIndex -// peekIndex -// innerProduct,outerProduct, -// localNorm2 -// localInnerProduct - - - scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix - - - /////////////////////// - // Non-lattice (const objects) * Lattice - ColourMatrix cm; - SpinColourMatrix scm; - vSpinColourMatrix vscm; - Complex cplx(1.0); - Integer myint=1; - double mydouble=1.0; - - // vSpinColourMatrix vscm; - scMat = cMat*scMat; - scm = cm * scm; // SpinColourMatrix = ColourMatrix * SpinColourMatrix - scm = scm *cm; // SpinColourMatrix = SpinColourMartix * ColourMatrix - scm = GammaFive * scm ; // SpinColourMatrix = SpinMatrix * SpinColourMatrix - scm = scm* GammaFive ; // SpinColourMatrix = SpinColourMatrix * SpinMatrix - - scm = scm*cplx; - vscm = vscm*cplx; - scMat = scMat*cplx; - - scm = cplx*scm; - vscm = cplx*vscm; - scMat = cplx*scMat; - scm = myint*scm; - vscm = myint*vscm; - scMat = scMat*myint; - - scm = scm*mydouble; - vscm = vscm*mydouble; - scMat = scMat*mydouble; - scMat = mydouble*scMat; - cMat = mydouble*cMat; - - sMat = adj(sMat); // LatticeSpinMatrix adjoint - sMat = iGammaFive*sMat; // SpinMatrix * LatticeSpinMatrix - sMat = GammaFive*sMat; // SpinMatrix * LatticeSpinMatrix - scMat= adj(scMat); - cMat= adj(cMat); - cm=adj(cm); - scm=adj(scm); - scm=transpose(scm); - scm=transposeIndex<1>(scm); - - - random(SerialRNG, cm); - std::cout< mysite {0,0,0,0}; - random(FineRNG,cMat); - cMat = Ta(cMat); - peekSite(cm, cMat, mysite); - std::cout<::traceIndex(sc_m); // Map to traceColour - c_m = TensorIndexRecursion::traceIndex(sc_m); // map to traceSpin - - c = TensorIndexRecursion::traceIndex(s_m); - c = TensorIndexRecursion::traceIndex(c_m); - - s_m = TensorIndexRecursion::peekIndex(scm,0,0); - c_m = TensorIndexRecursion::peekIndex(scm,1,2); - // c_m = peekSpin(scm,1,2); - // c_m = peekIdiot(scm,1,2); - - printf("c. Level %d\n",c_m.TensorLevel); - printf("c. Level %d\n",c_m().TensorLevel); - printf("c. Level %d\n",c_m()().TensorLevel); - - c_m()() = scm()(0,0); //ColourComponents of CM <= ColourComponents of SpinColourMatrix - scm()(1,1) = cm()(); //ColourComponents of CM <= ColourComponents of SpinColourMatrix - c = scm()(1,1)(1,2); - scm()(1,1)(2,1) = c; - - // pokeIndex (c_m,c,0,0); - } - - FooBar = Bar; - /* - { - std::vector coor(4); - for(int d=0;d<4;d++) coor[d] = 0; - peekSite(cmat,Foo,coor); - Foo = zero; - pokeSite(cmat,Foo,coor); - } - random(Foo); - */ - lex_sites(Foo); - - - Integer mm[4]; - mm[0]=1; - mm[1]=Fine._rdimensions[0]; - mm[2]=Fine._ldimensions[0]*Fine._ldimensions[1]; - mm[3]=Fine._ldimensions[0]*Fine._ldimensions[1]*Fine._ldimensions[2]; - - LatticeInteger lex(&Fine); - lex=zero; - for(int d=0;d<4;d++){ - LatticeInteger coor(&Fine); - LatticeCoordinate(coor,d); - lex = lex + coor*mm[d]; - - } - - - - // Bar = zero; - // Bar = where(lex coor(4); - for(coor[3]=0;coor[3] saved; + SerialRNG.GetState(saved, 0); + SerialRNG1.SetState(saved, 0); + + RealD dd1, dd2; + + std::cout << "Testing RNG state save restore" << std::endl; + for (int i = 0; i < 10; i++) { + random(SerialRNG, dd1); + random(SerialRNG1, dd2); + std::cout << "i " << i << " " << dd1 << " " << dd2 << std::endl; + } + LatticeColourMatrix Foo(&Fine); + LatticeColourMatrix Bar(&Fine); + + LatticeSpinColourMatrix scFoo(&Fine); + LatticeSpinColourMatrix scBar(&Fine); + + LatticeColourMatrix Shifted(&Fine); + LatticeColourMatrix ShiftedCheck(&Fine); + LatticeColourMatrix rShifted(&rbFine); + LatticeColourMatrix bShifted(&rbFine); + + LatticeColourMatrix rFoo(&rbFine); + LatticeColourMatrix bFoo(&rbFine); + + LatticeColourMatrix FooBar(&Fine); + LatticeSpinColourMatrix scFooBar(&Fine); + + LatticeColourVector cVec(&Fine); + LatticeSpinVector sVec(&Fine); + LatticeSpinColourVector scVec(&Fine); + + LatticeColourMatrix cMat(&Fine); + LatticeSpinMatrix sMat(&Fine); + LatticeSpinColourMatrix scMat(&Fine); + + LatticeLorentzColourMatrix lcMat(&Fine); + + LatticeComplex scalar(&Fine); + LatticeReal rscalar(&Fine); + LatticeReal iscalar(&Fine); + + SpinMatrix GammaFive; + iSpinMatrix iGammaFive; + ColourMatrix cmat; + + random(FineRNG, Foo); + gaussian(FineRNG, Bar); + random(FineRNG, scFoo); + random(FineRNG, scBar); + + random(FineRNG, cMat); + random(FineRNG, sMat); + random(FineRNG, scMat); + random(FineRNG, lcMat); + random(FineRNG, cVec); + random(FineRNG, sVec); + random(FineRNG, scVec); + + fflush(stdout); + + LatticeColourMatrix newFoo = Foo; + // confirm correctness of copy constructor + Bar = Foo - newFoo; + std::cout << "Copy constructor diff check: "; + double test_cc = norm2(Bar); + if (test_cc < 1e-5){ + std::cout << "OK\n"; + } + else{ + std::cout << "fail\n"; + abort(); + } + + TComplex tr = trace(cmat); + + cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix + // * LatticeColourVector + sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix + // * LatticeSpinVector + scVec = scMat * scVec; // LatticeSpinColourVector = + // LatticeSpinColourMatrix * + // LatticeSpinColourVector + scVec = cMat * scVec; // LatticeSpinColourVector = LatticeColourMatrix + // * LatticeSpinColourVector + scVec = sMat * scVec; // LatticeSpinColourVector = LatticeSpinMatrix + // * LatticeSpinColourVector + + cMat = outerProduct(cVec, cVec); + scalar = localInnerProduct(cVec, cVec); + + cMat = Ta(cMat); // traceless antihermitian + + scalar += scalar; + scalar -= scalar; + scalar *= scalar; + add(scalar, scalar, scalar); + sub(scalar, scalar, scalar); + mult(scalar, scalar, scalar); + + mac(scalar, scalar, scalar); + scalar = scalar + scalar; + scalar = scalar - scalar; + scalar = scalar * scalar; + + scalar = outerProduct(scalar, scalar); + + scalar = adj(scalar); + + // rscalar=real(scalar); + // iscalar=imag(scalar); + // scalar =cmplx(rscalar,iscalar); + PokeIndex(cVec, scalar, 1); + + scalar = transpose(scalar); + scalar = TransposeIndex(scalar); + scalar = TraceIndex(scalar); + scalar = PeekIndex(cVec, 0); + + scalar = trace(scalar); + scalar = localInnerProduct(cVec, cVec); + scalar = localNorm2(cVec); + + // -=,+=,*=,() + // add,+,sub,-,mult,mac,* + // adj,conjugate + // real,imag + // transpose,transposeIndex + // trace,traceIndex + // peekIndex + // innerProduct,outerProduct, + // localNorm2 + // localInnerProduct + + scMat = sMat * scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix + // * LatticeSpinColourMatrix + + /////////////////////// + // Non-lattice (const objects) * Lattice + ColourMatrix cm; + SpinColourMatrix scm; + vSpinColourMatrix vscm; + Complex cplx(1.0); + Integer myint = 1; + double mydouble = 1.0; + + // vSpinColourMatrix vscm; + scMat = cMat * scMat; + scm = + cm * scm; // SpinColourMatrix = ColourMatrix * SpinColourMatrix + scm = scm * cm; // SpinColourMatrix = SpinColourMartix * ColourMatrix + scm = GammaFive * + scm; // SpinColourMatrix = SpinMatrix * SpinColourMatrix + scm = + scm * GammaFive; // SpinColourMatrix = SpinColourMatrix * SpinMatrix + + scm = scm * cplx; + vscm = vscm * cplx; + scMat = scMat * cplx; + + scm = cplx * scm; + vscm = cplx * vscm; + scMat = cplx * scMat; + scm = myint * scm; + vscm = myint * vscm; + scMat = scMat * myint; + + scm = scm * mydouble; + vscm = vscm * mydouble; + scMat = scMat * mydouble; + scMat = mydouble * scMat; + cMat = mydouble * cMat; + + sMat = adj(sMat); // LatticeSpinMatrix adjoint + sMat = iGammaFive * sMat; // SpinMatrix * LatticeSpinMatrix + sMat = GammaFive * sMat; // SpinMatrix * LatticeSpinMatrix + scMat = adj(scMat); + cMat = adj(cMat); + cm = adj(cm); + scm = adj(scm); + scm = transpose(scm); + scm = transposeIndex<1>(scm); + + random(SerialRNG, cm); + std::cout << GridLogMessage << cm << std::endl; + + cm = Ta(cm); + TComplex tracecm = trace(cm); + std::cout << GridLogMessage << cm << std::endl; + + cm = Exponentiate(cm, 2.0, 12); + std::cout << GridLogMessage << cm << " " << std::endl; + Complex det = Determinant(cm); + std::cout << GridLogMessage << "determinant: " << det << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + cm = ProjectOnGroup(cm); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + cm = ProjectOnGroup(cm); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + // det = Determinant(cm); + // std::cout< mysite{0, 0, 0, 0}; + random(FineRNG, cMat); + cMat = Ta(cMat); + peekSite(cm, cMat, mysite); + std::cout << GridLogMessage << cm << " " << std::endl; + cm = Exponentiate(cm, 1.0, 12); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + std::cout << GridLogMessage << "norm cMmat : " << norm2(cMat) + << std::endl; + cMat = expMat(cMat, ComplexD(1.0, 0.0)); + std::cout << GridLogMessage << "norm expMat: " << norm2(cMat) + << std::endl; + peekSite(cm, cMat, mysite); + std::cout << GridLogMessage << cm << " " << std::endl; + std::cout << GridLogMessage << "determinant: " << Determinant(cm) + << std::endl; + std::cout << GridLogMessage << "norm: " << norm2(cm) << std::endl; + + // LatticeComplex trlcMat(&Fine); + // trlcMat = trace(lcMat); // Trace involving iVector - now generates + // error + + { // Peek-ology and Poke-ology, with a little app-ology + Complex c; + ColourMatrix c_m; + SpinMatrix s_m; + SpinColourMatrix sc_m; + + s_m = TensorIndexRecursion::traceIndex( + sc_m); // Map to traceColour + c_m = TensorIndexRecursion::traceIndex( + sc_m); // map to traceSpin + + c = TensorIndexRecursion::traceIndex(s_m); + c = TensorIndexRecursion::traceIndex(c_m); + + s_m = TensorIndexRecursion::peekIndex(scm, 0, 0); + c_m = TensorIndexRecursion::peekIndex(scm, 1, 2); + // c_m = peekSpin(scm,1,2); + // c_m = peekIdiot(scm,1,2); + + printf("c. Level %d\n", c_m.TensorLevel); + printf("c. Level %d\n", c_m().TensorLevel); + printf("c. Level %d\n", c_m()().TensorLevel); + + c_m()() = scm()(0, 0); // ColourComponents of CM <= ColourComponents of + // SpinColourMatrix + scm()(1, 1) = cm()(); // ColourComponents of CM <= ColourComponents of + // SpinColourMatrix + c = scm()(1, 1)(1, 2); + scm()(1, 1)(2, 1) = c; + + // pokeIndex (c_m,c,0,0); + } + + FooBar = Bar; + /* + { + std::vector coor(4); + for(int d=0;d<4;d++) coor[d] = 0; + peekSite(cmat,Foo,coor); + Foo = zero; + pokeSite(cmat,Foo,coor); + } + random(Foo); + */ + lex_sites(Foo); + + Integer mm[4]; + mm[0] = 1; + mm[1] = Fine._rdimensions[0]; + mm[2] = Fine._ldimensions[0] * Fine._ldimensions[1]; + mm[3] = + Fine._ldimensions[0] * Fine._ldimensions[1] * Fine._ldimensions[2]; + + LatticeInteger lex(&Fine); + lex = zero; + for (int d = 0; d < 4; d++) { + LatticeInteger coor(&Fine); + LatticeCoordinate(coor, d); + lex = lex + coor * mm[d]; + } + + // Bar = zero; + // Bar = where(lex coor(4); + for (coor[3] = 0; coor[3] < latt_size[3] / mpi_layout[3]; coor[3]++) { + for (coor[2] = 0; coor[2] < latt_size[2] / mpi_layout[2]; coor[2]++) { + for (coor[1] = 0; coor[1] < latt_size[1] / mpi_layout[1]; + coor[1]++) { + for (coor[0] = 0; coor[0] < latt_size[0] / mpi_layout[0]; + coor[0]++) { + ColourMatrix bar; + peekSite(bar, Bar, coor); + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + // cout<<"bar "<black - rShifted = Cshift(bFoo,dir,shift); // Shift black->red - - ShiftedCheck=zero; - setCheckerboard(ShiftedCheck,bShifted); // Put them all together - setCheckerboard(ShiftedCheck,rShifted); // and check the results (later) - - // Check results - std::vector coor(4); - for(coor[3]=0;coor[3] diff; - - std::vector shiftcoor = coor; - shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%(latt_size[dir]/mpi_layout[dir]); + if (Fine.IsBoss()) { + printf("Cshift Mult: NumThread %d , Lattice size %d , %f us per call\n", + omp, lat, (t1 - t0) / ncall); + printf("Cshift Mult: NumThread %d , Lattice size %d , %f Mflop/s\n", + omp, lat, flops / (t1 - t0)); + printf("Cshift Mult: NumThread %d , Lattice size %d , %f MB/s\n", omp, + lat, bytes / (t1 - t0)); + } + // pickCheckerboard(0,rFoo,FooBar); + // pickCheckerboard(1,bFoo,FooBar); + // setCheckerboard(FooBar,rFoo); + // setCheckerboard(FooBar,bFoo); - std::vector rl(4); - for(int dd=0;dd<4;dd++){ - rl[dd] = latt_size[dd]/simd_layout[dd]/mpi_layout[dd]; - } - int lex = coor[0]%rl[0] - + (coor[1]%rl[1])*rl[0] - + (coor[2]%rl[2])*rl[0]*rl[1] - + (coor[3]%rl[3])*rl[0]*rl[1]*rl[2]; - lex += - +1000*(coor[0]/rl[0]) - +1000*(coor[1]/rl[1])*simd_layout[0] - +1000*(coor[2]/rl[2])*simd_layout[0]*simd_layout[1] - +1000*(coor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + double nrm = 0; - int lex_coor = shiftcoor[0]%rl[0] - + (shiftcoor[1]%rl[1])*rl[0] - + (shiftcoor[2]%rl[2])*rl[0]*rl[1] - + (shiftcoor[3]%rl[3])*rl[0]*rl[1]*rl[2]; - lex_coor += - +1000*(shiftcoor[0]/rl[0]) - +1000*(shiftcoor[1]/rl[1])*simd_layout[0] - +1000*(shiftcoor[2]/rl[2])*simd_layout[0]*simd_layout[1] - +1000*(shiftcoor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + LatticeColourMatrix deriv(&Fine); + double half = 0.5; + deriv = 0.5 * Cshift(Foo, 0, 1) - 0.5 * Cshift(Foo, 0, -1); - ColourMatrix foo; - ColourMatrix bar; - ColourMatrix shifted1; - ColourMatrix shifted2; - ColourMatrix shifted3; - ColourMatrix foobar1; - ColourMatrix foobar2; - ColourMatrix mdiff,amdiff; - - peekSite(shifted1,Shifted,coor); - peekSite(shifted2,Foo,shiftcoor); - peekSite(shifted3,ShiftedCheck,coor); - peekSite(foo,Foo,coor); - - mdiff = shifted1-shifted2; - amdiff=adj(mdiff); - ColourMatrix prod = amdiff*mdiff; - Complex trprod = trace(prod); - Real Ttr=real(trprod); - double nn=Ttr; - if ( nn > 0 ) - cout<<"Shift real trace fail "< 0 ) - cout<<"Shift fail (shifted1/shifted2-ref) "< 0 ) - cout<<"Shift rb fail (shifted3/shifted2-ref) "<black + rShifted = Cshift(bFoo, dir, shift); // Shift black->red + ShiftedCheck = zero; + setCheckerboard(ShiftedCheck, bShifted); // Put them all together + setCheckerboard(ShiftedCheck, + rShifted); // and check the results (later) - std::cout< coor(4); + for (coor[3] = 0; coor[3] < latt_size[3] / mpi_layout[3]; coor[3]++) { + for (coor[2] = 0; coor[2] < latt_size[2] / mpi_layout[2]; + coor[2]++) { + for (coor[1] = 0; coor[1] < latt_size[1] / mpi_layout[1]; + coor[1]++) { + for (coor[0] = 0; coor[0] < latt_size[0] / mpi_layout[0]; + coor[0]++) { + std::complex diff; + + std::vector shiftcoor = coor; + shiftcoor[dir] = (shiftcoor[dir] + shift + latt_size[dir]) % + (latt_size[dir] / mpi_layout[dir]); + + std::vector rl(4); + for (int dd = 0; dd < 4; dd++) { + rl[dd] = latt_size[dd] / simd_layout[dd] / mpi_layout[dd]; + } + int lex = coor[0] % rl[0] + (coor[1] % rl[1]) * rl[0] + + (coor[2] % rl[2]) * rl[0] * rl[1] + + (coor[3] % rl[3]) * rl[0] * rl[1] * rl[2]; + lex += +1000 * (coor[0] / rl[0]) + + 1000 * (coor[1] / rl[1]) * simd_layout[0] + + 1000 * (coor[2] / rl[2]) * simd_layout[0] * + simd_layout[1] + + 1000 * (coor[3] / rl[3]) * simd_layout[0] * + simd_layout[1] * simd_layout[2]; + + int lex_coor = shiftcoor[0] % rl[0] + + (shiftcoor[1] % rl[1]) * rl[0] + + (shiftcoor[2] % rl[2]) * rl[0] * rl[1] + + (shiftcoor[3] % rl[3]) * rl[0] * rl[1] * rl[2]; + lex_coor += +1000 * (shiftcoor[0] / rl[0]) + + 1000 * (shiftcoor[1] / rl[1]) * simd_layout[0] + + 1000 * (shiftcoor[2] / rl[2]) * simd_layout[0] * + simd_layout[1] + + 1000 * (shiftcoor[3] / rl[3]) * simd_layout[0] * + simd_layout[1] * simd_layout[2]; + + ColourMatrix foo; + ColourMatrix bar; + ColourMatrix shifted1; + ColourMatrix shifted2; + ColourMatrix shifted3; + ColourMatrix foobar1; + ColourMatrix foobar2; + ColourMatrix mdiff, amdiff; + + peekSite(shifted1, Shifted, coor); + peekSite(shifted2, Foo, shiftcoor); + peekSite(shifted3, ShiftedCheck, coor); + peekSite(foo, Foo, coor); + + mdiff = shifted1 - shifted2; + amdiff = adj(mdiff); + ColourMatrix prod = amdiff * mdiff; + Complex trprod = trace(prod); + Real Ttr = real(trprod); + double nn = Ttr; + if (nn > 0) + cout << "Shift real trace fail " << coor[0] << coor[1] + << coor[2] << coor[3] << endl; + + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + diff = shifted1()()(r, c) - shifted2()()(r, c); + nn = real(conjugate(diff) * diff); + if (nn > 0) + cout << "Shift fail (shifted1/shifted2-ref) " << coor[0] + << coor[1] << coor[2] << coor[3] << " " + << shifted1()()(r, c) << " " << shifted2()()(r, c) + << " " << foo()()(r, c) << " lex expect " + << lex_coor << " lex " << lex << endl; + else if (0) + cout << "Shift pass 1vs2 " << coor[0] << coor[1] + << coor[2] << coor[3] << " " << shifted1()()(r, c) + << " " << shifted2()()(r, c) << " " + << foo()()(r, c) << " lex expect " << lex_coor + << " lex " << lex << endl; + } + } + + for (int r = 0; r < 3; r++) { + for (int c = 0; c < 3; c++) { + diff = shifted3()()(r, c) - shifted2()()(r, c); + nn = real(conjugate(diff) * diff); + if (nn > 0) + cout << "Shift rb fail (shifted3/shifted2-ref) " + << coor[0] << coor[1] << coor[2] << coor[3] << " " + << shifted3()()(r, c) << " " << shifted2()()(r, c) + << " " << foo()()(r, c) << " lex expect " + << lex_coor << " lex " << lex << endl; + else if (0) + cout << "Shift rb pass 3vs2 " << coor[0] << coor[1] + << coor[2] << coor[3] << " " << shifted3()()(r, c) + << " " << shifted2()()(r, c) << " " + << foo()()(r, c) << " lex expect " << lex_coor + << " lex " << lex << endl; + } + } + peekSite(bar, Bar, coor); + + peekSite(foobar1, FooBar, coor); + foobar2 = foo * bar; + for (int r = 0; r < Nc; r++) { + for (int c = 0; c < Nc; c++) { + diff = foobar2()()(r, c) - foobar1()()(r, c); + nrm = nrm + real(conjugate(diff) * diff); + } + } + } + } + } + } + if (Fine.IsBoss()) { + std::cout << GridLogMessage + << "LatticeColorMatrix * LatticeColorMatrix nrm diff = " + << nrm << std::endl; + } + } + } + + } // loop for lat + } // loop for omp + + /* + // Testing Smearing routine compilation, separate in a different file + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + Smear_APE< PeriodicGimplR > APEsmearing; // periodic gauge implemetation + Smear_Stout< PeriodicGimplR > StoutSmearing(&APEsmearing); + SmearedConfiguration< PeriodicGimplR > SmartConf(&Fine, 3, StoutSmearing); + + std::cout< CG(1.0e-8,10000); TwoFlavourEvenOddPseudoFermionAction Nf2(FermOp,CG,CG); - + + //Set smearing (true/false), default: false + Nf2.is_smeared=false; + //Collect actions ActionLevel Level1(1); Level1.push_back(&Nf2); diff --git a/tests/hmc/Test_hmc_EOWilsonRatio.cc b/tests/hmc/Test_hmc_EOWilsonRatio.cc index ffee37f9..3cf81f4c 100644 --- a/tests/hmc/Test_hmc_EOWilsonRatio.cc +++ b/tests/hmc/Test_hmc_EOWilsonRatio.cc @@ -66,6 +66,9 @@ public: ConjugateGradient CG(1.0e-8,10000); TwoFlavourEvenOddRatioPseudoFermionAction Nf2(NumOp, DenOp,CG,CG); + //Set smearing (true/false), default: false + Nf2.is_smeared=true; + //Collect actions ActionLevel Level1; Level1.push_back(&Nf2); diff --git a/tests/hmc/Test_hmc_WilsonFermionGauge.cc b/tests/hmc/Test_hmc_WilsonFermionGauge.cc index c87ce3a0..5c641ee7 100644 --- a/tests/hmc/Test_hmc_WilsonFermionGauge.cc +++ b/tests/hmc/Test_hmc_WilsonFermionGauge.cc @@ -67,6 +67,10 @@ public: TwoFlavourPseudoFermionAction Nf2(FermOp,CG,CG); + //Set smearing (true/false), default: false + Nf2.is_smeared = true; + + //Collect actions ActionLevel Level1(1); Level1.push_back(&Nf2); diff --git a/tests/hmc/Test_hmc_WilsonRatio.cc b/tests/hmc/Test_hmc_WilsonRatio.cc index b2bbf7ea..4bbbfa24 100644 --- a/tests/hmc/Test_hmc_WilsonRatio.cc +++ b/tests/hmc/Test_hmc_WilsonRatio.cc @@ -65,6 +65,9 @@ public: ConjugateGradient CG(1.0e-8,10000); TwoFlavourRatioPseudoFermionAction Nf2(NumOp, DenOp,CG,CG); + + //Set smearing (true/false), default: false + Nf2.is_smeared=true; //Collect actions ActionLevel Level1; diff --git a/tests/hmc/Test_rhmc_EOWilson1p1.cc b/tests/hmc/Test_rhmc_EOWilson1p1.cc index ef70409e..b8605d55 100644 --- a/tests/hmc/Test_rhmc_EOWilson1p1.cc +++ b/tests/hmc/Test_rhmc_EOWilson1p1.cc @@ -1,97 +1,99 @@ - /************************************************************************************* +/************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid +Grid physics library, www.github.com/paboyle/Grid - Source file: ./tests/Test_rhmc_EOWilson1p1.cc +Source file: ./tests/Test_rhmc_EOWilson1p1.cc - Copyright (C) 2015 +Copyright (C) 2015 Author: Peter Boyle Author: paboyle - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - See the full license in the file "LICENSE" in the top level distribution directory - *************************************************************************************/ - /* END LEGAL */ +See the full license in the file "LICENSE" in the top level distribution directory +*************************************************************************************/ +/* END LEGAL */ #include using namespace std; using namespace Grid; using namespace Grid::QCD; -namespace Grid { - namespace QCD { - +namespace Grid { +namespace QCD { class HmcRunner : public NerscHmcRunner { -public: - - void BuildTheAction (int argc, char **argv) + public: + void BuildTheAction(int argc, char **argv) { typedef WilsonImplR ImplPolicy; typedef WilsonFermionR FermionAction; typedef typename FermionAction::FermionField FermionField; - UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); + UGrid = SpaceTimeGrid::makeFourDimGrid( + GridDefaultLatt(), GridDefaultSimd(Nd, vComplex::Nsimd()), + GridDefaultMpi()); UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); - - FGrid = UGrid; + + FGrid = UGrid; FrbGrid = UrbGrid; // temporarily need a gauge field - LatticeGaugeField U(UGrid); + LatticeGaugeField U(UGrid); // Gauge action WilsonGaugeActionR Waction(5.6); - Real mass=-0.77; - FermionAction FermOp(U,*FGrid,*FrbGrid,mass); + Real mass = -0.77; + FermionAction FermOp(U, *FGrid, *FrbGrid, mass); // 1+1 flavour - OneFlavourRationalParams Params(1.0e-4,64.0,1000,1.0e-6); - OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1a(FermOp,Params); - OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1b(FermOp,Params); + OneFlavourRationalParams Params(1.0e-4, 64.0, 2000, 1.0e-6); + OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1a( + FermOp, Params); + OneFlavourEvenOddRationalPseudoFermionAction WilsonNf1b( + FermOp, Params); - //Collect actions + //Smearing on/off + WilsonNf1a.is_smeared = true; + WilsonNf1b.is_smeared = true; + + // Collect actions ActionLevel Level1; Level1.push_back(&WilsonNf1a); Level1.push_back(&WilsonNf1b); Level1.push_back(&Waction); - + TheAction.push_back(Level1); - Run(argc,argv); + Run(argc, argv); }; - }; - -}} - -int main (int argc, char ** argv) -{ - Grid_init(&argc,&argv); - - int threads = GridThread::GetThreads(); - std::cout< WilsonNf1a(FermOp,Params); OneFlavourRationalPseudoFermionAction WilsonNf1b(FermOp,Params); + //Set smearing (true/false), default: false + WilsonNf1a.is_smeared=false; + WilsonNf1b.is_smeared=false; + //Collect actions ActionLevel Level1; Level1.push_back(&WilsonNf1a);