Skip to content
Snippets Groups Projects
getRecTimes3D.c 23.36 KiB
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<assert.h>
#include"fdelmodc3D.h"
#include"par.h"

/**
*  Stores the wavefield at the receiver positions.
*
*  On a staggered grid the fields are all on different positions, 
*  to compensate for that the rec.int_vx and rec.int_vz options
*  can be set.
*
*   AUTHOR:
*           Jan Thorbecke (janth@xs4all.nl)
*           The Netherlands 
**/

long getRecTimes3D(modPar mod, recPar rec, bndPar bnd, long itime, long isam,
	float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx,
	float *txz, float *txy, float *tyz, float ***l2m, float ***rox, float ***roy, float ***roz,
	float *rec_vx, float *rec_vy, float *rec_vz, float *rec_txx, float *rec_tyy, float *rec_tzz,
	float *rec_txz, float *rec_txy, float *rec_tyz, float *rec_p, float *rec_pp, float *rec_ss,
	float *rec_udp, float *rec_udvz, long verbose)
{
	long n1, n2, ibndx, ibndy, ibndz;
	long irec, ix, iy, iz, ix2, iy2, iz2, ix1, iy1, iz1;
	float dvx, dvy, dvz, rdz, rdy, rdx;
    float C000, C100, C010, C001, C110, C101, C011, C111;
	float *vz_t, c1, c2, lroz, field;

    ibndx = mod.ioPx;
    ibndy = mod.ioPy;
    ibndz = mod.ioPz;
    if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap;
    if (bnd.bac==4 || bnd.fro==2) ibndy += bnd.ntap;
    if (bnd.top==4 || bnd.top==2) ibndz += bnd.ntap;
	n1    = mod.naz;
    n2    = mod.nax;
	c1 = 9.0/8.0;
	c2 = -1.0/24.0;

	if (!rec.n) return 0;

/***********************************************************************
* velocity or txz or potential registrations issues:
* rec_x and rec_z are related to actual txx/tzz/p positions.
* offsets from virtual boundaries must be taken into account.
*
* vx velocities have one sample less in x-direction
* vz velocities have one sample less in z-direction
* txz stresses have one sample less in z-direction and x-direction
*
* Note, in the acoustic scheme P is stored in the Tzz array.
***********************************************************************/

	for (irec=0; irec<rec.n; irec++) {
		iz = rec.z[irec]+ibndz;
		iy = rec.y[irec]+ibndy;
		ix = rec.x[irec]+ibndx;
		iz1 = iz-1;
		iy1 = iy-1;
		ix1 = ix-1;
		iz2 = iz+1;
		iy2 = iy+1;
		ix2 = ix+1;
		/* interpolation to precise (not necessary on a grid point) position */
		if ( rec.int_p==3 ) {
			iz = (long)floorf(rec.zr[irec]/mod.dz)+ibndz;
			iy = (long)floorf(rec.yr[irec]/mod.dy)+ibndy;
			ix = (long)floorf(rec.xr[irec]/mod.dx)+ibndx;
			rdz = (rec.zr[irec] - (iz-ibndz)*mod.dz)/mod.dz;
			rdy = (rec.yr[irec] - (iy-ibndy)*mod.dy)/mod.dy;
			rdx = (rec.xr[irec] - (ix-ibndx)*mod.dx)/mod.dx;
			iz1 = iz-1;
			iy1 = iy-1;
			ix1 = ix-1;
			iz2 = iz+1;
			iy2 = iy+1;
			ix2 = ix+1;
			
			/*
			 // Interpolate according to Dirk Kraaijpool's scheme 
			 // Reference:  "Seismic ray fields and ray field maps : theory and algorithms" , 
			 // PhD thesis Utrecht University,Faculty of Geosciences, 2003) 
			 
			 C00 = tzz[ix*n1+iz]      + 0.5*((tzz[(ix+1)*n1+iz]   +tzz[(ix-1)*n1+iz]+ 
			 tzz[(ix  )*n1+iz+1] +tzz[(ix  )*n1+iz-1])/(2.0*mod.dx));
			 C10 = tzz[(ix+1)*n1+iz]  + 0.5*((tzz[(ix+2)*n1+iz]   +tzz[(ix  )*n1+iz]+
			 tzz[(ix+1)*n1+iz+1] +tzz[(ix+1)*n1+iz-1])/(2.0*mod.dz));
			 C01 = tzz[ix*n1+iz+1]    + 0.5*((tzz[(ix+1)*n1+iz+1] +tzz[(ix-1)*n1+iz+1]+
			 tzz[(ix)*n1+iz+2]   +tzz[(ix  )*n1+iz])/(2.0*mod.dx));
			 C11 = tzz[(ix+1)*n1+iz+1]+ 0.5*((tzz[(ix+2)*n1+iz+1] +tzz[(ix  )*n1+iz+1]+
			 tzz[(ix+1)*n1+iz+2] +tzz[(ix+1)*n1+iz])/(2.0*mod.dz));
			 */
			
			if (rec.type.p){
				/* bi-linear interpolation */
				C000 = tzz[iy*n1*n2+ix*n1+iz];
				C100 = tzz[iy*n1*n2+(ix+1)*n1+iz];
				C010 = tzz[iy*n1*n2+ix*n1+iz+1];
				C001 = tzz[(iy+1)*n1*n2+ix*n1+iz];
				C110 = tzz[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = tzz[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = tzz[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = tzz[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_p[irec*rec.nt+isam] =   C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.txx) {
				C000 = txx[iy*n1*n2+ix*n1+iz];
				C100 = txx[iy*n1*n2+(ix+1)*n1+iz];
				C010 = txx[iy*n1*n2+ix*n1+iz+1];
				C001 = txx[(iy+1)*n1*n2+ix*n1+iz];
				C110 = txx[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = txx[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = txx[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = txx[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_txx[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.tyy) {
				C000 = tyy[iy*n1*n2+ix*n1+iz];
				C100 = tyy[iy*n1*n2+(ix+1)*n1+iz];
				C010 = tyy[iy*n1*n2+ix*n1+iz+1];
				C001 = tyy[(iy+1)*n1*n2+ix*n1+iz];
				C110 = tyy[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = tyy[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = tyy[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = tyy[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_tyy[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.tzz) {
				C000 = tzz[iy*n1*n2+ix*n1+iz];
				C100 = tzz[iy*n1*n2+(ix+1)*n1+iz];
				C010 = tzz[iy*n1*n2+ix*n1+iz+1];
				C001 = tzz[(iy+1)*n1*n2+ix*n1+iz];
				C110 = tzz[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = tzz[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = tzz[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = tzz[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_tzz[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.txz) {
				C000 = txz[iy*n1*n2+ix*n1+iz];
				C100 = txz[iy*n1*n2+(ix+1)*n1+iz];
				C010 = txz[iy*n1*n2+ix*n1+iz+1];
				C001 = txz[(iy+1)*n1*n2+ix*n1+iz];
				C110 = txz[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = txz[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = txz[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = txz[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_txz[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.txy) {
				C000 = txy[iy*n1*n2+ix*n1+iz];
				C100 = txy[iy*n1*n2+(ix+1)*n1+iz];
				C010 = txy[iy*n1*n2+ix*n1+iz+1];
				C001 = txy[(iy+1)*n1*n2+ix*n1+iz];
				C110 = txy[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = txy[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = txy[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = txy[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_txy[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.tyz) {
				C000 = tyz[iy*n1*n2+ix*n1+iz];
				C100 = tyz[iy*n1*n2+(ix+1)*n1+iz];
				C010 = tyz[iy*n1*n2+ix*n1+iz+1];
				C001 = tyz[(iy+1)*n1*n2+ix*n1+iz];
				C110 = tyz[iy*n1*n2+(ix+1)*n1+iz+1];
				C101 = tyz[(iy+1)*n1*n2+(ix+1)*n1+iz];
				C011 = tyz[(iy+1)*n1*n2+ix*n1+iz+1];
				C111 = tyz[(iy+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_tyz[irec*rec.nt+isam] = C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.pp) {
				C000 = (vx[iy*n1*n2+ix2*n1+iz]-vx[iy*n1*n2+ix*n1+iz] +
						vy[iy2*n1*n2+ix*n1+iz]-vy[iy*n1*n2+ix*n1+iz] +
						vz[iy*n1*n2+ix*n1+iz2]-vz[iy*n1*n2+ix*n1+iz])/mod.dx;
				C100 = (vx[iy*n1*n2+(ix2+1)*n1+iz]-vx[iy*n1*n2+(ix+1)*n1+iz] +
						vy[iy2*n1*n2+(ix+1)*n1+iz]-vy[iy*n1*n2+(ix+1)*n1+iz] +
						vz[iy*n1*n2+(ix+1)*n1+iz2]-vz[iy*n1*n2+(ix+1)*n1+iz])/mod.dx;
				C010 = (vx[iy*n1*n2+ix2*n1+iz+1]-vx[iy*n1*n2+ix*n1+iz+1] +
						vy[iy2*n1*n2+ix*n1+iz+1]-vy[iy*n1*n2+ix*n1+iz+1] +
						vz[iy*n1*n2+ix*n1+iz2+1]-vz[iy*n1*n2+ix*n1+iz+1])/mod.dx;
				C001 = (vx[(iy+1)*n1*n2+ix2*n1+iz]-vx[(iy+1)*n1*n2+ix*n1+iz] +
						vy[(iy2+1)*n1*n2+ix*n1+iz]-vy[(iy+1)*n1*n2+ix*n1+iz] +
						vz[(iy+1)*n1*n2+ix*n1+iz2]-vz[(iy+1)*n1*n2+ix*n1+iz])/mod.dx;
				C110 = (vx[iy*n1*n2+(ix2+1)*n1+iz+1]-vx[iy*n1*n2+(ix+1)*n1+iz+1] +
						vy[iy2*n1*n2+(ix+1)*n1+iz+1]-vy[iy*n1*n2+(ix+1)*n1+iz+1] +
						vz[iy*n1*n2+(ix+1)*n1+iz2+1]-vz[iy*n1*n2+(ix+1)*n1+iz+1])/mod.dx;
				C101 = (vx[(iy+1)*n1*n2+(ix2+1)*n1+iz]-vx[(iy+1)*n1*n2+(ix+1)*n1+iz] +
						vy[(iy2+1)*n1*n2+(ix+1)*n1+iz]-vy[(iy+1)*n1*n2+(ix+1)*n1+iz] +
						vz[(iy+1)*n1*n2+(ix+1)*n1+iz2]-vz[(iy+1)*n1*n2+(ix+1)*n1+iz])/mod.dx;
				C011 = (vx[(iy+1)*n1*n2+ix2*n1+iz+1]-vx[(iy+1)*n1*n2+ix*n1+iz+1] +
						vy[(iy2+1)*n1*n2+ix*n1+iz+1]-vy[(iy+1)*n1*n2+ix*n1+iz+1] +
						vz[(iy+1)*n1*n2+ix*n1+iz2+1]-vz[(iy+1)*n1*n2+ix*n1+iz+1])/mod.dx;
				C111 = (vx[(iy+1)*n1*n2+(ix2+1)*n1+iz+1]-vx[(iy+1)*n1*n2+(ix+1)*n1+iz+1] +
						vy[(iy2+1)*n1*n2+(ix+1)*n1+iz+1]-vy[(iy+1)*n1*n2+(ix+1)*n1+iz+1] +
						vz[(iy+1)*n1*n2+(ix+1)*n1+iz2+1]-vz[(iy+1)*n1*n2+(ix+1)*n1+iz+1])/mod.dx;
				rec_pp[irec*rec.nt+isam] =  C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.ss) {
				C000 = 	(vx[iy2*n1*n2+ix2*n1+iz2]-vx[iy*n1*n2+ix2*n1+iz] -
						(vy[iy2*n1*n2+ix2*n1+iz2]-vy[iy2*n1*n2+ix*n1+iz]) -
						(vz[iy2*n1*n2+ix2*n1+iz2]-vz[iy*n1*n2+ix*n1+iz2]))/mod.dx;
				C100 =	(vx[iy2*n1*n2+(ix2+1)*n1+iz2]-vx[iy*n1*n2+(ix2+1)*n1+iz] -
						(vy[iy2*n1*n2+(ix2+1)*n1+iz2]-vy[iy2*n1*n2+(ix+1)*n1+iz]) -
						(vz[iy2*n1*n2+(ix2+1)*n1+iz2]-vz[iy*n1*n2+(ix+1)*n1+iz2]))/mod.dx;
				C010 =	(vx[iy2*n1*n2+ix2*n1+iz2+1]-vx[iy*n1*n2+ix2*n1+iz+1] -
						(vy[iy2*n1*n2+ix2*n1+iz2+1]-vy[iy2*n1*n2+ix*n1+iz+1]) -
						(vz[iy2*n1*n2+ix2*n1+iz2+1]-vz[iy*n1*n2+ix*n1+iz2+1]))/mod.dx;
				C001 =	(vx[(iy2+1)*n1*n2+ix2*n1+iz2]-vx[(iy+1)*n1*n2+ix2*n1+iz] -
						(vy[(iy2+1)*n1*n2+ix2*n1+iz2]-vy[(iy2+1)*n1*n2+ix*n1+iz]) -
						(vz[(iy2+1)*n1*n2+ix2*n1+iz2]-vz[(iy+1)*n1*n2+ix*n1+iz2]))/mod.dx;
				C110 =	(vx[iy2*n1*n2+(ix2+1)*n1+iz2+1]-vx[iy*n1*n2+(ix2+1)*n1+iz+1] -
						(vy[iy2*n1*n2+(ix2+1)*n1+iz2+1]-vy[iy2*n1*n2+(ix+1)*n1+iz+1]) -
						(vz[iy2*n1*n2+(ix2+1)*n1+iz2+1]-vz[iy*n1*n2+(ix+1)*n1+iz2+1]))/mod.dx;
				C101 =	(vx[(iy2+1)*n1*n2+(ix2+1)*n1+iz2]-vx[(iy+1)*n1*n2+(ix2+1)*n1+iz] -
						(vy[(iy2+1)*n1*n2+(ix2+1)*n1+iz2]-vy[(iy2+1)*n1*n2+(ix+1)*n1+iz]) -
						(vz[(iy2+1)*n1*n2+(ix2+1)*n1+iz2]-vz[(iy+1)*n1*n2+(ix+1)*n1+iz2]))/mod.dx;
				C011 =	(vx[(iy2+1)*n1*n2+ix2*n1+iz2+1]-vx[(iy+1)*n1*n2+ix2*n1+iz+1] -
						(vy[(iy2+1)*n1*n2+ix2*n1+iz2+1]-vy[(iy2+1)*n1*n2+ix*n1+iz+1]) -
						(vz[(iy2+1)*n1*n2+ix2*n1+iz2+1]-vz[(iy+1)*n1*n2+ix*n1+iz2+1]))/mod.dx;
				C111 =	(vx[(iy2+1)*n1*n2+(ix2+1)*n1+iz2+1]-vx[(iy+1)*n1*n2+(ix2+1)*n1+iz+1] -
						(vy[(iy2+1)*n1*n2+(ix2+1)*n1+iz2+1]-vy[(iy2+1)*n1*n2+(ix+1)*n1+iz+1]) -
						(vz[(iy2+1)*n1*n2+(ix2+1)*n1+iz2+1]-vz[(iy+1)*n1*n2+(ix+1)*n1+iz2+1]))/mod.dx;
				rec_ss[irec*rec.nt+isam] =  C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.vz) {
				C000 = vz[iy*n1*n2+ix*n1+iz2];
				C100 = vz[iy*n1*n2+(ix+1)*n1+iz2];
				C010 = vz[iy*n1*n2+ix*n1+iz2+1];
				C001 = vz[(iy+1)*n1*n2+ix*n1+iz2];
				C110 = vz[iy*n1*n2+(ix+1)*n1+iz2+1];
				C101 = vz[(iy+1)*n1*n2+(ix+1)*n1+iz2];
				C011 = vz[(iy+1)*n1*n2+ix*n1+iz2+1];
				C111 = vz[(iy+1)*n1*n2+(ix+1)*n1+iz2+1];
				rec_vz[irec*rec.nt+isam] =  C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.vy) {
				C000 = vy[iy2*n1*n2+ix*n1+iz];
				C100 = vy[iy2*n1*n2+(ix+1)*n1+iz];
				C010 = vy[iy2*n1*n2+ix*n1+iz+1];
				C001 = vy[(iy2+1)*n1*n2+ix*n1+iz];
				C110 = vy[iy2*n1*n2+(ix+1)*n1+iz+1];
				C101 = vy[(iy2+1)*n1*n2+(ix+1)*n1+iz];
				C011 = vy[(iy2+1)*n1*n2+ix*n1+iz+1];
				C111 = vy[(iy2+1)*n1*n2+(ix+1)*n1+iz+1];
				rec_vy[irec*rec.nt+isam] =  C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			if (rec.type.vx) {
				C000 = vy[iy*n1*n2+ix2*n1+iz];
				C100 = vy[iy*n1*n2+(ix2+1)*n1+iz];
				C010 = vy[iy*n1*n2+ix2*n1+iz+1];
				C001 = vy[(iy+1)*n1*n2+ix2*n1+iz];
				C110 = vy[iy*n1*n2+(ix2+1)*n1+iz+1];
				C101 = vy[(iy+1)*n1*n2+(ix2+1)*n1+iz];
				C011 = vy[(iy+1)*n1*n2+ix2*n1+iz+1];
				C111 = vy[(iy+1)*n1*n2+(ix2+1)*n1+iz+1];
				rec_vx[irec*rec.nt+isam] =  C000*(1.0-rdx)*(1.0-rdz)*(1.0-rdy) +
                                            C100*rdx*(1.0-rdz)*(1.0-rdy) +
										    C010*(1.0-rdx)*rdz*(1.0-rdy) +
										    C001*(1.0-rdx)*(1.0-rdz)*rdy +
                                            C110*rdx*rdz*(1.0-rdy) +
											C101*rdx*(1.0-rdz)*rdy +
											C011*(1.0-rdx)*rdz*rdy +
											C111*rdx*rdz*rdy;
			}
			
		}
		else { /* read values directly from the grid points */
			if (verbose>=4 && isam==0) {
				vmess("Receiver %li read at gridpoint ix=%li iy=%li iz=%li",irec, ix, iy, iz);
			}
			/* interpolation of receivers to same time step is only done for acoustic scheme */
			if (rec.type.p) {
				if (rec.int_p == 1) {
					if (mod.ischeme == 1) { /* interpolate Tzz times -1/2 Dt backward to Vz times */
                        dvx = c1*(vx[iy*n1*n2+(ix+1)*n1+iz] - vx[iy*n1*n2+ix*n1+iz]) +
                              c2*(vx[iy*n1*n2+(ix+2)*n1+iz] - vx[iy*n1*n2+(ix-1)*n1+iz]);
                        dvy = c1*(vy[(iy+1)*n1*n2+ix*n1+iz] - vy[iy*n1*n2+ix*n1+iz]) +
                              c2*(vy[(iy+2)*n1*n2+ix*n1+iz] - vy[(iy-1)*n1*n2+ix*n1+iz]);
                        dvz = c1*(vz[iy*n1*n2+ix*n1+iz+1]   - vz[iy*n1*n2+ix*n1+iz]) +
                              c2*(vz[iy*n1*n2+ix*n1+iz+2]   - vz[iy*n1*n2+ix*n1+iz-1]);
                        field = tzz[iy*n1*n2+ix*n1+iz] + (1.0/2.0)*l2m[iy][ix][iz]*(dvx+dvy+dvz);
                        dvx = c1*(vx[iy*n1*n2+(ix+1)*n1+iz1] - vx[iy*n1*n2+ix*n1+iz1]) +
                              c2*(vx[iy*n1*n2+(ix+2)*n1+iz1] - vx[iy*n1*n2+(ix-1)*n1+iz1]);
                        dvy = c1*(vy[(iy+1)*n1*n2+ix*n1+iz1] - vy[iy*n1*n2+ix*n1+iz1]) +
                              c2*(vy[(iy+2)*n1*n2+ix*n1+iz1] - vy[(iy-1)*n1*n2+ix*n1+iz1]);
                        dvz = c1*(vz[iy*n1*n2+ix*n1+iz1+1]   - vz[iy*n1*n2+ix*n1+iz1]) +
                              c2*(vz[iy*n1*n2+ix*n1+iz1+2]   - vz[iy*n1*n2+ix*n1+iz1-1]);
                        field += tzz[iy*n1*n2+ix*n1+iz1] + (1.0/2.0)*l2m[iy][ix][iz1]*(dvx+dvy+dvz);
						rec_p[irec*rec.nt+isam] = 0.5*field;
					}
					else {
						rec_p[irec*rec.nt+isam] = 0.5*(tzz[iy*n1*n2+ix*n1+iz1]+tzz[iy*n1*n2+ix*n1+iz]);
					}
				}
				else if (rec.int_p == 2) {
					if (mod.ischeme == 1) { /* interpolate Tzz times -1/2 Dt backward to Vx times */
                        dvx = c1*(vx[iy*n1*n2+(ix+1)*n1+iz] - vx[iy*n1*n2+ix*n1+iz]) +
                              c2*(vx[iy*n1*n2+(ix+2)*n1+iz] - vx[iy*n1*n2+(ix-1)*n1+iz]);
                        dvy = c1*(vy[(iy+1)*n1*n2+ix*n1+iz] - vy[iy*n1*n2+ix*n1+iz]) +
                              c2*(vy[(iy+2)*n1*n2+ix*n1+iz] - vy[(iy-1)*n1*n2+ix*n1+iz]);
                        dvz = c1*(vz[iy*n1*n2+ix*n1+iz+1]   - vz[iy*n1*n2+ix*n1+iz]) +
                              c2*(vz[iy*n1*n2+ix*n1+iz+2]   - vz[iy*n1*n2+ix*n1+iz-1]);
                        field = tzz[iy*n1*n2+ix*n1+iz] + (1.0/2.0)*l2m[iy][ix][iz]*(dvx+dvy+dvz);
                        dvx = c1*(vx[iy*n1*n2+(ix1+1)*n1+iz] - vx[iy*n1*n2+ix1*n1+iz]) +
                              c2*(vx[iy*n1*n2+(ix1+2)*n1+iz] - vx[iy*n1*n2+(ix1-1)*n1+iz]);
                        dvy = c1*(vy[(iy+1)*n1*n2+ix1*n1+iz] - vy[iy*n1*n2+ix1*n1+iz]) +
                              c2*(vy[(iy+2)*n1*n2+ix1*n1+iz] - vy[(iy-1)*n1*n2+ix1*n1+iz]);
                        dvz = c1*(vz[iy*n1*n2+ix1*n1+iz+1]   - vz[iy*n1*n2+ix1*n1+iz]) +
                              c2*(vz[iy*n1*n2+ix1*n1+iz+2]   - vz[iy*n1*n2+ix1*n1+iz-1]);
                        field += tzz[iy*n1*n2+ix1*n1+iz] + (1.0/2.0)*l2m[iy][ix][iz]*(dvx+dvy+dvz);
						rec_p[irec*rec.nt+isam] = 0.5*field;
					}
					else {
						rec_p[irec*rec.nt+isam] = 0.5*(tzz[iy*n1*n2+ix1*n1+iz]+tzz[iy*n1*n2+ix*n1+iz]);
					}
				}
				else {
					rec_p[irec*rec.nt+isam] = tzz[iy*n1*n2+ix*n1+iz];
				}
			}
			if (rec.type.txx) rec_txx[irec*rec.nt+isam] = txx[iy*n1*n2+ix*n1+iz];
			if (rec.type.tyy) rec_tyy[irec*rec.nt+isam] = tyy[iy*n1*n2+ix*n1+iz];
			if (rec.type.tzz) rec_tzz[irec*rec.nt+isam] = tzz[iy*n1*n2+ix*n1+iz];
			if (rec.type.txz) { /* time interpolation to be done */
				if (rec.int_vz == 2 || rec.int_vx == 2) {
					rec_txz[irec*rec.nt+isam] = 0.125*(
							txz[iy*n1*n2+ix*n1+iz]  + txz[iy*n1*n2+ix*n1+iz2]+
							txz[iy2*n1*n2+ix*n1+iz] + txz[iy2*n1*n2+ix*n1+iz2]+
							txz[iy*n1*n2+ix2*n1+iz]  + txz[iy*n1*n2+ix2*n1+iz2]+
							txz[iy2*n1*n2+ix2*n1+iz] + txz[iy2*n1*n2+ix2*n1+iz2]);
				}
				else {
					rec_txz[irec*rec.nt+isam] = txz[iy2*n1*n2+ix2*n1+iz2];
				}
			}
			if (rec.type.pp) {
				rec_pp[irec*rec.nt+isam] = (vx[iy*n1*n2+ix2*n1+iz]-vx[iy*n1*n2+ix*n1+iz] +
											vy[iy2*n1*n2+ix*n1+iz]-vy[iy*n1*n2+ix*n1+iz] +
											vz[iy*n1*n2+ix*n1+iz2]-vz[iy*n1*n2+ix*n1+iz])/mod.dx;
			}
			if (rec.type.ss) {
				rec_ss[irec*rec.nt+isam] = (vx[iy2*n1*n2+ix2*n1+iz2]-vx[iy*n1*n2+ix2*n1+iz] -
										   (vy[iy2*n1*n2+ix2*n1+iz2]-vy[iy2*n1*n2+ix*n1+iz]) -
										   (vz[iy2*n1*n2+ix2*n1+iz2]-vz[iy*n1*n2+ix*n1+iz2]))/mod.dx;
			}
			if (rec.type.vz) {
/* interpolate vz to vx position to the right and above of vz */
				if (rec.int_vz == 1) {
					rec_vz[irec*rec.nt+isam] = 0.125*(
							vz[iy*n1*n2+ix*n1+iz2]+vz[iy*n1*n2+ix1*n1+iz2]+
							vz[iy*n1*n2+ix*n1+iz] +vz[iy*n1*n2+ix1*n1+iz]+
							vz[iy1*n1*n2+ix*n1+iz2]+vz[iy1*n1*n2+ix1*n1+iz2]+
							vz[iy1*n1*n2+ix*n1+iz] +vz[iy1*n1*n2+ix1*n1+iz]);
				}
/* interpolate vz to Txx/Tzz position by taking the mean of 2 values */
				else if (rec.int_vz == 2) {
					if (mod.ischeme == 1) { /* interpolate Vz times +1/2 Dt forward to P times */
                        field = vz[iy*n1*n2+ix*n1+iz] - 0.5*roz[iy][ix][iz]*(
                        	c1*(tzz[iy*n1*n2+ix*n1+iz]   - tzz[iy*n1*n2+ix*n1+iz-1]) +
                        	c2*(tzz[iy*n1*n2+ix*n1+iz+1] - tzz[iy*n1*n2+ix*n1+iz-2]));
                        field += vz[iy*n1*n2+ix*n1+iz2] - 0.5*roz[iy][ix][iz2]*(
                        	c1*(tzz[iy*n1*n2+ix*n1+iz2]   - tzz[iy*n1*n2+ix*n1+iz2-1]) +
                        	c2*(tzz[iy*n1*n2+ix*n1+iz2+1] - tzz[iy*n1*n2+ix*n1+iz2-2]));
						rec_vz[irec*rec.nt+isam] = 0.5*field;
					}
					else {
						rec_vz[irec*rec.nt+isam] = 0.5*(vz[iy*n1*n2+ix*n1+iz2]+vz[iy*n1*n2+ix*n1+iz]);
					}
				}
				else {
					rec_vz[irec*rec.nt+isam] = vz[iy*n1*n2+ix*n1+iz2];
					//rec_vz[irec*rec.nt+isam] = vz[ix*n1+iz];
					//fprintf(stderr,"isam=%li vz[%li]=%e vz[%li]=%e vz[%li]=%e \n",isam, iz-1,vz[ix*n1+iz-1],iz,vz[ix*n1+iz], iz+1, vz[ix*n1+iz+1]);
				}
			}
			if (rec.type.vx) {
/* interpolate vx to vz position to the left and below of vx */
				if (rec.int_vx == 1) {
					rec_vx[irec*rec.nt+isam] = 0.125*(
							vx[iy*n1*n2+ix2*n1+iz]+vx[iy*n1*n2+ix2*n1+iz1]+
							vx[iy*n1*n2+ix*n1+iz]+vx[iy*n1*n2+ix*n1+iz1]+
							vx[iy2*n1*n2+ix2*n1+iz]+vx[iy2*n1*n2+ix2*n1+iz1]+
							vx[iy2*n1*n2+ix*n1+iz]+vx[iy2*n1*n2+ix*n1+iz1]);
				}
/* interpolate vx to Txx/Tzz position by taking the mean of 2 values */
				else if (rec.int_vx == 2) {
					if (mod.ischeme == 1) { /* interpolate Vx times +1/2 Dt forward to P times */
            			field = vx[iy*n1*n2+ix*n1+iz] - 0.5*rox[iy][ix][iz]*(
                			c1*(tzz[iy*n1*n2+ix*n1+iz]     - tzz[iy*n1*n2+(ix-1)*n1+iz]) +
                			c2*(tzz[iy*n1*n2+(ix+1)*n1+iz] - tzz[iy*n1*n2+(ix-2)*n1+iz]));
            			field += vx[ix2*n1+iz] - 0.5*rox[iy][ix2][iz]*(
                			c1*(tzz[iy*n1*n2+ix2*n1+iz]     - tzz[iy*n1*n2+(ix2-1)*n1+iz]) +
                			c2*(tzz[iy*n1*n2+(ix2+1)*n1+iz] - tzz[iy*n1*n2+(ix2-2)*n1+iz]));
						rec_vx[irec*rec.nt+isam] = 0.5*field;
					}
					else {
						rec_vx[irec*rec.nt+isam] = 0.5*(vx[iy*n1*n2+ix2*n1+iz]+vx[iy*n1*n2+ix*n1+iz]);
					}
				}
				else {
					rec_vx[irec*rec.nt+isam] = vx[iy*n1*n2+ix2*n1+iz];
				}
			}
		}

	} /* end of irec loop */
	/* store all x-values on z-level for P Vz for up-down decomposition */
	if (rec.type.ud) {
		iz = rec.z[0]+ibndz;
		iz2 = iz+1;
		vz_t = (float *)calloc(2*mod.nax*mod.nay,sizeof(float));
		/* P and Vz are staggered in time and need to correct for this */
		/* -1- compute Vz at next time step and average with current time step */
		lroz = mod.dt/(mod.dx*rec.rho);
    	for (iy=mod.ioZy; iy<mod.ieZy; iy++) {
			for (ix=mod.ioZx; ix<mod.ieZx; ix++) {
				vz_t[iy*mod.nax+ix] = vz[iy*n1*n2+ix*n1+iz] - lroz*(
							c1*(tzz[iy*n1*n2+ix*n1+iz]   - tzz[iy*n1*n2+ix*n1+iz-1]) +
							c2*(tzz[iy*n1*n2+ix*n1+iz+1] - tzz[iy*n1*n2+ix*n1+iz-2]));
				vz_t[iy*mod.nax+mod.nay*mod.nax+ix] = vz[iy*n1*n2+ix*n1+iz2] - lroz*(
							c1*(tzz[iy*n1*n2+ix*n1+iz2]   - tzz[iy*n1*n2+ix*n1+iz2-1]) +
							c2*(tzz[iy*n1*n2+ix*n1+iz2+1] - tzz[iy*n1*n2+ix*n1+iz2-2]));
			}
		}
		for (iy=0; iy<mod.nay; iy++) {
			for (ix=0; ix<mod.nax; ix++) {
				/* -2- compute average in time and depth to get Vz at same depth and time as P */
				rec_udvz[iy*mod.nax*rec.nt+ix*rec.nt+isam] = 0.25*(vz[iy*n1*n2+ix*n1+iz2]+vz[iy*n1*n2+ix*n1+iz]+vz_t[iy*mod.nax+mod.nay*mod.nax+ix]+vz_t[iy*mod.nax+ix]);
				rec_udp[iy*mod.nax*rec.nt+ix*rec.nt+isam]  = tzz[iy*n1*n2+ix*n1+iz];
			}
		}
		free(vz_t);
	}

	return 0;
}