#define DEBUG
#define FIGDIR ./Fig

#define BASEDIR ../../..
#include "../../../include/cake/SEP.clop.defs"
#include <SEP.defs>

$ define figures to be produced
$#define KMOSTACK Kmostacksingle
#define KMOSTACK Kmostack

#define FIGLIST1 stackout stackadj stackiters stackinv 
#define FIGLIST2 stackoutp stackadjp stackitersp stackinvp
#define FIGLIST2 stackadjp stackinvp
#define FIGLIST FIGLIST1 FIGLIST2
#define FIGLIST FIGLIST2

$ define objects to be added to the global library
#define LIBSOURCE fopkmostksingle fopkmostk 

$ programs to be built
#define PROGLIST Kmostack Dottest 

#define MIGAXIS   om=0. dm=0.025 nm=1
#define UNMIGAXIS ox=0. dx=0.025 nx=20

#define PMIGAXIS   om=0. dm=0.025 nm=60
#define PUNMIGAXIS ox=0. dx=0.025 nx=60

$ default to run in this directory
default&: tube

Apply&: fopkmostk.Apply  fopkmostksingle.Apply

fopkmostk.Apply: fopkmostk.cc
	@C++Extract <fopkmostk.cc \"fopKMOstk::fopKMOstk\" >fopkmostk.Apply
	
$ input
stackin.H: if not exist stackin.H 
	Spike n1=100 d1=.004 nsp=3 k1=20,50,80 label1=Time label2="mig Midpoint" label3="dummy">stackin.H

$ modeling
stackout.H: BINDIR/KMOSTACK stackin.H 
	BINDIR/KMOSTACK <stackin.H adj=0 vel=3.0 UNMIGAXIS >stackout.H

FIGDIR/stackout.v: stackin.H stackout.H
	Graph <stackin.H transp=y yreverse=y title="Original input" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
	Wiggle <stackout.H transp=y yreverse=y title="Modeled data" >/dev/null out=FIGDIR/tmp2.v
	vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackout.v
	RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v

$ processing
stackadj.H: BINDIR/KMOSTACK stackout.H 
	BINDIR/KMOSTACK <stackout.H adj=1 vel=3.0 MIGAXIS >stackadj.H

stackadjmod.H: BINDIR/KMOSTACK stackadj.H 
	BINDIR/KMOSTACK <stackadj.H adj=0 vel=3.0 UNMIGAXIS >stackadjmod.H

FIGDIR/stackadj.v: stackadj.H stackadjmod.H
	Graph <stackadj.H transp=y yreverse=y title="Adjoint processing" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
	Wiggle <stackadjmod.H transp=y yreverse=y title="Adjoint + modeling" >/dev/null out=FIGDIR/tmp2.v
	vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackadj.v
	RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v

$ inversion iterations
stackiters.H stackinv.H : BINDIR/KMOSTACK stackout.H 
	BINDIR/KMOSTACK <stackout.H niter=2 inv=1 vel=3.0 MIGAXIS >tmp1.H
	BINDIR/KMOSTACK <stackout.H niter=5 inv=1 vel=3.0 MIGAXIS >tmp2.H
	BINDIR/KMOSTACK <stackout.H niter=10 inv=1 vel=3.0 MIGAXIS >stackinv.H
	Merge tmp1.H tmp2.H stackinv.H axis=2 space=no >stackiters.H
	Rm tmp1.H tmp2.H 

FIGDIR/stackiters.v: stackiters.H
	Merge stackin.H stackiters.H axis=2 space=no |  Dots title="NMO + Stack inversion" labels="original:2 iterations:5 iterations:10 iterations" gaineach=0  >/dev/null out=FIGDIR/stackiters.v

stackinvmod.H:  BINDIR/KMOSTACK stackinv.H
	BINDIR/KMOSTACK <stackinv.H adj=0 vel=3.0 UNMIGAXIS >stackinvmod.H

FIGDIR/stackinv.v: stackinv.H stackinvmod.H
	Graph <stackinv.H transp=y yreverse=y title="Inverse processing" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
	Wiggle <stackinvmod.H transp=y yreverse=y title="Inverse + modeling" >/dev/null out=FIGDIR/tmp2.v
	vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackinv.v
	RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v

$ generate a poststack panel of diffractors

stackinp.H: if not exist stackinp.H 
        Spike n1=100 d1=.004 n2=60 d2=0.025 nsp=3 k1=20,50,80 k2=15,30,45 label1=Time label2="mig Midpoint" >stackinp.H

$ modeling
stackoutp.H: BINDIR/KMOSTACK stackinp.H 
	BINDIR/KMOSTACK <stackinp.H adj=0 vel=3.0 PUNMIGAXIS >stackoutp.H

FIGDIR/stackoutp.v: stackin.H stackout.H
	Graph <stackin.H transp=y yreverse=y title="Original input" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
	Wiggle <stackout.H transp=y yreverse=y title="Modeled data" >/dev/null out=FIGDIR/tmp2.v
	vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackoutp.v
	RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v

stackadjp.H: BINDIR/KMOSTACK stackoutp.H
        BINDIR/KMOSTACK <stackoutp.H adj=1 vel=3.0 PMIGAXIS >stackadjp.H

stackadjmodp.H: BINDIR/KMOSTACK stackadjp.H
        BINDIR/KMOSTACK <stackadjp.H adj=0 vel=3.0 PUNMIGAXIS >stackadjmodp.H

FIGDIR/stackadjp.v: stackadjp.H stackadjmodp.H
        Taplot pclip=100 <stackadjp.H |Ta2vplot title="Adjoint processing" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
        Taplot pclip=100 <stackadjmodp.H |Ta2vplot title="Adjoint + modeling" >/dev/null out=FIGDIR/tmp2.v
        vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackadjp.v
        RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v


$ try iterating
stackinvp%.H: BINDIR/KMOSTACK stackoutp.H
        BINDIR/KMOSTACK <stackoutp.H niter=% inv=1 vel=3.0 PMIGAXIS >stackinvp%.H

stackinvp%.v: stackinvp%.H
	Taplot pclip=100 < stackinvp%.H |Ta2vplot title="KMO Inverse Iteration:%" out=stackinvp%.v >/dev/null
	Rm stackinvp%.H

stackadjp.v: stackadjp.H
	Taplot pclip=100 < stackadjp.H |Ta2vplot title="KMO Adjoint Processing" out=stackadjp.v >/dev/null
	Rm stackadjp.H

FIGDIR/stackitersp.v3: stackadjp.v stackinvp2.v stackinvp5.v stackinvp10.v
	vp_Movie stackadjp.v stackinvp2.v stackinvp5.v stackinvp10.v >FIGDIR/stackitersp.v3

$ 	rm stackinvp2.v stackinvp5.v stackinvp10.v 

FIGDIR/stackitersp.v: stackinvp10.v FIGDIR/stackitersp.v3 
	mv stackinvp10.v FIGDIR/stackitersp.v

stackinvmodp.H: BINDIR/KMOSTACK stackinvp10.H
        BINDIR/KMOSTACK <stackinvp10.H adj=0 vel=3.0 PUNMIGAXIS >stackinvmodp.H

FIGDIR/stackinvp.v: stackinvp10.H stackinvmodp.H
        Taplot pclip=100 <stackinvp10.H |Ta2vplot title="Inverse processing" label2=amplitude >/dev/null out=FIGDIR/tmp1.v
        Taplot pclip=100 <stackinvmodp.H |Ta2vplot title="Inverse + modeling" >/dev/null out=FIGDIR/tmp2.v
        vp_SideBySideAniso FIGDIR/tmp1.v FIGDIR/tmp2.v >FIGDIR/stackinvp.v
        RM_CMD FIGDIR/tmp1.v FIGDIR/tmp2.v


#define KMOOBJ OBJDIR/Kmostack.o OBJDIR/fopkmostk.o OBJDIR/fopkmostksingle.o
BINDIR/Kmostack : KMOOBJ
	CPPLINK(KMOOBJ,a.out)
	CPPINST(BINDIR/Kmostack)

#define KMOOBJSINGLE OBJDIR/Kmostacksingle.o OBJDIR/fopkmostksingle.o
BINDIR/Kmostacksingle : KMOOBJSINGLE 
	CPPLINK(KMOOBJSINGLE,a.out)
	CPPINST(BINDIR/Kmostacksingle)

BINDIR/Dottest : OBJDIR/Dottest.o
	CPPLINK(OBJDIR/Dottest.o,a.out)
	CPPINST(BINDIR/Dottest)


clean&: texclean clopclean jclean
	-rm *.v j*


#include <SEP.idoc.rules>
#include <SEP.obj.rules>
#include "../../../include/cake/SEP.clop.rules"
