summaryrefslogtreecommitdiffstats
path: root/m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4')
-rw-r--r--m4/aclocal_fc.m4191
1 files changed, 190 insertions, 1 deletions
diff --git a/m4/aclocal_fc.m4 b/m4/aclocal_fc.m4
index 571ad43..65bb817 100644
--- a/m4/aclocal_fc.m4
+++ b/m4/aclocal_fc.m4
@@ -282,4 +282,193 @@ dnl Try link a simple MPI program.
dnl Change to the C language
AC_LANG_POP(Fortran)
])
-
+
+dnl ------------------------------------------------------
+dnl Determine the available KINDs for REALs and INTEGERs
+dnl ------------------------------------------------------
+dnl
+dnl This is a runtime test.
+dnl
+AC_DEFUN([PAC_FC_AVAIL_KINDS],[
+AC_LANG_PUSH([Fortran])
+rm -f pac_fconftest.out
+AC_RUN_IFELSE([
+ AC_LANG_SOURCE([
+ PROGRAM main
+ IMPLICIT NONE
+ INTEGER :: ik, k, lastkind
+ lastkind=SELECTED_INT_KIND(1)
+ OPEN(8, FILE="pac_fconftest.out", form="formatted")
+ WRITE(8,'("ik:")',ADVANCE='NO') ! Find integer KINDs
+ DO ik=2,30
+ k = SELECTED_INT_KIND(ik)
+ IF (k .NE. lastkind) THEN
+ WRITE(8,'(I0,A)',ADVANCE='NO') lastkind," "
+ lastkind = k
+ ENDIF
+ IF (k .LE. 0) EXIT
+ ENDDO
+ IF (k.NE.lastkind) WRITE(8,'(I0,A)',ADVANCE='NO') k, " "
+ dnl WRITE(8,'(I0,A)',ADVANCE='NO') lastkind, " "
+ WRITE(8,'(/)')
+ WRITE(8,'("rk:")',ADVANCE='NO') ! Find real KINDs
+ lastkind=SELECTED_REAL_KIND(1)
+ DO ik=2,30
+ k = SELECTED_REAL_KIND(ik)
+ IF (k .NE. lastkind) THEN
+ WRITE(8,'(I0,A)',ADVANCE='NO') lastkind," "
+ lastkind = k
+ ENDIF
+ IF (k .LE. 0) EXIT
+ ENDDO
+ dnl WRITE(8,'(I0,A)',ADVANCE='NO') lastkind, " "
+ IF (k.NE.lastkind) WRITE(8,'(I0,A)',ADVANCE='NO') k, " "
+
+ END
+ ])
+],[
+ if test -s pac_fconftest.out ; then
+
+ dnl pac_flag="`sed -e 's/ */ /g' pac_fconftest.out | tr '\012' ','`"
+ pac_validIntKinds="`sed -n -e 's/^.*ik://p' pac_fconftest.out`"
+ pac_validRealKinds="`sed -n -e 's/^.*rk://p' pac_fconftest.out`"
+ PAC_FC_ALL_INTEGER_KINDS="{`echo $pac_validIntKinds | sed -e 's/ /,/g'`}"
+ PAC_FC_ALL_REAL_KINDS="{`echo $pac_validRealKinds | sed -e 's/ /,/g'`}"
+ AC_MSG_CHECKING([for Fortran INTEGER KINDs])
+ AC_MSG_RESULT([$PAC_FC_ALL_INTEGER_KINDS])
+ AC_MSG_CHECKING([for Fortran REAL KINDs])
+ AC_MSG_RESULT([$PAC_FC_ALL_REAL_KINDS])
+ else
+ AC_MSG_RESULT([Error])
+ AC_MSG_WARN([No output from test program!])
+ fi
+ dnl rm -f pac_fconftest.out
+],[
+ AC_MSG_RESULT([Error])
+ AC_MSG_WARN([Failed to run program to determine available KINDs])
+],[
+ dnl Even when cross_compiling=yes,
+ dnl pac_validKinds needs to be set for PAC_FC_INTEGER_MODEL_MAP()
+ dnl pac_validKinds="`echo \"$2\" | tr ',' ':'`"
+ dnl AC_MSG_RESULT([$2])
+ dnl ifelse([$1],[],[PAC_FC_ALL_INTEGER_MODELS=$2],[$1=$2])
+])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_SIZEOF_INT_KINDS],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of available INTEGER KINDs])
+AC_LANG_PUSH([Fortran])
+pack_int_sizeof=""
+rm -f pac_fconftest.out
+for kind in $pac_validIntKinds; do
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([
+ program main
+ integer (kind=$kind) a
+ open(8, file="pac_fconftest.out", form="formatted")
+ write(8,'(I0)') sizeof(a)
+ close(8)
+ end
+ ])
+ ])
+ AC_RUN_IFELSE([],[
+ if test -s pac_fconftest.out ; then
+ sizes="`cat pac_fconftest.out`"
+ pack_int_sizeof="$pack_int_sizeof $sizes,"
+ else
+ AC_MSG_WARN([No output from test program!])
+ fi
+ rm -f pac_fconftest.out
+ ],[
+ AC_MSG_WARN([Fortran program fails to build or run!])
+ ],[
+ pack_int_sizeof="$2"
+ ])
+done
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF="{ $pack_int_sizeof }"
+AC_MSG_RESULT([$PAC_FC_ALL_INTEGER_KINDS_SIZEOF])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_SIZEOF_REAL_KINDS],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of available REAL KINDs])
+AC_LANG_PUSH([Fortran])
+pack_real_sizeof=""
+rm -f pac_fconftest.out
+for kind in $pac_validRealKinds; do
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([
+ program main
+ REAL (kind=$kind) :: a
+ open(8, file="pac_fconftest.out", form="formatted")
+ write(8,'(I0)') sizeof(a)
+ close(8)
+ end
+ ])
+ ])
+ AC_RUN_IFELSE([],[
+ if test -s pac_fconftest.out ; then
+ sizes="`cat pac_fconftest.out`"
+ pack_real_sizeof="$pack_real_sizeof $sizes,"
+ else
+ AC_MSG_WARN([No output from test program!])
+ fi
+ rm -f pac_fconftest.out
+ ],[
+ AC_MSG_WARN([Fortran program fails to build or run!])
+ ],[
+ pack_real_sizeof="$2"
+ ])
+done
+PAC_FC_ALL_REAL_KINDS_SIZEOF="{ $pack_real_sizeof }"
+AC_MSG_RESULT([$PAC_FC_ALL_REAL_KINDS_SIZEOF])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_NATIVE_INTEGER],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of native KINDS])
+AC_LANG_PUSH([Fortran])
+pack_int_sizeof=""
+rm -f pac_fconftest.out
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([
+ program main
+ integer a
+ real b
+ double precision c
+ open(8, file="pac_fconftest.out", form="formatted")
+ write(8,*) sizeof(a)
+ write(8,*) kind(a)
+ write(8,*) sizeof(b)
+ write(8,*) kind(b)
+ write(8,*) sizeof(c)
+ write(8,*) kind(c)
+ close(8)
+ end
+ ])
+ ])
+ AC_RUN_IFELSE([],[
+ if test -s pac_fconftest.out ; then
+ PAC_FORTRAN_NATIVE_INTEGER_KIND="`sed -n '1p' pac_fconftest.out`"
+ PAC_FORTRAN_NATIVE_INTEGER_SIZEOF="`sed -n '2p' pac_fconftest.out`"
+ PAC_FORTRAN_NATIVE_REAL_KIND="`sed -n '3p' pac_fconftest.out`"
+ PAC_FORTRAN_NATIVE_REAL_SIZEOF="`sed -n '4p' pac_fconftest.out`"
+ PAC_FORTRAN_NATIVE_DOUBLE_KIND="`sed -n '5p' pac_fconftest.out`"
+ PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF="`sed -n '6p' pac_fconftest.out`"
+ else
+ AC_MSG_WARN([No output from test program!])
+ fi
+ rm -f pac_fconftest.out
+ ],[
+ AC_MSG_WARN([Fortran program fails to build or run!])
+ ],[
+ pack_int_sizeof="$2"
+ ])
+dnl PAC_FC_ALL_INTEGER_KINDS_SIZEOF="{ $pack_int_sizeof }"
+AC_MSG_RESULT([$pack_int_sizeof])
+AC_LANG_POP([Fortran])
+])