/* for profiling make sure that Ultimod.fcm has a program statement at the top */

$#define DEBUG
##define SAW gsaw
#define SPP spp

#define CMLIBS 

/*#undef X11DISP*/

#ifdef X11DISP
#define SPPOPTS  -DX11DISP
#else
#define SPPOPTS -UX11DISP
#endif

#define FIGDIR Fig

#define CMFFLAGS -extend_source  -cmprofile -O
#define CMFFLAGS -extend_source  -O -nopad
#define CMFFLAGS -extend_source  -cmdebug -nopad -cmprofile

#define LDOPTS CMFFLAGS

#ifdef X11DISP
#define XCMLIB -lcmx_cm5_vu_sp -lXext -lXm  -lXt -lX11
#else
#define XCMLIB 
#endif

#define PRISMLIB

#define USRLIBS -lcmtiming_cm5 -lcmfcompiler_local XCMLIB PRISMLIB

#define USRCMLDOPTS -L/usr/local/seplibV2/lib

#define SEPLIB SEPCLASSLIB -lsepf -lsepCM5

#define BINDIR ../../Bin/MTYPE


#include <SEP.defs>
testit&: junk.super.rcm
	spp -C## -DSPLIT -DRHO -DISselrho <timestepN.super.rcm >junk
/*	 ./spp  -C\\#\\# <junk.super.rcm >junk*/
/*	SPp    <junk.super.rcm >junk*/


#define MAINPROG Ultimod.o 
#define SUB      sub.o  subf.o
#define TIMESTEP timestep.o timestepN.o  timestepNS.o timestepNF.o  timestepNSF.o
$#define ONEWAY   updateone.o conv1done.o fdcoeffone.o
#define ONEWAY   updateone.o fdcoeffone.o
#define FAST     conv1dc.fast.o 
#define SLOW     conv1dc.o  conv1dc.finite.o
#define WAVE     del.o getstress.o del.finite.o
#define UTIL     fdcoeff.o initcommon.o mysreed.o loadmodel.o stability.o 
#define SEISMO   seismo.o snapshot.o record.o
#define BOUNDARY expdamp.o bcstress.o bcdisp.o makeboundary.o
#define SRCES    dsrc.o ssrc.o shearsrc.o sderiv2.o
#define TWONHALF update25.o update2.o

#define SPLITS   del.split.o conv1dc.split.o

#define VISCO    sub.visco.o timestepN.visco.o  timestepNS.visco.o                                    sub.viscof.o timestepNF.visco.o  timestepNSF.visco.o
#define RHO      sub.viscorho.o timestepN.viscorho.o timestepNS.viscorho.o loaddensity.o              sub.viscorhof.o timestepNF.viscorho.o timestepNSF.viscorho.o
#define ELRHO    sub.elrho.o timestepN.elrho.o timestepNS.elrho.o                                     sub.elrhof.o timestepNF.elrho.o timestepNSF.elrho.o

#define SHASTA   timestep.flux.o shasta.o update2.flux.o update25.o 
/*#define DUFFING  sub.finite.o timestepN.duffing.o*/

/*#define FINITE   sub.finite.o del.finite.o  timestepN.finite.o conv1dc.finite.o */

#define CONV     FAST

#define OUTOFCORE writemodel.o 


#ifdef X11DISP
#define DISPLAY  display.o
#else
#define DISPLAY
#endif

/*
#define OBJS    MAINPROG SUB TIMESTEP ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF SPLITS 
*/

#define OBJS    MAINPROG SUB TIMESTEP CONV ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF SPLITS 

#define OBJS    MAINPROG SUB TIMESTEP FAST ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF SPLITS 


#define OBJSALL MAINPROG SUB TIMESTEP VISCO RHO SLOW ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF SPLITS ELRHO OUTOFCORE

#define OBJSC sub.simple.o  timestep.o timestepN.o ONEWAY del.o getstress.o  UTIL  SEISMO  BOUNDARY SRCES DISPLAY update2.o update25.o conv1dc.o

#define OBJCHEBY sub.cheby.o  timestepN.cheby.o ONEWAY del.o getstress.o  UTIL  SEISMO  BOUNDARY SRCES DISPLAY update2.o update25.o conv1dc.o


/*#define OBJDUFF MAINPROG DUFFING CONV ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF */

#define OBJFIN  MAINPROG FINITE CONV ONEWAY  WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF

#define OBJSHAS  MAINPROG CONV ONEWAY  WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY SHASTA 

#define OBJVISCO  MAINPROG VISCO CONV ONEWAY  WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF

#define OBJRHO  MAINPROG RHO CONV ONEWAY  WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF

#define LIBNAME libsepwave.a
#define LIBDIR  /r3/martin/lib/MTYPE
LIBDIR/LIBNAME lib&:
	ARCHIVE LIBDIR/LIBNAME sub.o SUB TIMESTEP VISCO RHO FAST ONEWAY WAVE UTIL  SEISMO  BOUNDARY SRCES DISPLAY TWONHALF SPLITS ELRHO


LIBDIR/libsepwave.pe.a& lib2:
	ARCHIVE LIBDIR/libsepwave.pe.a [[ sub -i X.o X.pe.o  sub.o SUB TIMESTEP VISCO RHO FAST ONEWAY WAVE UTIL  SEISMO ]]
	ARCHIVE LIBDIR/libsepwave.pe.a [[ sub -i X.o X.pe.o  BOUNDARY SRCES DISPLAY TWONHALF SPLITS ELRHO ]]

/*SPLITS TIMESTEP ONEWAY WAVE UTIL SEISMO BOUNDARY SRCES TWONHALF*/

/*
#define OBJS Ultimod.o sub.o timestep.o del.o getstress.o record.o dsrc.o update2.o expdamp.o fdcoeff.o initcommon.o bcstress.o bcdisp.o fdcoeffone.o conv1done.o updateone.o ssrc.o shearsrc.o display.o update25.o mysreed.o loadmodel.o makeboundary.o seismo.o snapshot.o stability.o sderiv2.o timestepN.o SPLITS
*/

/*Ultiduff&:  OBJDUFF*/
/*	CMFC  LDOPTS USRCMLDOPTS OBJDUFF SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultiduff*/

Ultifinite&:  OBJFIN
	CMFC  LDOPTS USRCMLDOPTS OBJFIN SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultifinite


Ultishasta&:  OBJSHAS sub.flux.o
	CMFC  LDOPTS USRCMLDOPTS OBJSHAS sub.flux.o SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultishasta


Ultivisco&:  OBJVISCO
	CMFC  LDOPTS USRCMLDOPTS OBJVISCO SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultivisco

Ultirho&:  OBJRHO
	CMFC  LDOPTS USRCMLDOPTS OBJRHO SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultirho


Ulti Ultimod&:  OBJS
	CMFC  -v LDOPTS USRCMLDOPTS OBJS SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultimod

BINDIR/Ultiall Ultiall &:  OBJSALL
	CMFC  -v LDOPTS USRCMLDOPTS OBJSALL SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultiall

Ultisimp &:  OBJSC Ultisimp.o
	CMFC  -v LDOPTS USRCMLDOPTS Ultisimp.o OBJSC SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultisimp

Ulticheby &:  OBJCHEBY
	CMFC  -v LDOPTS USRCMLDOPTS Ultisimp.o OBJCHEBY SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ulticheby


Ultifast&:  OBJS
	CMFC  LDOPTS USRCMLDOPTS OBJS SEPLIB USRLIBS XCMLIB SYSLIB -o BINDIR/Ultifast

Ultislow&:  OBJS
	CMFC  LDOPTS OBJS USRLIBS XCMLIB SEPLIB SYSLIB -o BINDIR/Ultislow


Test2.x:  Test2.o
	 CMFC  LDOPTS USRCMLDOPTS Test2.o  SEPLIB USRLIBS SYSLIB -o Test2.x
	

/*
Ultimod.o: Ultimod.f
	CMFC CMFFLAGS -c Ultimod.f

$	CMFC -c -g -db Ultimod.f
*/

#define OBJSSPLIT Ultimod.o sub.o timestep.split.o del.split.o del.o conv1dc.split.o conv1dc.o record.o dsrc.o update2.o expdamp.o fdcoeff.o initcommon.o bcstress.o bcdisp.o fdcoeffone.o updateone.o ssrc.o shearsrc.o

Ultimod.split&: OBJSSPLIT
	CMFC LDOPTS OBJSSPLIT XCMLIB SEPLIB SYSLIB -o BINDIR/Ultimod.split





Ultimod.fcm: SRCDIR/Ultimod.rs		if exist SRCDIR/Ultimod.rs
	spp -C# <SRCDIR/Ultimod.rs >Ultimod.spp
	SAW Ultimod.spp | sed "s,implicit undefined (a-z),implicit none,g" | RATFOR -C | FPP -Dsource="'"FULLSRC/Ultimod.rs"'" MACH ICAT(SRCDIR)  FIXNULL > Ultimod.fcm
	-rm Ultimod.spp

Ultimod.o: Ultimod.fcm
	CMFC -c CMFFLAGS  Ultimod.fcm

/* generate the timestep subroutines from a single source  */
/* not duffing is a switch not a preprocessor statement, since it uses no more
 memory */
#define GLOBAL -DDUFFING

/* split  */
timestepNS.rcm: timestepN.super.rcm
	spp -C## -DSPLIT -UVISCO -URHO -DISselastic GLOBAL <timestepN.super.rcm >timestepNS.rcm

timestepNS.visco.rcm: timestepN.super.rcm
	spp -C## -DSPLIT -DVISCO -URHO -DISsvisco GLOBAL <timestepN.super.rcm >timestepNS.visco.rcm

timestepNS.elrho.rcm: timestepN.super.rcm
	spp -C## -DSPLIT -DRHO -DISselrho GLOBAL <timestepN.super.rcm >timestepNS.elrho.rcm

timestepNS.viscorho.rcm: timestepN.super.rcm
	spp -C## -DSPLIT -DVISCO -DRHO -DISsviscorho GLOBAL <timestepN.super.rcm >timestepNS.viscorho.rcm

/* split  + finite */
timestepNSF.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DSPLIT -UVISCO -URHO -DISselasticf GLOBAL <timestepN.super.rcm >timestepNSF.rcm

timestepNSF.visco.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DSPLIT -DVISCO -URHO -DISsviscof GLOBAL <timestepN.super.rcm >timestepNSF.visco.rcm

timestepNSF.elrho.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DSPLIT -DRHO -DISselrhof GLOBAL <timestepN.super.rcm >timestepNSF.elrho.rcm

timestepNSF.viscorho.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DSPLIT -DVISCO -DRHO -DISsviscorhof GLOBAL <timestepN.super.rcm >timestepNSF.viscorho.rcm

/* finite */

timestepNF.rcm: timestepN.super.rcm
	spp -C## -DFINITE -UVISCO -URHO -DISelasticf GLOBAL <timestepN.super.rcm >timestepNF.rcm

timestepNF.visco.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DVISCO -URHO -DISviscof GLOBAL <timestepN.super.rcm >timestepNF.visco.rcm

timestepNF.elrho.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DRHO -DISelrhof GLOBAL <timestepN.super.rcm >timestepNF.elrho.rcm

timestepNF.viscorho.rcm: timestepN.super.rcm
	spp -C## -DFINITE -DVISCO -DRHO -DISviscorhof GLOBAL <timestepN.super.rcm >timestepNF.viscorho.rcm

/* normal */

timestepN.rcm: timestepN.super.rcm
	spp -C## -UVISCO -URHO -DISelastic GLOBAL <timestepN.super.rcm >timestepN.rcm

timestepN.visco.rcm: timestepN.super.rcm
	spp -C## -DVISCO -URHO -DISvisco GLOBAL <timestepN.super.rcm >timestepN.visco.rcm

timestepN.elrho.rcm: timestepN.super.rcm
	spp -C## -DRHO -DISelrho GLOBAL <timestepN.super.rcm >timestepN.elrho.rcm

timestepN.viscorho.rcm: timestepN.super.rcm
	spp -C## -DVISCO -DRHO -DISviscorho GLOBAL <timestepN.super.rcm >timestepN.viscorho.rcm


timestepN%.o: timestepN%.rcm
	spp < timestepN%.rcm | RATFOR -C  > timestepN%.fcm
	CMFC CMFCOPTS  -c timestepN%.fcm


sub.rcm: sub.super.rcm
	spp -C## -UVISCO -URHO -DTYPE=elastic -DISelastic  <sub.super.rcm >sub.rcm

sub.visco.rcm: sub.super.rcm
	spp -C## -DVISCO -URHO -DTYPE=visco -DISvisco <sub.super.rcm >sub.visco.rcm

sub.elrho.rcm: sub.super.rcm
	spp -C##  -DRHO -DTYPE=elrho -DISelrho <sub.super.rcm >sub.elrho.rcm

sub.viscorho.rcm: sub.super.rcm
	spp -C## -DVISCO -DRHO -DTYPE=viscorho -DISviscorho <sub.super.rcm >sub.viscorho.rcm



subf.rcm: sub.super.rcm
	spp -C## -DFINITE -UVISCO -URHO -DTYPE=elasticf -DISelasticf  <sub.super.rcm >subf.rcm

sub.viscof.rcm: sub.super.rcm
	spp -C## -DFINITE -DVISCO -URHO -DTYPE=viscof -DISviscof <sub.super.rcm >sub.viscof.rcm

sub.elrhof.rcm: sub.super.rcm
	spp -C##  -DFINITE -DRHO -DTYPE=elrhof -DISelrhof <sub.super.rcm >sub.elrhof.rcm

sub.viscorhof.rcm: sub.super.rcm
	spp -C## -DFINITE -DVISCO -DRHO -DTYPE=viscorhof -DISviscorhof <sub.super.rcm >sub.viscorhof.rcm


sub%.o: sub%.rcm
	spp -UX11DISP <sub%.rcm | RATFOR -C >sub%.fcm
	CMFC CMFCOPTS -c sub%.fcm




sepmodlib.a:  OBJS
	ARCHIVE sepmodlib.a OBJS

/*
#define OBJS Ultimod.o sub.o timestep.o conv1dc.o del.o getstress.o record.o dsrc.o update2.o expdamp.o fdcoeff.o initcommon.o bcstress.o bcdisp.o fdcoeffone.o conv1done.o
*/




#define OBJSDEMO Ultimod.o sub.demo.o timestep.demo.o conv1dc.o del.o getstress.o dsrc.o update2.o expdamp.o fdcoeff.o  initcommon.o bcstress.o bcdisp.o

Ultimod.demo&:  OBJSDEMO
	CMFC  LDOPTS  OBJSDEMO XCMLIB SEPLIB SYSLIB -o BINDIR/Ultimod.demo

#define OBJSSPLIT Ultimod.o sub.o timestepsplit.o conv1dcsplit.o delsplit.o getstress.o record.o dsrc.o update2.o expdamp.o

Split Ultisplit&:   OBJSSPLIT
	CMFC  LDOPTS  OBJSSPLIT XCMLIB SEPLIB SYSLIB -o BINDIR/Ultisplit


fig1-3.h&: showder
	showder alpha=0.01 >junk
	Byte gainpanel=every <junk >fig1-3.h

FIGDIR/fig1.v fig1.v&: fig1-3.h
	Window <fig1-3.h n3=1 |Ta2vplot out=FIGDIR/fig1.v title="Gaussian blob">/dev/null

FIGDIR/fig2 fig2.v&: fig1-3.h
	Window <fig1-3.h f3=1 n3=1 |Ta2vplot out=FIGDIR/fig2.v title="exact derivative">/dev/null

FIGDIR/fig3.v fig3.v&: fig1-3.h
	Window <fig1-3.h f3=2 n3=1 |Ta2vplot out=FIGDIR/fig3.v title="conv. derviative">/dev/null

FIGDIR/fig1.A fig1.A&: fig1-3.h
        Window <fig1-3.h f3=1 >FIGDIR/fig1.A



testsource&: testsource.o dsrc.o
	CMFC LDOPTS testsource.o dsrc.o  -o testsource

teststiff&: teststiff.o conv1dc.o del.o derivate2.o conv1dc2.o
	CMFC LDOPTS teststiff.o derivate2.o conv1dc2.o conv1dc.o del.o -o teststiff

showder&: showder.o conv1dc.o
	CMFC LDOPTS showder.o conv1dc.o SEPLIB SYSLIB -o showder


testder3&: testder3.o derivate2.o conv1dc2.o
	CMFC LDOPTS testder3.o derivate2.o conv1dc2.o -o testder3

testder2&: testder2.o derivate2.o conv1dc2.o
	CMFC LDOPTS testder2.o derivate2.o conv1dc2.o -o testder2

testder&: testder.o derivate.o conv1dc.o del.o derivate2.o conv1dc2.o
	CMFC LDOPTS testder.o derivate.o conv1dc.o del.o derivate2.o conv1dc2.o -o testder

der&: der.o derivate2.o conv1dc2.o
	CMFC LDOPTS der.o derivate2.o conv1dc2.o -o der

testit&: testit.o
	CMFC LDOPTS testit.o  -o testit

testme&: testme.o conv1dc.o
	CMFC LDOPTS testme.o conv1dc.o  -o testme

test&:
	!pushd Data ; cake modiso;popd

testsplit&:
	!pushd Data ; cake modisosplit;popd


Geninput: Geninput.o
	FC LDOPTS Geninput.o SEPLIB SYSLIB -o BINDIR/Geninput




clean&:
	-RM_CMD timestepNS.* timestepNS.visco.* timestepNS.elrho.*
	-RM_CMD timestepNS.viscorho.* timestepNSF.*
	-RM_CMD timestepNSF.visco.* timestepNSF.elrho.*
	-RM_CMD timestepNSF.viscorho.* timestepNF.*
	-RM_CMD timestepNF.visco.* timestepNF.elrho.*
	-RM_CMD timestepNF.viscorho.* timestepN.{fcm,rcm,o.pe.o}
	-RM_CMD timestepN.visco.* timestepN.elrho.*
	-RM_CMD timestepN.viscorho.*
	-RM_CMD sub.{fcm,rcm,o,pe.o} sub.visco.o sub.viscorho.o 
	-RM_CMD sub.elrho.o sub.o subf.o sub.viscof.o
	-RM_CMD sub.elrhof.o sub.viscorhof.o
	-RM_CMD *.x *.o *.fcm  a.out core 

veryclean&:
	-RM_CMD *.x *.o  a.out core *.fcm *.f


derfft.fcm:  SRCDIR/derfft.rcm            if exist SRCDIR/derfft.rcm
        spp < SRCDIR/derfft.rcm | RATFOR -6"&" -C | FPP -Dxcmfinclude=INCLUDE -DSOURCE="'"FULLSRC/derfft.rcm"'" -Dsource="'"FULLSRC/derfft.rcm"'"   > derfft.fcm

#ifndef SPPOPTS
#define SPPOPTS
#endif
%.fcm:  SRCDIR/%.rcm            if exist SRCDIR/%.rcm
        SPP SPPOPTS < SRCDIR/%.rcm | RATFOR -6"&" -C | FPP -DSOURCE="'"FULLSRC/%.rcm"'" -Dsource="'"FULLSRC/%.rcm"'"   > %.fcm

%.f: SRCDIR/%.rs		if exist SRCDIR/%.rs
	SPP SPPOPTS <SRCDIR/%.rs >%.spp
	SAW %.spp | RATFOR | FPP -Dsource="'"FULLSRC/%.rs"'" MACH ICAT(SRCDIR)  FIXNULL > %.f
	-rm %.spp



/*
Test.fcm: SRCDIR/Test.rs		if exist SRCDIR/Test.rs
	spp <SRCDIR/Test.rs >Test.spp
	SAW Test.spp | RATFOR | FPP -Dsource="'"FULLSRC/Test.rs"'" MACH ICAT(SRCDIR)  FIXNULL > Test.fcm
	-rm Test.spp

Test.o: Test.fcm
	CMFC -c -g -cmdebug Test.fcm
*/

/*
test.x: test.o testa.o testdn.o
	CMFC LDOPTS -cmdebug -cmprofile test.o testa.o testdn.o CMLIB XCMLIB SEPLIB SYSLIB -o test.x

#define OBJS sub.test.o timestep.o del.o getstress.o record.o dsrc.o update2.o expdamp.o fdcoeff.o initcommon.o bcstress.o bcdisp.o fdcoeffone.o conv1done.o updateone.o ssrc.o 

Test.x: Test.o testa.o OBJS
	CMFC CMLDOPTS -cmdebug -cmprofile Test.o testa.o OBJS CMLIB XCMLIB SEPLIB SYSLIB -o Test.x
*/


diffcoeff:
	echo "0.0006975 -0.00957 0.0797 -1.196" > coef.ascii
        echo "1.196 -0.0797 0.00957 -0.0006975" >>coef.ascii
	atoF <coef.ascii >coef.h
	Graph <coef.h |Tube
	Pad <coef.h n1=128 >jpad.H
	Spectrum <jpad.H >jpadspec.H




Test.x &:  Test.o cmstuff.o
        CMFC  -v LDOPTS USRCMLDOPTS Test.o cmstuff.o -lsepattr SEPLIB USRLIBS -lprism5 SYSLIB -o  Test.x


#include <SEP.obj.rules>
#include <SEP.prog.rules>
#include <SEP.idoc.rules>
