###############################################################################
#
# Top level Makefile
#
# Last modified:  March 11, 1995
#
###############################################################################

###############################################################################
#
# Default definitions
#
#   A           The extension for libraries (see LIBS).
#   ALL         Which test programs to make based on runtime libraries:
#                    testc* (a complex*8 data program)
#                    testd* (a real*8 data program)
#                    tests* (a real*4 data program)
#                    testz* (a complex*16 data program), where * is one of
#                         b     BLAS version
#                         e     IBM ESSL version
#                         n     NAG version
#   AR          What object file archiver to use.
#   BLASLIB     What BLAS library to use.
#   CC          What C compiler to use.
#   CFLAGS      The flags for the C compiler.
#   CLOCK       Extra files for machines without standard timers.
#   ESSLLIB     What ESSL library to use.
#   F77         What Fortran compiler to use.
#   F90ISM      Do we use Fortran-90 style pfblas or not?
#   FFLAGS      The flags for the Fortran compiler.
#   LFLAGS      The flags for the linker.
#   LIBDIRS     What directories to look through besides the default ones.
#   LIBS        Which libraries to make:
#                    gemmwb.a   BLAS or Cray SciLib
#                    gemmwe.a   IBM ESSL
#                    gemmwn.a   NAG
#   LINKER      What linker to use; typically the same as CC or F77.
#   MAKE        Which make program; on a Sequent, use the GNU make program.
#   NAGLIB      What NAG library to use.
#   RANLIB      The archive file symbol processor.
#   RAT         The extended ratfor preprocessor.
#   RATFLAGS    The flags used to generate the .f files from the .rat ones.
#   SHELL       Always use the Bourne (or Korn) shell, not csh or tcsh.
#
###############################################################################

  A =           a
  ALL =         testcb testdb testsb testzb
  AR =          ar cr
  BLASLIB =     -lblas
  CC =          cc
  CFLAGS =      -O
  CLOCK =
  ESSLLIB =     -lessl
  F77 =         f77
  F90ISM =
  FFLAGS =      -O
  LFLAGS =      $(FFLAGS)
  LIBDIRS =     -L.
  LIBS =        gemmwb.$(A)
  LINKER =      $(F77)
  MAKE =        make
  NAGLIB =      -lnag
  RANLIB =      ranlib
  RAT =         echo
  SHELL =       /bin/sh

# ALL =         testcb testce testcn testdb testde testdn \
#               testsb testse testsn  testzb testze testzn 
# LFLAGS =      $(CFLAGS)
# LIBS =        gemmwb.$(A) gemmwe.$(A) gemmwn.$(A)
# LINKER =      $(CC)
# RAT =         rat
# RATFLAGS =    -c -i4 -l2000

###############################################################################
#
# Definitions for doing nothing
#
###############################################################################

  ECHO =        "Sorry, but you need to choose a system to make"

###############################################################################
#
# Definitions for Cray-2
#
###############################################################################

# ECHO =        "Cray-2"
# BLASLIB =     -lsci
# CFLAGS =      -O -DFortNames_Cap -Dmindim=128 -DUse_GEMUL3
# CLOCK =       second.o urand.o
# F77 =         cf77
# F90ISM =      90
# FFLAGS =      -Zp
# LFLAGS =      $(FFLAGS)
# LINKER =      $(F77)
# NAGLIB =      -lnag14
# RANLIB =      echo

###############################################################################
#
# Definitions for Cray YMP
#
###############################################################################

# ECHO =        "Cray YMP"
# BLASLIB =     -lsci
# CFLAGS =      -O -DFortNames_Cap -Dmindim=64 -DUse_GEMUL3
# CLOCK =       second.o urand.o
# F77 =         cf77
# F90ISM =      90
# FFLAGS =      -Zp
# LFLAGS =      $(FFLAGS)
# LINKER =      $(F77)
# NAGLIB =      -lnag14
# RANLIB =      echo

###############################################################################
#
# Definitions for Cray C90
# With more than 8 processors, change mindim to 256.
#
###############################################################################

# ECHO =        "Cray C90"
# BLASLIB =     -lsci
# CFLAGS =      -O -DFortNames_Cap -Dmindim=128 -DUse_GEMUL3
# CLOCK =       second.o urand.o
# F77 =         cf77
# F90ISM =      90
# FFLAGS =      -Zp
# LFLAGS =      $(FFLAGS)
# LINKER =      $(F77)
# NAGLIB =      -lnag14
# RANLIB =      echo

###############################################################################
#
# Definitions for DEC Alpha Workstation running Ultrix
# You must already have a compiled copy of the BLAS from netlib.
#
###############################################################################

# ECHO =        "DEC Alpha Workstation"
# BLASLIB =     -lblas
# CLOCK =       second.o urand.o
# ESSLLIB =
# FFLAGS =      -O
# CFLAGS =      -O -DUse_GEMMWH_YUK -DFortNames_Under
# LFLAGS =

###############################################################################
#
# Definitions for DEC 5000 Workstation running Ultrix
# You must already have a compiled copy of the BLAS from netlib.
#
###############################################################################

# ECHO =        "DEC 5000 Workstation"
# BLASLIB =     -lblas
# CLOCK =       second.o urand.o
# ESSLLIB =
# F77 =         cc
# FFLAGS =
# CFLAGS =      -DUse_GEMMWH_YUK -DFortNames_Under -DUse_GEMUL3
# LFLAGS =
# LINKER =      $(F77)

###############################################################################
#
# Definitions for HP
#
###############################################################################

# ECHO =        "HP9000 HPUX"
# BLASLIB =     libblas.a
# CFLAGS =      -O -DUrand_Rand -DUse_GEMMWH_YUK -DUse_GEMUL3
# CLOCK =       second.o urand.o
# ESSLLIB =
# FFLAGS =      -O
# LIBDIRS =
# RANLIB =      echo

###############################################################################
#
# Definitions for IBM AIX370
#
###############################################################################

# ECHO =        "AIX370"
# BLASLIB =     -lblas
# CFLAGS =      -O -DFortNames_Under -DUse_GEMMWH_YUK -DUse_GEMUL3
# CLOCK =       second.o urand.o
# ESSLLIB =     -lesslv
# F77 =         fvs
# FFLAGS =      -f'opt(3) vector'
# LFLAGS =
# LINKER =      $(F77)
# RANLIB =      ranlib

###############################################################################
#
# Definitions for IBM RISC System/6000
#
###############################################################################

# ECHO =        "IBM RISC System/6000"
# CLOCK =       second.o urand.o
# F77 =         xlf
# FFLAGS =      -O -g
# CFLAGS =      -O -g -DUse_GEMUL3
# LFLAGS =      -g
# LINKER =      $(F77)

###############################################################################
#
# Definitions for Sequent
# You must already have a compiled copy of the BLAS from netlib.
#
###############################################################################

# ECHO =        "Sequent"
# BLASLIB =     -lblas -lf -lisam
# F77 =         fortran
# FFLAGS =      -O
# CC =          gcc
# CFLAGS =      -DFortNames_Under -DUse_GEMUL3
# CLOCK =       second.o urand.o clock.o
# ESSLLIB =
# LFLAGS =
# LIBDIRS =     -L. -L/usr/xltr/fortran/2.1/lib/ucb
# LINKER =      $(CC)

###############################################################################
#
# Definitions for Silicon Graphics Indigo
# You must already have a compiled copy of the BLAS from netlib.
#
###############################################################################

# ECHO =        "Silicon Graphics Indigo (MIPS 4000)"
# AR =          ar crs
# BLASLIB =     -lblas
# CC =          cc
# CFLAGS =      -mips2 -O -DFortNames_Under -DUse_GEMUL3
# CLOCK =       second.o urand.o
# ESSLLIB =
# FFLAGS =      -mips2 -O -sopt
# LFLAGS =
# LINKER =      $(F77)
# NAGLIB =      -lnag
# RANLIB =      echo

###############################################################################
#
# Definitions for SUN Sparcs
# You must already have a compiled copy of the BLAS from netlib.
#
###############################################################################

# ECHO =        "SUN Sparc Architecture"
# BLASLIB =     -lblas
# CC =          cc
# CFLAGS =      -fast -O3 -DFortNames_Under -DUse_GEMMWH_YUK -DUse_GEMUL3
# CLOCK =       second.o urand.o
# ESSLLIB =
# FFLAGS =      -fast -O3
# F77 =         f77
# LFLAGS =
# LINKER =      $(F77)

###############################################################################
#
# Variations on two test programs:  
#       testc* (a complex*8 data program)
#       testd* (a real*8 data program)
#       tests* (a real*4 data program)
#       testz* (a complex*16 data program), where * is one of
#            b      BLAS version
#            e      IBM ESSL version
#            n      NAG version
#
###############################################################################

# all:	testcb testce testcn testdb testde testdn \
#	testsb testse testsn  testzb testze testzn 
all:	$(ALL)

testcb:	$(LIBS) testc.o $(CLOCK)
	$(LINKER) -o testcb $(LFLAGS) testc.o $(CLOCK) gemmwb.$(A) $(LIBDIRS) $(BLASLIB)

testce:	$(LIBS) testc.o $(CLOCK)
	$(LINKER) -o testce $(LFLAGS) testc.o $(CLOCK) gemmwe.$(A) $(LIBDIRS) $(ESSLLIB)

testcn:	$(LIBS) testc.o $(CLOCK)
	$(LINKER) -o testcn $(LFLAGS) testc.o $(CLOCK) gemmwn.$(A) $(LIBDIRS) $(NAGLIB)

testdb:	$(LIBS) testd.o $(CLOCK)
	$(LINKER) -o testdb $(LFLAGS) testd.o $(CLOCK) gemmwb.$(A) $(LIBDIRS) $(BLASLIB)

testde:	$(LIBS) testd.o $(CLOCK)
	$(LINKER) -o testde $(LFLAGS) testd.o $(CLOCK) gemmwe.$(A) $(LIBDIRS) $(ESSLLIB)

testdn:	$(LIBS) testd.o $(CLOCK)
	$(LINKER) -o testdn $(LFLAGS) testd.o $(CLOCK) gemmwn.$(A) $(LIBDIRS) $(NAGLIB)

testsb:	$(LIBS) tests.o $(CLOCK)
	$(LINKER) -o testsb $(LFLAGS) tests.o $(CLOCK) gemmwb.$(A) $(LIBDIRS) $(BLASLIB)

testse:	$(LIBS) tests.o $(CLOCK)
	$(LINKER) -o testse $(LFLAGS) tests.o $(CLOCK) gemmwe.$(A) $(LIBDIRS) $(ESSLLIB)

testsn:	$(LIBS) tests.o $(CLOCK)
	$(LINKER) -o testsn $(LFLAGS) tests.o $(CLOCK) gemmwn.$(A) $(LIBDIRS) $(NAGLIB)

testzb:	$(LIBS) testz.o $(CLOCK)
	$(LINKER) -o testzb $(LFLAGS) testz.o $(CLOCK) gemmwb.$(A) $(LIBDIRS) $(BLASLIB)

testze:	$(LIBS) testz.o $(CLOCK)
	$(LINKER) -o testze $(LFLAGS) testz.o $(CLOCK) gemmwe.$(A) $(LIBDIRS) $(ESSLLIB)

testzn:	$(LIBS) testz.o $(CLOCK)
	$(LINKER) -o testzn $(LFLAGS) testz.o $(CLOCK) gemmwn.$(A) $(LIBDIRS) $(NAGLIB)

testc.o:	testc.f
	$(F77) -c $(FFLAGS) testc.f

testd.o:	testd.f
	$(F77) -c $(FFLAGS) testd.f

tests.o:	tests.f
	$(F77) -c $(FFLAGS) tests.f

testz.o:	testz.f
	$(F77) -c $(FFLAGS) testz.f

clock.o:	clock.c
	$(CC) -c $(CFLAGS) clock.c

second.o:	second.c
	$(CC) -c $(CFLAGS) second.c

urand.o:	urand.c
	$(CC) -c $(CFLAGS) urand.c

###############################################################################
#
# Try to run all of the programs produced by "make all" before
#
###############################################################################

runem2:
	@ echo "Single precision real tests"
	- testsb
	- testse
	- testsn
	@ echo "Double precision real tests"
	- testdb
	- testde
	- testdn
	@ echo "Single precision complex tests"
	- testcb
	- testce
	- testcn
	@ echo "Double precision complex tests"
	- testzb
	- testze
	- testzn

###############################################################################
#
# Make a set of libraries
#
###############################################################################

libs:	$(LIBS)
	@echo Just made the $(ECHO) version of $(LIBS)
	touch cgemmw.o dgemmw.o sgemmw.o zgemmw.o \
		gemul3$(F90ISM).o gemul3n$(F90ISM).o pfblas$(F90ISM).o winolap.o
	rm    cgemmw.o dgemmw.o sgemmw.o zgemmw.o pfblas$(F90ISM).o \
		gemul3$(F90ISM).o gemul3n$(F90ISM).o winolap.o

pfblas$(F90ISM).o:	pfblas$(F90ISM).f
	$(F77) -c $(FFLAGS) pfblas$(F90ISM).f

winolap.o:	winolap.c

gemul3$(F90ISM).o:	gemul3$(F90ISM).f
	$(F77) -c $(FFLAGS) gemul3$(F90ISM).f

gemmwb.$(A):	pfblas$(F90ISM).o gemul3$(F90ISM).o winolap.o
	@echo Making the $(ECHO) version of gemmwb.$(A)
	$(CC) $(CFLAGS) -DLibrary_BLAS -DFLOAT_TYPE=1 -c gemmw.c
	mv gemmw.o dgemmw.o
	$(CC) $(CFLAGS) -DLibrary_BLAS -DFLOAT_TYPE=2 -c gemmw.c
	mv gemmw.o sgemmw.o
	$(CC) $(CFLAGS) -DLibrary_BLAS -DFLOAT_TYPE=3 -c gemmw.c
	mv gemmw.o zgemmw.o
	$(CC) $(CFLAGS) -DLibrary_BLAS -DFLOAT_TYPE=4 -c gemmw.c
	mv gemmw.o cgemmw.o
	$(AR) gemmwb.$(A) cgemmw.o dgemmw.o sgemmw.o zgemmw.o \
		gemul3$(F90ISM).o pfblas$(F90ISM).o winolap.o
	$(RANLIB) gemmwb.$(A)

gemmwe.$(A):	pfblas$(F90ISM).o gemul3$(F90ISM).o winolap.o
	@echo Making the $(ECHO) version of gemmwe.$(A)
	$(CC) $(CFLAGS) -DLibrary_ESSL -DFLOAT_TYPE=1 -c gemmw.c
	mv gemmw.o dgemmw.o
	$(CC) $(CFLAGS) -DLibrary_ESSL -DFLOAT_TYPE=2 -c gemmw.c
	mv gemmw.o sgemmw.o
	$(CC) $(CFLAGS) -DLibrary_ESSL -DFLOAT_TYPE=3 -c gemmw.c
	mv gemmw.o zgemmw.o
	$(CC) $(CFLAGS) -DLibrary_ESSL -DFLOAT_TYPE=4 -c gemmw.c
	mv gemmw.o cgemmw.o
	$(AR) gemmwe.$(A) cgemmw.o dgemmw.o sgemmw.o zgemmw.o \
		gemul3$(F90ISM).o pfblas$(F90ISM).o winolap.o
	$(RANLIB) gemmwe.$(A)

gemmwn.$(A):	pfblas$(F90ISM).o gemul3n$(F90ISM).o winolap.o
	@echo Making the $(ECHO) version of gemmwn.$(A)
	$(CC) $(CFLAGS) -DLibrary_NAG -DFLOAT_TYPE=1 -c gemmw.c
	mv gemmw.o dgemmw.o
	$(CC) $(CFLAGS) -DLibrary_NAG -DFLOAT_TYPE=2 -c gemmw.c
	mv gemmw.o sgemmw.o
	$(CC) $(CFLAGS) -DLibrary_NAG -DFLOAT_TYPE=3 -c gemmw.c
	mv gemmw.o zgemmw.o
	$(CC) $(CFLAGS) -DLibrary_NAG -DFLOAT_TYPE=4 -c gemmw.c
	mv gemmw.o cgemmw.o
	$(AR) gemmwn.$(A) cgemmw.o dgemmw.o sgemmw.o zgemmw.o \
		gemul3n$(F90ISM).o pfblas$(F90ISM).o winolap.o
	$(RANLIB) gemmwn.$(A)

###############################################################################
#
# Poor Folk's BLAS extensions:
#
#       _yax        y = alpha * x   (x,y vectors and alpha a scalar)
#       _geadd      C = A + B       (A,B,C matrices)
#       _gesub      C = A - B       (A,B,C matrices)
#
# These as constructed from one principal file (pfblas.rat) with the correct
# first letter (c, d, s, z) for each data type of interest.  Twelve
# subroutines total are constructed and compiled.  Since the Ratfor code is
# processed using Craig Douglas' extended ratfor translator (not the standard
# UNIX one), it is not a good idea not to delete pfblas.f (or the equivalent).
#
# There is a special pfblas90.* version for Cray computers.
#
###############################################################################

pfblas.f:	pfblas.rat
	echo 'define(FLOAT,[complex])'            >  cpfblas.rat
	echo 'define(First,[c])'                  >> cpfblas.rat
	cat pfblas.rat                            >> cpfblas.rat
	echo 'define(FLOAT,[double[ ]precision])' >  dpfblas.rat
	echo 'define(First,[d])'                  >> dpfblas.rat
	cat pfblas.rat                            >> dpfblas.rat
	echo 'define(FLOAT,[real])'               >  spfblas.rat
	echo 'define(First,[s])'                  >> spfblas.rat
	cat pfblas.rat                            >> spfblas.rat
	echo 'define(FLOAT,[double[ ]complex])'   >  zpfblas.rat
	echo 'define(First,[z])'                  >> zpfblas.rat
	cat pfblas.rat                            >> zpfblas.rat
	$(RAT) $(RATFLAGS) cpfblas.rat
	$(RAT) $(RATFLAGS) dpfblas.rat
	$(RAT) $(RATFLAGS) spfblas.rat
	$(RAT) $(RATFLAGS) zpfblas.rat
	mv  cpfblas.f    pfblas.f
	cat dpfblas.f >> pfblas.f
	cat spfblas.f >> pfblas.f
	cat zpfblas.f >> pfblas.f
	rm cpfblas.* dpfblas.* spfblas.* zpfblas.*

pfblas90.f:	pfblas90.rat
	echo 'define(FLOAT,[complex])'            >  cpfblas90.rat
	echo 'define(First,[c])'                  >> cpfblas90.rat
	cat pfblas90.rat                          >> cpfblas90.rat
	echo 'define(FLOAT,[real])'               >  spfblas90.rat
	echo 'define(First,[s])'                  >> spfblas90.rat
	cat pfblas90.rat                          >> spfblas90.rat
	$(RAT) $(RATFLAGS) cpfblas90.rat
	$(RAT) $(RATFLAGS) spfblas90.rat
	mv  cpfblas90.f    pfblas90.f
	cat spfblas90.f >> pfblas90.f
	rm cpfblas90.* spfblas90.*

###############################################################################
#
# Classical matrix-matrix multiplication for complex data using the 3
# multiply instead of 4 trick.
#
#       _gemul3     C = A * B       (A,B,C matrices)
#
# These as constructed from one principal file (gemul3.rat) with the correct
# first letter (c, z) for each data type of interest.  Two
# subroutines total are constructed and compiled.
#
# This comes in BLAS and NAG oriented flavors.
#
###############################################################################

# BLAS Fortran-77 flavor

gemul3.f:	gemul3.rat
	echo 'define(FLOAT,[real])'               >  cgemul3.rat
	echo 'define(First,[c])'                  >> cgemul3.rat
	echo 'define(VCOPY,[scopy])'              >> cgemul3.rat
	echo 'define(VYAX,[syax])'                >> cgemul3.rat
	echo 'define(MATMUL,[sgemm])'             >> cgemul3.rat
	echo 'define(MATSUB,[sgesub])'            >> cgemul3.rat
	echo 'define(MatSubArgs,'                 >> cgemul3.rat
	echo "[c, ldc2, 'N', c(m), ldc2, 'N', c, ldc2, m, n])" >> cgemul3.rat
	cat gemul3.rat                            >> cgemul3.rat
	echo 'define(FLOAT,[double[ ]precision])' >  zgemul3.rat
	echo 'define(First,[z])'                  >> zgemul3.rat
	echo 'define(VCOPY,[dcopy])'              >> zgemul3.rat
	echo 'define(VYAX,[dyax])'                >> zgemul3.rat
	echo 'define(MATMUL,[dgemm])'             >> zgemul3.rat
	echo 'define(MATSUB,[dgesub])'            >> zgemul3.rat
	echo 'define(MatSubArgs,'                 >> zgemul3.rat
	echo "[c, ldc2, 'N', c(m), ldc2, 'N', c, ldc2, m, n])" >> zgemul3.rat
	cat gemul3.rat                            >> zgemul3.rat
	$(RAT) $(RATFLAGS) cgemul3.rat
	$(RAT) $(RATFLAGS) zgemul3.rat
	mv  cgemul3.f    gemul3.f
	cat zgemul3.f >> gemul3.f
	rm cgemul3.* zgemul3.*

# BLAS Fortran-90 flavor

gemul390.f:	gemul390.rat
	echo 'define(FLOAT,[real])'               >  cgemul3.rat
	echo 'define(First,[c])'                  >> cgemul3.rat
	echo 'define(VCOPY,[scopy])'              >> cgemul3.rat
	echo 'define(VYAX,[syax])'                >> cgemul3.rat
	echo 'define(MATMUL,[sgemm])'             >> cgemul3.rat
	echo 'define(MATSUB,[sgesub])'            >> cgemul3.rat
	echo 'define(MatSubArgs,'                 >> cgemul3.rat
	echo "[c, ldc2, 'N', c(m), ldc2, 'N', c, ldc2, m, n])" >> cgemul3.rat
	cat gemul3.rat                            >> cgemul3.rat
	echo 'define(FLOAT,[double[ ]precision])' >  zgemul3.rat
	echo 'define(First,[z])'                  >> zgemul3.rat
	echo 'define(VCOPY,[dcopy])'              >> zgemul3.rat
	echo 'define(VYAX,[dyax])'                >> zgemul3.rat
	echo 'define(MATMUL,[dgemm])'             >> zgemul3.rat
	echo 'define(MATSUB,[dgesub])'            >> zgemul3.rat
	echo 'define(MatSubArgs,'                 >> zgemul3.rat
	echo "[c, ldc2, 'N', c(m), ldc2, 'N', c, ldc2, m, n])" >> zgemul3.rat
	cat gemul3.rat                            >> zgemul3.rat
	$(RAT) $(RATFLAGS) cgemul3.rat
	$(RAT) $(RATFLAGS) zgemul3.rat
	mv  cgemul3.f    gemul390.f
	cat zgemul3.f >> gemul390.f
	rm cgemul3.* zgemul3.*

# NAG Fortran-77 flavor

gemul3n.f:	gemul3.rat
	echo 'define(FLOAT,[real])'               >  cgemul3.rat
	echo 'define(First,[c])'                  >> cgemul3.rat
	echo 'define(VCOPY,[f06eff])'             >> cgemul3.rat
	echo 'define(VYAX,[f06fdf])'              >> cgemul3.rat
	echo 'define(MATMUL,[f06yaf])'            >> cgemul3.rat
	echo 'define(MATSUB,[f01ctf])'            >> cgemul3.rat
	echo 'define(MatSubArgs,'                 >> cgemul3.rat
	echo "['N', 'N', m, n, one, c, ldc2, neg1, c(m), ldc2, c,ldc2, ifail])" >> cgemul3.rat
	cat gemul3.rat                            >> cgemul3.rat
	echo 'define(FLOAT,[double[ ]precision])' >  zgemul3.rat
	echo 'define(First,[z])'                  >> zgemul3.rat
	echo 'define(VCOPY,[f06eff])'             >> zgemul3.rat
	echo 'define(VYAX,[f06fdf])'              >> zgemul3.rat
	echo 'define(MATMUL,[f06yaf])'            >> zgemul3.rat
	echo 'define(MATSUB,[f01ctf])'            >> zgemul3.rat
	echo 'define(MatSubArgs,'                 >> zgemul3.rat
	echo "['N', 'N', m, n, one, c, ldc2, neg1, c(m), ldc2, c,ldc2, ifail])" >> zgemul3.rat
	cat gemul3.rat                            >> zgemul3.rat
	$(RAT) $(RATFLAGS) cgemul3.rat
	$(RAT) $(RATFLAGS) zgemul3.rat
	mv  cgemul3.f    gemul3n.f
	cat zgemul3.f >> gemul3n.f
	rm cgemul3.* zgemul3.*

# NAG Fortran-90 flavor

gemul3n90.f:	gemul390.rat
	echo 'define(FLOAT,[real])'               >  cgemul3.rat
	echo 'define(First,[c])'                  >> cgemul3.rat
	echo 'define(VCOPY,[f06eff])'             >> cgemul3.rat
	echo 'define(VYAX,[f06fdf])'              >> cgemul3.rat
	echo 'define(MATMUL,[f06yaf])'            >> cgemul3.rat
	echo 'define(MATSUB,[f01ctf])'            >> cgemul3.rat
	echo 'define(MatSubArgs,'                 >> cgemul3.rat
	echo "['N', 'N', m, n, one, c, ldc2, neg1, c(m), ldc2, c,ldc2, ifail])" >> cgemul3.rat
	cat gemul3.rat                            >> cgemul3.rat
	echo 'define(FLOAT,[double[ ]precision])' >  zgemul3.rat
	echo 'define(First,[z])'                  >> zgemul3.rat
	echo 'define(VCOPY,[f06eff])'             >> zgemul3.rat
	echo 'define(VYAX,[f06fdf])'              >> zgemul3.rat
	echo 'define(MATMUL,[f06yaf])'            >> zgemul3.rat
	echo 'define(MATSUB,[f01ctf])'            >> zgemul3.rat
	echo 'define(MatSubArgs,'                 >> zgemul3.rat
	echo "['N', 'N', m, n, one, c, ldc2, neg1, c(m), ldc2, c,ldc2, ifail])" >> zgemul3.rat
	cat gemul3.rat                            >> zgemul3.rat
	$(RAT) $(RATFLAGS) cgemul3.rat
	$(RAT) $(RATFLAGS) zgemul3.rat
	mv  cgemul3.f    gemul3n90.f
	cat zgemul3.f >> gemul3n90.f
	rm cgemul3.* zgemul3.*

###############################################################################
#
# Make a shell archive or gzipped tar file (GNU tar)
#
###############################################################################

gemmw.shar:	veryclean
	shar Makefile README clock.c urand.c gemmw.c gemmw.h gemmwh.yuk \
		gemul3.rat gemul3.f gemul390.rat gemul390.f gemul3n.f heroux-1.f \
		pfblas.rat pfblas.f pfblas90.rat pfblas90.f second.c etime.f \
		testc.f testd.f tests.f testz.f winolap.c yale904.tex \
		testc.c testd.c tests.c testz.c \
		Runs Runs/* > .gemmw.shar
	head -`wc -l .gemmw.shar | awk '{ print $$1 - 2; }'` .gemmw.shar > gemmw.shar
	echo echo touch '*.f' >> gemmw.shar
	echo touch '*.f' >> gemmw.shar
	tail -2 .gemmw.shar >> gemmw.shar
	rm -f .gemmw.shar

gemmw.tgz:	veryclean
	tar zcvf gemmw.tgz \
		Makefile README clock.c urand.c gemmw.c gemmw.h gemmwh.yuk \
		gemul3.rat gemul3.f gemul390.rat gemul390.f gemul3n.f heroux-1.f \
		pfblas.rat pfblas.f pfblas90.rat pfblas90.f second.c etime.f \
		testc.f testd.f tests.f testz.f winolap.c yale904.tex \
		testc.c testd.c tests.c testz.c \
		Runs

###############################################################################
#
# Clean up
#
#   clean           The normal clean up process
#   veryclean       clean + remove the .a, .o, and gemmw.shar files
#   ultraclean      Do not do this.  It is commented out for a good reason.
#
###############################################################################

clean:
	touch a.out core core.lst regress regress-z $(ALL)
	rm -f a.out core *.lst    regress regress-z $(ALL)

veryclean:	clean
	touch pfblas.o gemmwb.$(A) gemmw.shar
	rm -f *.o      gemmw*.$(A) gemmw.shar

#ultraclean:	veryclean
#	  touch pmblas.f gemul3.f gemul3n.f pmblas90.f gemul390.f gemul3n90.f \
#		You_Are_Now_Up_a_Creek_without_a_Paddle.f
#	  rm -f pmblas.f gemul3.f gemul3n.f pmblas90.f gemul390.f gemul3n90.f \
#		You_Are_Now_Up_a_Creek_without_a_Paddle.f

###############################################################################
#
# End of the Makefile
#
###############################################################################
