NWChem/contrib/mapointer_test/fix_include_files
Yuri Victorovich 7b3d60dce7 Fix bash shebangs: make /usr/bin/env find bash in paths
This is needed on FreeBSD and other systems where bash isn't located in /bin/bash.
2021-11-07 14:06:22 -08:00

116 lines
4.4 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# $Id$
#
# We have introduced a macro MAPOINTER to explicitly define the Fortran
# data type for an MA/GA index. On 64-bit platforms these indeces need to be
# of type integer*8, whereas on 32-bit platforms these need to be integer*4.
# The reason for this is that the MA library allocates memory returning offsets
# with respect to arrays in a common block. These offsets are computed from the
# difference of 2 C-language pointers. The corresponding Fortran data types
# must be large enough to hold the resulting integer values.
#
# When this whole operation is done NWChem will be using 2 different kinds of
# integers. Explicitly declared integers (either integer*8 or integer*4) for
# the MA indeces and default type integers for everything else. The problem with
# this is that mistakes will be hard to detect unless we get some help from the
# compiler.
#
# With Fortran90 compiler help is easily organized with interface blocks.
# However, we do not want to force the whole code to become Fortran90 forever.
# So we do not want include the interface blocks permanently in the GA include
# files.
#
# This script looks for the appropriate GA include files and modifies them to
# include the interface blocks we need to ensure we have the index data types
# right. Running this script requires a subsequence "make realclean" to ensure
# that GA regenerates all its include files (the files we will change are
# typically files that will be pre-processed to generate the real include
# files). Hopefully, with this tool in place the transition will be smooth
# (famous last words...).
#
# Huub van Dam, July 30, 2012.
#
if [ ${#DEV_GA} -ne 0 ] ; then
export MAFDECLS=../../src/tools/ga-dev/ma/mafdecls.fh.in
export GLOBAL=../../src/tools/ga-dev/global/src/global.fh.in
elif [ ${#OLD_GA} -ne 0 ] ; then
export MAFDECLS=../../src/tools/ga-4-3/ma/mafdecls.fh
export MAFDECLS2=../../src/tools/ma/mafdecls.fh
export MAFDECLS3=../../src/tools/include/mafdecls.fh
export GLOBAL=../../src/tools/ga-4-3/global/src/global.fh
elif [ ${#EXP_GA} -ne 0 ] ; then
export MAFDECLS=../../src/tools/ga-exp1/ma/mafdecls.fh.in
export GLOBAL=../../src/tools/ga-exp1/global/src/global.fh.in
else
export MAFDECLS=../../src/tools/ga-5-1/ma/mafdecls.fh.in
export GLOBAL=../../src/tools/ga-5-1/global/src/global.fh.in
fi
#
# Do the MA include file
#
grep interface ${MAFDECLS}
status=$?
if [ ${status} -ne 0 ] ; then
grep -i -v ma_alloc_get ${MAFDECLS} | grep -i -v ma_get_index | grep -i -v ma_push_get > /tmp/mafdecls.$$
if [ ${#OLD_GA} -ne 0 ] ; then
echo "#define MAPOINTER Integer" >> /tmp/mafdecls.$$
echo "#define MA_ACCESS_INDEX_TYPE Integer" >> /tmp/mafdecls.$$
fi
cat << EOF >> /tmp/mafdecls.$$
interface
logical function MA_alloc_get(itype,n,name,handle,index)
integer itype, n, handle
character*(*) name
MA_ACCESS_INDEX_TYPE index
end function MA_alloc_get
logical function MA_get_index(handle,index)
integer handle
MA_ACCESS_INDEX_TYPE index
end function MA_get_index
logical function MA_push_get(itype,n,name,handle,index)
integer itype, n, handle
character*(*) name
MA_ACCESS_INDEX_TYPE index
end function MA_push_get
end interface
EOF
mv /tmp/mafdecls.$$ ${MAFDECLS}
if [ ${#OLD_GA} -ne 0 ] ; then
# With OLD_GA there are multiple versions mafdecls in multiple places
# so rather than figuring out what gets used when and how we just clobber
# all versions of the include file that we know of.
if [ -f ${MAFDECLS2} ] ; then
cp ${MAFDECLS} ${MAFDECLS2}
# else
# The file does not exist so we cannot clobber it.
fi
if [ -f ${MAFDECLS3} ] ; then
cp ${MAFDECLS} ${MAFDECLS3}
# else
# The file does not exist so we cannot clobber it.
fi
fi
fi
#
# Do the GA include file
#
grep interface ${GLOBAL}
status=$?
if [ ${status} -ne 0 ] ; then
if [ ${#OLD_GA} -ne 0 ] ; then
echo "#define GA_ACCESS_INDEX_TYPE Integer" >> ${GLOBAL}
fi
cat << EOF >> ${GLOBAL}
interface
subroutine GA_access(g_a,ilo,ihi,jlo,jhi,index,ld)
integer g_a,ilo,ihi,jlo,jhi,ld
GA_ACCESS_INDEX_TYPE index
end subroutine GA_access
subroutine NGA_access(g_a,lo,hi,index,ld)
integer g_a,lo(:),hi(:),ld(:)
GA_ACCESS_INDEX_TYPE index
end subroutine NGA_access
end interface
EOF
fi