--- MITgcm/tools/genmake2 2003/10/10 18:38:57 1.13 +++ MITgcm/tools/genmake2 2003/10/20 04:01:30 1.13.2.1 @@ -1,6 +1,6 @@ #!/bin/bash # -# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.13 2003/10/10 18:38:57 edhill Exp $ +# $Header: /home/ubuntu/mnt/e9_copy/MITgcm/tools/genmake2,v 1.13.2.1 2003/10/20 04:01:30 edhill Exp $ # # Makefile generator for MITgcm UV codes # created by cnh 03/98 @@ -332,6 +332,9 @@ IEEE=$MITGCM_IEEE fi +AUTODIFF_PKG_USED=f +AD_OPTFILE= + # The following state can be set directly by command-line switches gm_s1="OPTFILE PDEPEND PDEFAULT MAKEFILE PLATFORM ROOTDIR MODS DISABLE ENABLE NOOPT" gm_s2="FC IEEE MPI JAM DUMPSTATE STANDARDDIRS" @@ -342,7 +345,12 @@ gm_s5="TOOLSDIR SOURCEDIRS INCLUDEDIRS PWD MAKE THISHOSTNAME THISDATE MACHINE" gm_s6="EXECUTABLE EXEHOOK EXEDIR PACKAGES_CONF" -gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6" +# The following are all related to adjoint/tangent-linear stuff +gm_s7="AUTODIFF_PKG_USED AD_OPTFILE TAMC TAF DIFF_FLAGS AD_TAMC_FLAGS AD_TAF_FLAGS" +gm_s8="FTL_TAMC_FLAGS FTL_TAF_FLAGS SVD_TAMC_FLAGS SVD_TAF_FLAGS" +gm_s9="" + +gm_state="COMMANDL $gm_s1 $gm_s2 $gm_s3 $gm_s4 $gm_s5 $gm_s6 $gm_s7 $gm_s8" echo @@ -375,7 +383,6 @@ # n=$(( $n + 1 )) #done #parse_options - ac_prev= for ac_option ; do @@ -400,6 +407,11 @@ -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;; + -adoptfile | --adoptfile | -ad | --ad) + ac_prev=AD_OPTFILE ;; + -adoptfile=* | --adoptfile=* | -adof=* | --adof=*) + AD_OPTFILE=$ac_optarg ;; + -pdepend | --pdepend) ac_prev=PDEPEND ;; -pdepend=* | --pdepend=*) @@ -563,6 +575,33 @@ fi fi +echo " getting AD_OPTFILE information: " +if test "x${AD_OPTFILE}" = x ; then + if test "x$MITGCM_AD_OF" = x ; then + AD_OPTFILE=$ROOTDIR/tools/adjoint_options/adjoint_default + else + AD_OPTFILE=$MITGCM_AD_OF + fi +fi +if test "x${AD_OPTFILE}" != xNONE ; then + if test -f "$AD_OPTFILE" -a -r "$AD_OPTFILE" ; then + echo " using AD_OPTFILE=\"$AD_OPTFILE\"" + source "$AD_OPTFILE" + RETVAL=$? + if test "x$RETVAL" != x0 ; then + echo -n "Error: failed to source AD_OPTFILE \"$AD_OPTFILE\"" + echo "--please check that variable syntax is bash-compatible" + exit 1 + fi + if test "x$DUMPSTATE" != xf ; then + cp -f $AD_OPTFILE "genmake_ad_optfile" + fi + else + echo "Error: can't read AD_OPTFILE=\"$AD_OPTFILE\"" + exit 1 + fi +fi + # Check that FC, LINK, CPP, and S64 are defined. If not, complain # and abort! if test "x$FC" = x ; then @@ -838,6 +877,9 @@ if test -d $adr ; then SOURCEDIRS="$SOURCEDIRS $adr" INCLUDEDIRS="$INCLUDEDIRS $adr" + if test "x$i" = xautodiff ; then + AUTODIFF_PKG_USED=t + fi else echo "Error: the directory \"$adr\" for package $i doesn't exist" exit 1 @@ -1000,6 +1042,33 @@ done +# Here, we build the list of files to be "run through" the adjoint +# compiler. +if test -f ./ad_files ; then + rm -f ./ad_files +fi +echo " Creating the list of files for the adjoint compiler." +for i in $SOURCEDIRS . ; do + list_files=`( cd $i && ls -1 *.list 2>/dev/null )` + for j in $list_files ; do + cat $i/$j >> ad_files + done +done +cat < adjoint_sed + + sed 's/call adopen(/call adopen ( mythid,\ + \& /g + s/call adclose(/call adclose( mythid,\ + \& /g + s/call adread(/call adread ( mythid,\ + \& /g + s/call adwrite(/call adwrite( mythid,\ + \& /g' < ad_code_ad.f + +EOF +chmod +x adjoint_sed + + echo echo "=== Creating the Makefile ===" echo " setting INCLUDES" @@ -1105,6 +1174,9 @@ EXECUTABLE = \$(EXEDIR)/${EXECUTABLE} TOOLSDIR = ${TOOLSDIR} +#eh3 new defines for the adjoint work +AUTODIFF = ${ROOTDIR}/pkg/autodiff + EOF # Note: figure out some way to add Hyades JAM libraries here @@ -1154,6 +1226,7 @@ cat csrclist.inc >> $MAKEFILE cat f90srclist.inc >> $MAKEFILE cat hlist.inc >> $MAKEFILE +echo >> $MAKEFILE echo 'F77FILES = $(SRCFILES:.F=.f)' >> $MAKEFILE echo 'F90FILES = $(F90SRCFILES:.F90=.f90)' >> $MAKEFILE echo 'OBJFILES = $(SRCFILES:.F=.o) $(CSRCFILES:.c=.o) $(F90SRCFILES:.F90=.o)' >> $MAKEFILE @@ -1217,6 +1290,58 @@ .p.f: \$(KPP) \$(KFLAGS1)\$@ \$(KFLAGS2) \$< +#========================================= +#=== Automatic Differentiation Rules === + +TAMC = ${TAMC} +TAF = ${TAF} + +EOF + +ad_vars="AD_TAMC_FLAGS AD_TAF_FLAGS" +ad_vars="$ad_vars FTL_TAMC_FLAGS FTL_TAF_FLAGS" +ad_vars="$ad_vars SVD_TAMC_FLAGS SVD_TAF_FLAGS" +for i in $ad_vars ; do + name=$i + t1="t2=\$"`echo $i` + eval $t1 + printf "%-20s = " $name >> $MAKEFILE + echo $t2 >> $MAKEFILE +done + +echo " Add the source list for AD code generation" +echo >> $MAKEFILE +echo -n "AD_FILES = " >> $MAKEFILE +AD_FILES=`cat ad_files` +for i in $AD_FILES ; do + echo " \\" >> $MAKEFILE + echo -n " $i" >> $MAKEFILE +done +echo >> $MAKEFILE + +cat >>$MAKEFILE <! ad_input_code.f + \$(TAF) \$(AD_TAF_FLAGS) ad_input_code.f + ./adjoint_sed >! ad_output_code.f + @make ad_output_code.o + \$(LINK) -o \$@ \$(FFLAGS) \$(FOPTIM) \$(OBJFILES) ad_output_code.o \$(LIBS) + +EXE_FTL_TAMC = ${EXECUTABLE}_ftl_tamc +EXE_FTL_TAF = ${EXECUTABLE}_ftl_taf + +EXE_SVD_TAF = ${EXECUTABLE}_ftl_taf +EXE_BOTH_TAF = ${EXECUTABLE}_ftl_taf + +#========================================= + EOF if test "x$EXEHOOK" != x ; then