# Cuda SDK
CUDASDKDIR = /opt/nvidia/cuda-2.3_sdk/C
CUDASDKINC = $(CUDASDKDIR)/common/inc
CUDALIB = /opt/nvidia/cuda/lib64
CUDASDKLIB = $(CUDASDKDIR)/lib

# CUDA-specific libraries from runtime and SDK
CUINCFLAGS =  -I$(CUDASDKINC)
CULIBFLAGS =  -L/opt/nvidia/cuda/lib64 -L$(CUDASDKLIB) -L${CUDASDKDIR}/common/lib/linux  -lcudart -lcuda -lcutil -L${CUDALIB} -lparamgl -lcuda
#-L/opt/nvidia/cuda/lib64 -L/opt/nvidia/cuda-2.3_sdk/C/lib -L/opt/nvidia/cuda-2.3_sdk/common/lib/linux -lcudart -L/opt/nvidia/cuda/lib64 -L../../lib -L/opt/nvidia/cuda-2.3_sdk/common/lib/linux -lcutil  -L/opt/SEP/SEP7.0/lib -lsep3d -lsep

CUFLAGS = -O3 --compiler-options $(CUINCFLAGS) $(CULIBFLAGS) $(CINCFLAGS) $(CLIBFLAGS)

#CUFLAGS = -O3 --compiler-options $(CUINCFLAGS) $(CULIBFLAGS) $(CINCFLAGS) $(CLIBFLAGS)
CUFLAGS = 
CCFLAGS = -O3  -openmp -std=c99

SEP=/opt/SEP/SEP6.4.6
SEPINC=${SEP}/include
SEPLIB=${SEP}/lib
SEPFLAG=-I${SEPINC} -L${SEPLIB} -L$(SEPLIB) -lsepauxf90 -lsepgeef90 -lsepf90 -lsep2df90 -lsep3df90 -lsep3d -lsepf90 -lsep

BOBCPP= /net/server/homes/sep/bob/Src/cpp/base
BOBFLAG= -L${BOBCPP} -lbob_cpp
CXX  = /lib/cpp

# Common Libraries
CMNINCFLAGS = -I. -I$(SEPINC) -I$(MPIINC) -I$(FFTWINC) -I$(S)
CMNLIBFLAGS = $(SEPLIBFLAGS) $(MPILIBFLAGS) $(FFTWLIBFLAGS) $(GOMPLIBFLAGS) -lm -lpthread -lgomp

# Fortran Includes
F90INCFLAGS  = $(CMNINCFLAGS) $(CUINCFLAGS)
F90LIBFLAGS  = $(CMNLIBFLAGS) $(CULIBFLAGS)
F90FLAGS     = -O3 -openmp -FR -g -traceback -module $(M) -static-intel -check bounds
F90  = ifort


NVCC = /opt/nvidia/cuda/bin/nvcc  $(CUFLAGS) $(CUINCFLAGS) $(CULIBFLAGS)   --device-emulation 
NVCC = /opt/nvidia/cuda/bin/nvcc   $(CUFLAGS) $(CUINCFLAGS) $(CULIBFLAGS)  #-arch=sm_13

RESDIR       = ./Fig
NRRESDIR     = ./NRFig
BINDIR       = ./Bin
OBJDIR       = ./Obj
SRCDIR       = ./Src
R            = ${RESDIR}
B            = ${BINDIR}
O            = ${OBJDIR}
P            = ${PARDIR}
D            = ${DATDIR}
S            = ${SRCDIR}

CU_OBJS_3D= gpu_funcs_3d.o
CPP_OBJS_3D= vel_fd_3d.o  data_rtm_3d.o  image_rtm_3d.o  wavefield_insert_3d.o  source_func_3d.o  rtm_zero_op_3d.o  deriv_3d.o  fd_prop_3d.o  map_data_3d.o  hypercube_float.o  my_operator.o  hypercube.o  float_3d.o  oc_float.o  sreg.o  sregf.o  axis.o  sinc_bob.o  sep_params.o  param_func.o
CPP_OBJS_3D2= vel_fd_3d.o  data_rtm_3d.o  image_rtm_3d.o  wavefield_insert_3d.o  source_func_3d.o deriv_3d.o  fd_prop_3d.o  map_data_3d.o  hypercube_float.o  my_operator.o  hypercube.o  float_3d.o  oc_float.o  sreg.o  sregf.o  axis.o  sinc_bob.o  sep_params.o  param_func.o
REC= gpu_funcs_3d_rec.o rtm_zero_op_3d_rec.o

MODEL_OBJS_3D= gpumodel3d.o c_gpu_interface_wave_prop.o model3d.o

default:
	make -i -k default1
	make -i -k default2
	make -i -k default3

default1: basic.img3d.prop.H basic.img.H seam.img.H
default2: ${R}/basic.pdf ${R}/shotrand2.pdf ${R}/shotrand3.pdf ${R}/seamimg.pdf ${R}/basicimg.pdf ${R}/velslice3d.pdf
default3:
	cp ${NRRESDIR}/* ${R}/

include SMakefile

clean:
	touch x.H x.x x.o
	${RM} *.H *.x *.o ${R}/*

%.o: %.cu
	${NVCC} -g $*.cu -c -o $@  $(CUFLAGS) $(CUINCPATH) $(CULIBPATH) $(CULIBS)  ${SEPFLAG}

%.o: %.cpp
	g++ -Wall -o $*.o  -c $*.cpp ${SEPFLAG} -I../base -I.  -O2 -g 

#%.o: %.f90
#	ifort -O3 -I/opt/SEP/SEP6.4.6/include -c $*.f90 -o $*.o ${SEPFLAG}

%.o: %.f90
	#Preprocessing FORTRAN $^
	$(CXX) $(F90INCFLAGS) -DSOURCE="'$^'" < $*.f90  > $*.fix.f90
	#Compiling FORTRAN $@
	$(F90) $(F90INCFLAGS) $(F90FLAGS)  -c -o $*.o $*.fix.f90

FIG          = >/dev/null out=

%.x: %.o
	#Linking FORTRAN $@
	$(F90) -o $@ $^     $(F90FLAGS)  $(F90INCFLAGS) $(F90LIBFLAGS)

model3d.x: ${MODEL_OBJS_3D}
	$(F90) -o $@ $^ $(F90FLAGS) $(F90INCFLAGS) $(F90LIBFLAGS) ${SEPFLAG}


RTM2_3d.x: ${CU_OBJS_3D} ${CPP_OBJS_3D}   RTM2_3d.o
	g++   RTM2_3d.o  ${CPP_OBJS_3D} ${CU_OBJS_3D}  -o $@ ${CULIBFLAGS} ${CULIBS}  ${SEPFLAG}

RTM2_3d_rec.x: ${CPP_OBJS_3D2} ${REC}  RTM2_3d_rec.o
	g++   RTM2_3d_rec.o  ${CPP_OBJS_3D2} ${REC} -o $@ ${CULIBFLAGS} ${CULIBS}  ${SEPFLAG}



wave.seam.H:
	Wavelet n1=1600 o1=0 d1=0.007 wavelet=ricker2 phase=0 fund=25 tdelay=0.05 |Window3d n1=128 > tmp.H
	Math file1=tmp.H exp='file1*1000' > $@
	echo "label1='Time(s)'"  >> $@
	rm tmp.H

wave.seam3d.H:
	Wavelet n1=8192 o1=0 d1=0.004 wavelet=ricker2 phase=0 fund=20 tdelay=0.075 | Window3d n1=128 > tmp.H
	Math file1=tmp.H exp='file1*1000' > $@
	echo "label1='Time(s)'"  >> $@
	rm tmp.H

seam.vel3d.H: vel3d.H
	cp vel3d.H tmpvel.H
	Window3d  < tmpvel.H > $@
	echo "o1=0 o2=0 o3=0" >> $@

seam.shot3d.H: survey3d.H
	cp survey3d.H $@
	rm survey3d.H

basic.shot3d.H: shot3d_basic.H shot3d_basic_sea.H
	cp shot3d_basic.H bstmp.H
	cp shot3d_basic_sea.H bstmpsea.H
	Math file1='bstmp.H' file2='bstmpsea.H' exp='file1-file2' > $@
	rm bstmp*

basic.shot3d2.H: shot3d_basic2.H shot3d_basic_sea2.H
	cp shot3d_basic2.H bstmp2.H
	cp shot3d_basic_sea2.H bstmpsea2.H
	Math file1='bstmp2.H' file2='bstmpsea2.H' exp='file1-file2' > $@
	rm bstmp2.H bstmpsea2.H

basic.vel3d.H: vel3d_basic.H
	cp vel3d_basic.H $@


seam.img3d.H:    RTM2_3d.x wave.seam3d.H seam.vel3d.H seam.shot3d.H
	cp seam.shot3d.H s.H
	Window3d j2=2 j3=2 < s.H > s2.H
	echo "n4=2 n5=2" >> s2.H
	Window3d j2=2 j3=2 < seam.vel3d.H | Pad beg1=30 end1=20 extend=1 | Smooth rect1=8 rect2=8 rect3=8 > v.H
	./RTM2_3d.x wavelet=wave.seam3d.H image=$@ velocity=v.H data=s2.H  bc_a=25 bc_b=0.0005 device=1 source_fields=seam.source3d.H aper=2000 velout=seam.velout.H src_depth=200.

seam.img3d2.H:    RTM2_3d.x wave.seam3d.H seam.vel3d.H seam.shot3d.H
	cp seam.shot3d.H s.H
	Window3d j2=2 j3=2 < s.H > s2.H
	echo "n4=2 n5=2" >> s2.H
	Window3d j2=2 j3=2 < seam.vel3d.H > v.H
	./RTM2_3d.x wavelet=wave.seam3d.H image=$@ velocity=v.H data=s2.H  bc_a=0 bc_b=0.0005 device=1 source_fields=seam.source3d2.H aper=2000 dcheck=oot2.H velout=seam.velout2.H
	echo "n1=616 d1=10 n2=216 d2=20 n3=216 d3=20" >> seam.velout2.H
	echo "n1=616 d1=10 n2=216 d2=20 n3=216 d3=20" >> seam.source3d2.H

%.img.H: %.img3d.H
	Bandpass flo=0.012 fhi=40 < $< > $@


basic.img3d.H:    RTM2_3d.x wave.seam3d.H basic.vel3d.H basic.shot3d2.H
#	Window3d n4=1 f4=1 n5=1 f5=1 < basic.shot3d.H > b.H
	cp basic.shot3d2.H b2.H
	echo "n4=2 n5=2" >> b2.H
	Window n1=160 < basic.vel3d.H | Pad beg1=30 end1=20 extend=1 > basic.v.H
	./RTM2_3d.x wavelet=wave.seam3d.H image=$@ velocity=basic.v.H data=b2.H  bc_a=20 bc_b=0.0005 device=0 source_fields=basic.source3d.H aper=800 velout=basic.velout.H shot_out=basic.shotout.H check=check.rec.H dcheck=recfunc.H src_depth=200.


basic.img3d.prop.H: RTM2_3d_rec.x wave.seam3d.H basic.vel3d.H basic.shot3d.H
#	Window3d n4=1 f4=1 n5=1 f5=1 < basic.shot3d.H > b.H
	cp basic.shot3d.H b.H
	echo "o4=1000 o5=1000 n4=2 n5=2 d4=500 d5=500" >> b.H
	Window n1=160 < basic.vel3d.H | Pad beg1=30 end1=20 extend=1 > basic.v.H
	./RTM2_3d_rec.x wavelet=wave.seam3d.H image=$@ velocity=basic.v.H data=b.H  bc_a=20 bc_b=0.0005 device=0 source_fields=basic.source3d.rand.H aper=800 velout=basic.velout.H shot_out=basic.shotout.H check=check.src.H src_depth=40.
	echo "n1=264 d1=10 n2=216 d2=10 n3=216 d3=10" >> basic.velout.H
	echo "n1=264 d1=10 n2=216 d2=10 n3=216 d3=10" >> basic.source3d.rand.H
	echo "n1=264 d1=10 n2=216 d2=10 n3=216 d3=10 n4=27 d4=1" >> check.src.H
	Window3d n3=1 f3=100 < check.src.H > basic.data.src.H
	./RTM2_3d_rec.x wavelet=wave.seam3d.H image=junk.H velocity=basic.v.H data=b.H  bc_a=0 bc_b=0.0005 device=0 source_fields=basic.source3d.ref.H aper=800 velout=basic.velout.H src_depth=40.
	echo "n1=232 d1=10 n2=184 d2=10 n3=184 d3=10" >> basic.source3d.ref.H

#rtm2_memcheck: RTM2_3d.x wave.seam.H seam.vel.sm.H seam.shot.H
#	valgrind --tool=memcheck  --leak-check=full -v ./RTM2_3d.x wavelet=wave.seam.H image=$@ velocity=seam.vel.sm.H data=seam.shot.H aper=5 bc_a=50 bc_b=0.0005 device=1 source_fields=seam.source.H

#${R}/basicboundcomp.v: basic.source3d.ref.H basic.source3d.rand.H


	

${R}/basic.v: basic.source3d.ref.H basic.source3d.rand.H
	< basic.source3d.ref.H Taplot gainpanel=a > junkdec.H
	Cubeplot < junkdec.H flat=y wantcoordlabel=-1 point1=.55 point2=.55 frame1=116 frame2=92 frame3=92 title=' ' label1='Depth (m)' label2='Inline (m)' label3='Crossline (m)' labelsz=10 titlesz=10 ${FIG}${R}/ref.v
	Window3d n1=232 f1=16 n2=184 f2=16 n3=184 f3=16 < basic.source3d.rand.H | Taplot gainpanel=a > junkdec2.H
	Cubeplot < junkdec2.H flat=y wantcoordlabel=-1 point1=.55 point2=.55 frame1=116 frame2=92 frame3=92 title=' ' label1='Depth (m)' label2='Inline (m)' label3='Crossline (m)' labelsz=10 titlesz=10 ${FIG}${R}/rand.v
	vp_SideBySideAniso ${R}/ref.v ${R}/rand.v > $@
	rm junkdec*

${R}/shotrand.v: basic.data.src.H
	Window3d n3=1 f3=2  < $< | Grey title='(a)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand1.v
	Window3d n3=1 f3=6  < $< | Grey title='(b)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand2.v
	Window3d n3=1 f3=9  < $< | Grey title='(c)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand3.v
	Window3d n3=1 f3=12 < $< | Grey title='(d)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand4.v
	Window3d n3=1 f3=15 < $< | Grey title='(e)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand5.v
	Window3d n3=1 f3=18 < $< | Grey title='(e)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand6.v
	vp_SideBySideAniso ${R}/rand1.v ${R}/rand2.v ${R}/rand3.v ${R}/rand4.v ${R}/rand5.v ${R}/rand6.v crowd=1 > ${R}/shotrandbck.v
	vp_SideBySideAniso ${R}/rand6.v ${R}/rand5.v ${R}/rand4.v ${R}/rand3.v ${R}/rand2.v ${R}/rand1.v crowd=1 > ${R}/shotrandfwd.v
	vp_OverUnderAniso ${R}/shotrandfwd.v ${R}/shotrandbck.v > $@

${R}/shotrand2.v: basic.data.src.H
	Window3d n3=4 f3=1 j3=4 < $< > tmp.H
	Window3d n3=5 f3=1 j3=4 < $< | Reverse which=4 > tmp2.H
	Cat tmp.H tmp2.H | Grey wantframenum=n gainpanel=e crowd=1 label1="Inline" | Vppen gridnum=3,3 >x.V ${FIG}${R}/shotrand2.v vpstyle=n

${R}/shotrand3.v: basic.data.src.H
	Window3d n3=4 f3=8 j3=3 < $< > tmp3.H
	Window3d n3=5 f3=5 j3=3 < $< | Reverse which=4 > tmp23.H
	Cat tmp23.H tmp3.H | Grey wantframenum=n gainpanel=e crowd=1 label1="Inline" | Vppen gridnum=3,3 >x.V ${FIG}${R}/shotrand3.v vpstyle=n
	rm tmp*

${R}/bound_comp.v: seam.source3d.H seam.source3d2.H
	Window3d n1=1 f1=610 n2=216 f2=24 n3=216 f3=24 < seam.source3d.H > randtmp.H
	echo 'o1=0 o2=0' >> randtmp.H
	Grey < randtmp.H title='(a)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/rand_shot.v
	Window3d n1=1 f1=610  < seam.source3d2.H | Grey title='(b)' label1='Inline (m)' label2='Crossline (m)' ${FIG}${R}/nonrand_shot.v
	vp_SideBySideAniso ${R}/rand_shot.v ${R}/nonrand_shot.v > $@
	rm randtmp.H

${R}/vel_comp.v: seam.velout.H seam.velout2.H
	Window3d n3=1 f3=124 < seam.velout.H > randtmp.H
	echo 'o1=0 o2=0 o3=0' >> randtmp.H
	Grey < randtmp.H title='(a)' label1='Depth (m)' label2='Inline (m)' color=j ${FIG}${R}/rand_vel.v
	Window3d n3=1 f3=100  < seam.velout2.H | Grey title='(b)' color=j label1='Depth (m)' label2='Inline (m)' ${FIG}${R}/nonrand_vel.v
	vp_SideBySideAniso ${R}/rand_vel.v ${R}/nonrand_vel.v > $@
	rm randtmp.H

${R}/basicimg.v: basic.img.H
	Window3d n1=150 f1=30 n2=60 f2=40 n3=90 f3=50 < $< | Taplot gainpanel=a > btemp.H
	Cubeplot < btemp.H flat=y wantcoordlabel=-1 point1=.55 point2=.55 frame1=58 frame2=29 frame3=31 title=' ' label1='Depth (m)' label2='Inline (m)' label3='Crossline (m)' ${FIG}${R}/basicimg.v

${R}/seamimg.v: #seam.img.H
	Window3d n1=350 f1=30 n2=150 f2=0 n3=150 f3=0 < seam.img.H | Taplot gainpanel=e > vtemp.H
	Cubeplot < vtemp.H flat=y wantcoordlabel=-1 point1=.55 point2=.55 frame1=115 frame2=53 frame3=29 title=' ' label1='Depth (m)' label2='Inline (m)' label3='Crossline (m)' ${FIG}${R}/seamimg.v

${R}/velslice3d.v: vel3d.H
	Window3d j1=2 j2=2 j3=2 < $< | Taplot gainpanel=e color=j colorbar=y > vtemp.H
	Cubeplot < vtemp.H flat=y wantcoordlabel=-1 point1=.55 point2=.55 frame1=61 frame2=135 frame3=100 title=' ' label1='Depth (m)' label2='Inline (m)' label3='Crossline (m)' color=j colorbar=y ${FIG}${R}/velslice3d.v

# Create ps, pdf and gif files
${R}/%.ps: ${R}/%.v
	pstexpen $< $@ color=n

${R}/%.pdf: ${R}/%.ps
	epstopdf $<
