Skip to content
Snippets Groups Projects
boundaries.c 51.48 KiB
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include"fdacrtmc.h"

const static float c1=1.125, c2=-0.0416666666666667;
static float *Pxpml, *Pzpml, *Vxpml, *Vzpml, *sigmu, *RA;
static int allocated=0;

void vmess(char *fmt, ...);

int initPML(modPar *mod, bndPar *bnd, int verbose){
	float sigmax;
	size_t ib;

	/* Allocate Sigmu & RA */
	Pxpml=(float*)malloc(2*mod->naz*bnd->ntap*sizeof(float));
	Pzpml=(float*)malloc(2*mod->nax*bnd->ntap*sizeof(float));
	Vxpml=(float*)malloc(2*mod->naz*bnd->ntap*sizeof(float));
	Vzpml=(float*)malloc(2*mod->nax*bnd->ntap*sizeof(float));
	sigmu=(float*)malloc(bnd->ntap*sizeof(float));
	RA   =(float*)malloc(bnd->ntap*sizeof(float));

	/* Compute Sigmu & RA */
	sigmax=((3.0*mod->cp_min)/(2.0*(bnd->ntap-1)*mod->dx))*log(1.0/bnd->R);
	for(ib=0;ib<bnd->ntap;ib++){ /* ib=0 interface between PML and interior */
		sigmu[ib]=sigmax*pow((float)(ib/(bnd->ntap-1.0)),bnd->m);
		RA[ib]=(1.0)/(1.0+0.5*mod->dt*sigmu[ib]);
//		if(verbose>3) vmess("PML: sigmax=%e cp=%e sigmu[%d]=%e %e",sigmax,mod->cp_min,ib,sigmu[ib],RA[ib]);
	}
	return(0);
}
int zeroPML(modPar *mod, bndPar *bnd){
	/* Reinitializes PML boundaries */
	memset(Pxpml,0,2*mod->naz*bnd->ntap*sizeof(float));
	memset(Pzpml,0,2*mod->nax*bnd->ntap*sizeof(float));
	memset(Vxpml,0,2*mod->naz*bnd->ntap*sizeof(float));
	memset(Vzpml,0,2*mod->nax*bnd->ntap*sizeof(float));
	return(0);
}
void freePML(void){
	free(Pxpml);
	free(Pzpml);
	free(Vxpml);
	free(Vzpml);
	free(sigmu);
	free(RA);
	return;
}

int boundariesP(modPar *mod, bndPar *bnd, wavPar *wav, size_t itime, int verbose){
/*********************************************************************

   AUTHOR:
           Jan Thorbecke (janth@xs4all.nl)
           The Netherlands 

***********************************************************************/
	size_t ix, iz, ib, ibx, ibz;
	size_t ixo, ixe, izo, ize;
	size_t ipml;
	float dpx, dpz, *p;
	float Jx, Jz, rho, d;

/************************************************************/
/* rigid boundary condition clears velocities on boundaries */
/************************************************************/
	if(bnd->top==3){ /* rigid surface at top */
#pragma omp for private (ix, iz) nowait
#pragma ivdep
		for(ix=mod->ioZxb;ix<mod->ieZxb;ix++){
			for(iz=0;iz<mod->ioZzb;iz++){
				wav->vz[ix*mod->naz+iz]=-wav->vz[ix*mod->naz+2*mod->ioXzb-1-iz];
			}
		}
	}
	if(bnd->rig==3){ /* rigid surface at right */
#pragma omp for private (ix, iz) nowait
#pragma ivdep
		for(iz=mod->ioXzb;iz<mod->ieXzb;iz++){
			for(ix=0;ix<mod->ioXxb;ix++){
				wav->vx[(mod->ieXxb+ix)*mod->naz+iz]=-wav->vx[(mod->ieXxb-1-ix)*mod->naz+iz];
			}
		}
	}
	if(bnd->bot==3){ /* rigid surface at bottom */
#pragma omp for private (ix, iz) nowait
#pragma ivdep
		for(ix=mod->ioZxb;ix<mod->ieZxb;ix++){
			for(iz=0;iz<mod->ioZzb;iz++){
				wav->vz[ix*mod->naz+mod->ieZzb+iz]=-wav->vz[ix*mod->naz+mod->ieZzb-iz-1];
			}
		}
	}
	if(bnd->lef==3){ /* rigid surface at left */
#pragma omp for private (ix, iz) nowait
#pragma ivdep
		for(iz=mod->ioXzb;iz<mod->ieXzb;iz++){
			for(ix=0;ix<mod->ioXxb;ix++){
				wav->vx[ix*mod->naz+iz]=-wav->vx[(2*mod->ioXxb-1-ix)*mod->naz+iz];
			}
		}
	}

/************************************************************/
/*** PML boundaries : only for acoustic 4th order scheme   **/
/************************************************************/
#pragma omp barrier
	if (mod->ischeme==1&&bnd->pml) { /* Acoustic scheme PML */
		p=wav->tzz; /* Tzz array pointer points to P-field */

		/* PML left Vx */
		if(bnd->lef==2){
			/* PML left Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for (iz=mod->ioXz;iz<mod->ieXz;iz++){
				for (ix=mod->ioXxb,ipml=bnd->ntap-1;ix<mod->ioXx;ix++,ipml--){
					dpx=c1*(p[ix*mod->naz+iz]-p[(ix-1)*mod->naz+iz]) +
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx=RA[ipml]*(dpx-mod->dt*Vxpml[iz*bnd->ntap+ipml]);
					Vxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML Vz-component same as default kernel */
#pragma omp for private (ix, iz)
			for(ix=mod->ioZxb;ix<mod->ioZx;ix++){
				for(iz=mod->ioZz;iz<mod->ieZz;iz++){
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*(
					                c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					                c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
				}
			}
		}

		/* PML corner left-top V */
		if (bnd->lef == 2 && bnd->top == 2) {
			/* PML left Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for(iz=mod->ioXzb;iz<mod->ioXz;iz++){
				for(ix=mod->ioXxb,ipml=bnd->ntap-1;ix<mod->ioXx;ix++,ipml--){
					dpx=c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx=RA[ipml]*(dpx-mod->dt*Vxpml[iz*bnd->ntap+ipml]);
					Vxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML top Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for(ix=mod->ioZxb;ix<mod->ioZx;ix++){
				for (iz=mod->ioZzb,ipml=bnd->ntap-1;iz<mod->ioZz;iz++,ipml--){
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					     c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[ix*bnd->ntap+ipml]);
					Vzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
		}

		/* PML right V */
		if(bnd->rig==2){
			/* PML right Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for (iz=mod->ioXz;iz<mod->ieXz;iz++){
				for (ix=mod->ieXx,ipml=0;ix<mod->ieXxb;ix++,ipml++) {
					dpx=c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx = RA[ipml]*(dpx-mod->dt*Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]);
					Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML Vz-component same as default kernel */
#pragma omp for private (ix, iz)
			for (ix=mod->ieZx;ix<mod->ieZx+bnd->ntap;ix++) {
				for (iz=mod->ioZz;iz<mod->ieZz;iz++) {
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*(
					                         c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1]) +
					                         c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
				}
			}
		}

		/* PML corner right-top V */
		if(bnd->rig==2&&bnd->top==2){
			/* PML right Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for(iz=mod->ioXzb;iz<mod->ioXz;iz++) {
				for(ix=mod->ieXx,ipml=0;ix<mod->ieXxb;ix++,ipml++) {
					dpx=c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx=RA[ipml]*(dpx-mod->dt*Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]);
					Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML top Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for(ix=mod->ieZx;ix<mod->ieZxb;ix++){
				for(iz=mod->ioZzb,ipml=bnd->ntap-1;iz<mod->ioZz;iz++,ipml--){
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					     c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[ix*bnd->ntap+ipml]);
					Vzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
		}

		/* PML top V */
		if(bnd->top==2){
			/* PML top Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for(ix=mod->ioZx;ix<mod->ieZx;ix++){
				ipml = bnd->ntap-1;
				for (iz=mod->ioZzb,ipml=bnd->ntap-1;iz<mod->ioZz;iz++,ipml--){
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					     c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[ix*bnd->ntap+ipml]);
					Vzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML top Vx-component same as default kernel */
#pragma omp for private (ix, iz)
			for (ix=mod->ioXx; ix<mod->ieXx; ix++) {
				for (iz=mod->ioXz-bnd->ntap; iz<mod->ioXz; iz++) {
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*(
					                         c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz]) +
					                         c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]));
				}
			}
		}

		/* PML bottom V */
		if(bnd->bot==2){
			/* PML bottom Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for(ix=mod->ioZx;ix<mod->ieZx;ix++){
				for(iz=mod->ieZz,ipml=0;iz<mod->ieZzb;iz++,ipml++){
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					     c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]);
					Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML bottom Vx-component same as default kernel */
#pragma omp for private (ix, iz)
			for(ix=mod->ioXx;ix<mod->ieXx;ix++){
				for(iz=mod->ieXz;iz<mod->ieXzb;iz++) {
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*(
					                c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					                c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]));
				}
			}
		}

		/* PML corner left-bottom */
		if(bnd->bot==2&&bnd->lef==2) {
			/* PML bottom Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for (ix=mod->ioZxb;ix<mod->ioZx; ix++) {
				for(iz=mod->ieZz,ipml=0;iz<mod->ieZzb;iz++,ipml++) {
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					       c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]);
					Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML left Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for(iz=mod->ieXz;iz<mod->ieXzb;iz++){
				for(ix=mod->ioXxb,ipml=bnd->ntap-1;ix<mod->ioXx;ix++,ipml--){
					dpx=c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx=RA[ipml]*(dpx-mod->dt*Vxpml[iz*bnd->ntap+ipml]);
					Vxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
		}

		/* PML corner right-bottom */
		if(bnd->bot==2&&bnd->rig==2){
			/* PML bottom Vz-component */
#pragma omp for private (ix, iz, dpz, Jz, ipml)
			for(ix=mod->ieZx;ix<mod->ieZxb;ix++){
				for (iz=mod->ieZz,ipml=0;iz<mod->ieZzb;iz++){
					dpz=(c1*(p[ix*mod->naz+iz]  -p[ix*mod->naz+iz-1])+
					     c2*(p[ix*mod->naz+iz+1]-p[ix*mod->naz+iz-2]));
					Jz=RA[ipml]*(dpz-mod->dt*Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]);
					Vzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML right Vx-component */
#pragma omp for private (ix, iz, dpx, Jx, ipml)
			for(iz=mod->ieXz;iz<mod->ieXzb;iz++){
				ipml = 0;
				for(ix=mod->ieXx,ipml=0;ix<mod->ieXx+bnd->ntap;ix++,ipml++){
					dpx=c1*(p[ix*mod->naz+iz]    -p[(ix-1)*mod->naz+iz])+
					    c2*(p[(ix+1)*mod->naz+iz]-p[(ix-2)*mod->naz+iz]);
					Jx=RA[ipml]*(dpx-mod->dt*Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]);
					Vxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*Jx;
				}
			}
		}
	} /* end acoustic PML */

/************************************************************/
/* Tapered boundaries for both elastic and acoustic schemes */
/* compute all field values in tapered areas                */
/************************************************************/

	/**********/
	/*  Top   */
	/**********/
	if (bnd->top==4) {
		if (mod->ischeme <= 2) { /* Acoustic scheme */
			/* Vx field */
			ixo = mod->ioXx;
			ixe = mod->ieXx;
			izo = mod->ioXzb;
			ize = mod->ioXz;
			ib = (bnd->ntap+izo-1);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]    -wav->tzz[(ix-1)*mod->naz+iz]) +
									c2*(wav->tzz[(ix+1)*mod->naz+iz]-wav->tzz[(ix-2)*mod->naz+iz]));
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[ib-iz];
				}
			}
			/* right top corner */
			if (bnd->rig==4) {
				ixo = mod->ieXx;
				ixe = ixo+bnd->ntap;
				ibz = (bnd->ntap+izo-1);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]     - wav->tzz[(ix-1)*mod->naz+iz]) +
									c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* left top corner */
			if (bnd->lef==4) {
				ixo = mod->ioXx-bnd->ntap;
				ixe = mod->ioXx;
				ibz = (bnd->ntap+izo-1);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[(ix-1)*mod->naz+iz]) +
									c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* Vz field */
			ixo = mod->ioZx;
			ixe = mod->ieZx;
			izo = mod->ioZz-bnd->ntap;
			ize = mod->ioZz;
			ib = (bnd->ntap+izo-1);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
								c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[ib-iz];
				}
			}
			/* right top corner */
			if (bnd->rig==4) {
				ixo = mod->ieZx;
				ixe = ixo+bnd->ntap;
				ibz = (bnd->ntap+izo-1);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
									c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* left top corner */
			if (bnd->lef==4) {
				ixo = mod->ioZx-bnd->ntap;
				ixe = mod->ioZx;
				ibz = (bnd->ntap+izo-1);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
									c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(ibz-iz)];
					}
				}
			}
		}else{ /* Elastic scheme */
			/* Vx field */
			ixo=mod->ioXx;
			ixe=mod->ieXx;
			izo=mod->ioXz-bnd->ntap;
			ize=mod->ioXz;
			ib = (bnd->ntap+izo-1);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*(
					                         c1*(wav->txx[ix*mod->naz+iz]    -wav->txx[(ix-1)*mod->naz+iz]+
					                             wav->txz[ix*mod->naz+iz+1]  -wav->txz[ix*mod->naz+iz])+
					                         c2*(wav->txx[(ix+1)*mod->naz+iz]-wav->txx[(ix-2)*mod->naz+iz]+
					                             wav->txz[ix*mod->naz+iz+2]  -wav->txz[ix*mod->naz+iz-1]));
					wav->vx[ix*mod->naz+iz]*=bnd->tapx[ib-iz];
				}
			}
			/* right top corner */
			if (bnd->rig==4) {
				ixo = mod->ieXx;
				ixe = ixo+bnd->ntap;
				ibz = (bnd->ntap+izo-1);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->txx[ix*mod->naz+iz]	 - wav->txx[(ix-1)*mod->naz+iz] +
										wav->txz[ix*mod->naz+iz+1]   - wav->txz[ix*mod->naz+iz])	+
									c2*(wav->txx[(ix+1)*mod->naz+iz] - wav->txx[(ix-2)*mod->naz+iz] +
										wav->txz[ix*mod->naz+iz+2]   - wav->txz[ix*mod->naz+iz-1])  );
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* left top corner */
			if (bnd->lef==4) {
				ixo = mod->ioXx-bnd->ntap;
				ixe = mod->ioXx;
				ibz = (bnd->ntap+izo-1);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->txx[ix*mod->naz+iz]	 - wav->txx[(ix-1)*mod->naz+iz] +
										wav->txz[ix*mod->naz+iz+1]   - wav->txz[ix*mod->naz+iz])	+
									c2*(wav->txx[(ix+1)*mod->naz+iz] - wav->txx[(ix-2)*mod->naz+iz] +
										wav->txz[ix*mod->naz+iz+2]   - wav->txz[ix*mod->naz+iz-1])  );
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* Vz field */
			ixo = mod->ioZx;
			ixe = mod->ieZx;
			izo = mod->ioZz-bnd->ntap;
			ize = mod->ioZz;
			ib = (bnd->ntap+izo-1);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[ib-iz];
				}
			}
			/* right top corner */
			if (bnd->rig==4) {
				ixo = mod->ieZx;
				ixe = ixo+bnd->ntap;
				ibz = (bnd->ntap+izo-1);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(ibz-iz)];
					}
				}
			}
			/* left top corner */
			if (bnd->lef==4) {
				ixo = mod->ioZx-bnd->ntap;
				ixe = mod->ioZx;
				ibz = (bnd->ntap+izo-1);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(ibz-iz)];
					}
				}
			}
		} /* end elastic scheme */
	}

	/**********/
	/* Bottom */
	/**********/
	if(bnd->bot==4){
		if(mod->ischeme<=2){ /* Acoustic scheme */
			/* Vx field */
			ixo=mod->ioXx;
			ixe=mod->ieXx;
			izo=mod->ieXz;
			ize=mod->ieXz+bnd->ntap;
			ib =(ize-bnd->ntap);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[(ix-1)*mod->naz+iz]) +
								c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[iz-ib];
				}
			}
			/* right bottom corner */
			if (bnd->rig==4) {
				ixo = mod->ieXx;
				ixe = ixo+bnd->ntap;
				ibz = (izo);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[(ix-1)*mod->naz+iz]) +
									c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* left bottom corner */
			if (bnd->lef==4) {
				ixo = mod->ioXx-bnd->ntap;
				ixe = mod->ioXx;
				ibz = (izo);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[(ix-1)*mod->naz+iz]) +
									c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* Vz field */
			ixo = mod->ioZx;
			ixe = mod->ieZx;
			izo = mod->ieZz;
			ize = mod->ieZz+bnd->ntap;
			
			ib = (ize-bnd->ntap);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
								c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[iz-ib];
				}
			}
			/* right bottom corner */
			if (bnd->rig==4) {
				ixo = mod->ieZx;
				ixe = ixo+bnd->ntap;
				ibz = (izo);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
									c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
									c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* left bottom corner */
			if (bnd->lef==4) {
				ixo = mod->ioZx-bnd->ntap;
				ixe = mod->ioZx;
				ibz = (izo);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*(
						                         c1*(wav->tzz[ix*mod->naz+iz]  -wav->tzz[ix*mod->naz+iz-1])+
						                         c2*(wav->tzz[ix*mod->naz+iz+1]-wav->tzz[ix*mod->naz+iz-2]));
						wav->vz[ix*mod->naz+iz]*=bnd->tapxz[(ibx-ix)*bnd->ntap+(iz-ibz)];
					}
				}
			}
		}else{ /* Elastic scheme */
			/* Vx field */
			ixo = mod->ioXx;
			ixe = mod->ieXx;
			izo = mod->ieXz;
			ize = mod->ieXz+bnd->ntap;
			ib = (ize-bnd->ntap);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->txx[ix*mod->naz+iz]	 - wav->txx[(ix-1)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+1]   - wav->txz[ix*mod->naz+iz])	+
								c2*(wav->txx[(ix+1)*mod->naz+iz] - wav->txx[(ix-2)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+2]   - wav->txz[ix*mod->naz+iz-1])  );
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[iz-ib];
				}
			}
			/* right bottom corner */
			if (bnd->rig==4) {
				ixo = mod->ieXx;
				ixe = ixo+bnd->ntap;
				ibz = (izo);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->txx[ix*mod->naz+iz]	 - wav->txx[(ix-1)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+1]   - wav->txz[ix*mod->naz+iz])	+
								c2*(wav->txx[(ix+1)*mod->naz+iz] - wav->txx[(ix-2)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+2]   - wav->txz[ix*mod->naz+iz-1])  );
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* left bottom corner */
			if (bnd->lef==4) {
				ixo = mod->ioXx-bnd->ntap;
				ixe = mod->ioXx;
				ibz = (izo);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->txx[ix*mod->naz+iz]	 - wav->txx[(ix-1)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+1]   - wav->txz[ix*mod->naz+iz])	+
								c2*(wav->txx[(ix+1)*mod->naz+iz] - wav->txx[(ix-2)*mod->naz+iz] +
									wav->txz[ix*mod->naz+iz+2]   - wav->txz[ix*mod->naz+iz-1])  );
						wav->vx[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* Vz field */
			ixo = mod->ioZx;
			ixe = mod->ieZx;
			izo = mod->ieZz;
			ize = mod->ieZz+bnd->ntap;
			ib = (ize-bnd->ntap);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[iz-ib];
				}
			}
 			/* right bottom corner */
			if (bnd->rig==4) {
				ixo = mod->ieZx;
				ixe = ixo+bnd->ntap;
				ibz = (izo);
				ibx = (ixo);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ix-ibx)*bnd->ntap+(iz-ibz)];
					}
				}
			}
			/* left bottom corner */
			if (bnd->lef==4) {
				ixo = mod->ioZx-bnd->ntap;
				ixe = mod->ioZx;
				ibz = (izo);
				ibx = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
				for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
					for (iz=izo; iz<ize; iz++) {
						wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
						wav->vz[ix*mod->naz+iz]   *= bnd->tapxz[(ibx-ix)*bnd->ntap+(iz-ibz)];
					}
				}
			}
		} /* end elastic scheme */
	}

	/**********/
	/*  Left  */
	/**********/
	if (bnd->lef==4){
		if (mod->ischeme <= 2) { /* Acoustic scheme */
			/* Vx field */
			ixo = mod->ioXx-bnd->ntap;
			ixe = mod->ioXx;
			izo = mod->ioXz;
			ize = mod->ieXz;
			ib = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[(ix-1)*mod->naz+iz]) +
								c2*(wav->tzz[(ix+1)*mod->naz+iz] - wav->tzz[(ix-2)*mod->naz+iz]));
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[ib-ix];
				}
			}
			/* Vz field */
			ixo = mod->ioZx-bnd->ntap;
			ixe = mod->ioZx;
			izo = mod->ioZz;
			ize = mod->ieZz;
			ib = (bnd->ntap+ixo-1);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]   - wav->tzz[ix*mod->naz+iz-1]) +
								c2*(wav->tzz[ix*mod->naz+iz+1] - wav->tzz[ix*mod->naz+iz-2]));
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[ib-ix];
				}
			}
		}else { /* Elastic scheme */
			/* Vx field */
			ixo = mod->ioXx-bnd->ntap;
			ixe = mod->ioXx;
			izo = mod->ioXz;
			ize = mod->ieXz;
			ib = (bnd->ntap+ixo-1);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->txx[ix*mod->naz+iz]    -wav->txx[(ix-1)*mod->naz+iz]+
									wav->txz[ix*mod->naz+iz+1]  -wav->txz[ix*mod->naz+iz])+
								c2*(wav->txx[(ix+1)*mod->naz+iz]-wav->txx[(ix-2)*mod->naz+iz]+
									wav->txz[ix*mod->naz+iz+2]  -wav->txz[ix*mod->naz+iz-1]));
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[ib-ix];
				}
			}
			/* Vz field */
			ixo = mod->ioZx-bnd->ntap;
			ixe = mod->ioZx;
			izo = mod->ioZz;
			ize = mod->ieZz;
			ib = (bnd->ntap+ixo-1);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz] -= mod->roz[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]	 - wav->tzz[ix*mod->naz+iz-1] +
									wav->txz[(ix+1)*mod->naz+iz] - wav->txz[ix*mod->naz+iz])  +
								c2*(wav->tzz[ix*mod->naz+iz+1]   - wav->tzz[ix*mod->naz+iz-2] +
									wav->txz[(ix+2)*mod->naz+iz] - wav->txz[(ix-1)*mod->naz+iz])  );
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[ib-ix];
				}
			}
		} /* end elastic scheme */
	}
	/**********/
	/* Right  */
	/**********/
	if(bnd->rig==4){
		if(mod->ischeme<=2){ /* Acoustic scheme */
			/* Vx field */
			ixo = mod->ieXx;
			ixe = mod->ieXx+bnd->ntap;
			izo = mod->ioXz;
			ize = mod->ieXz;
			ib = (ixe-bnd->ntap);
#pragma omp for private(ix,iz)
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vx[ix*mod->naz+iz] -= mod->rox[ix*mod->naz+iz]*(
								c1*(wav->tzz[ix*mod->naz+iz]    -wav->tzz[(ix-1)*mod->naz+iz])+
								c2*(wav->tzz[(ix+1)*mod->naz+iz]-wav->tzz[(ix-2)*mod->naz+iz]));
					wav->vx[ix*mod->naz+iz]   *= bnd->tapx[ix-ib];
				}
			}
			/* Vz field */
#pragma omp for private (ix, iz) 
			for(ix=mod->ieZx;ix<mod->ieZx+bnd->ntap;ix++) {
#pragma ivdep
				for(iz=mod->ioZz;iz<mod->ieZz;iz++) {
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*(
					                         c1*(wav->tzz[ix*mod->naz+iz]  -wav->tzz[ix*mod->naz+iz-1])+
					                         c2*(wav->tzz[ix*mod->naz+iz+1]-wav->tzz[ix*mod->naz+iz-2]));
					wav->vz[ix*mod->naz+iz]*=bnd->tapz[ix-mod->ieZx];
				}
			}
		
		}else{ /* Elastic scheme */
			/* Vx field */
#pragma omp for private(ix,iz)
			for(ix=mod->ieXx;ix<mod->ieXx+bnd->ntap;ix++){
#pragma ivdep
				for(iz=mod->ioXz;iz<mod->ieXz;iz++){
					wav->vx[ix*mod->naz+iz]-=mod->rox[ix*mod->naz+iz]*(
					                         c1*(wav->txx[ix*mod->naz+iz]    -wav->txx[(ix-1)*mod->naz+iz]+
					                             wav->txz[ix*mod->naz+iz+1]  -wav->txz[ix*mod->naz+iz])	+
					                         c2*(wav->txx[(ix+1)*mod->naz+iz]-wav->txx[(ix-2)*mod->naz+iz]+
					                             wav->txz[ix*mod->naz+iz+2]  -wav->txz[ix*mod->naz+iz-1]));
					wav->vx[ix*mod->naz+iz]*=bnd->tapx[ix-mod->ieXx];
				}
			}
			/* Vz field */
			ixo = mod->ieZx;
			ixe = mod->ieZx+bnd->ntap;
			izo = mod->ioZz;
			ize = mod->ieZz;
			ib = (ixe-bnd->ntap);
#pragma omp for private (ix, iz) 
			for (ix=ixo; ix<ixe; ix++) {
#pragma ivdep
				for (iz=izo; iz<ize; iz++) {
					wav->vz[ix*mod->naz+iz]-=mod->roz[ix*mod->naz+iz]*(
					                         c1*(wav->tzz[ix*mod->naz+iz]    -wav->tzz[ix*mod->naz+iz-1]+
					                             wav->txz[(ix+1)*mod->naz+iz]-wav->txz[ix*mod->naz+iz]) +
					                         c2*(wav->tzz[ix*mod->naz+iz+1]  -wav->tzz[ix*mod->naz+iz-2]+
					                             wav->txz[(ix+2)*mod->naz+iz]-wav->txz[(ix-1)*mod->naz+iz]));
					wav->vz[ix*mod->naz+iz] *= bnd->tapz[ix-ib];
				}
			}
/*			for (ix=ixo-5; ix<ixo+5; ix++) {
				for (iz=0; iz<5; iz++) {
					fprintf(stderr,"edge ix=%d iz=%d vz=%e roz=%e tzz=%e txz=%e txx=%e lam=%e l2m=%e\n",ix,iz,wav->vz[ix*mod->naz+iz],mod->roz[ix*mod->naz+iz],wav->tzz[ix*mod->naz+iz],wav->txz[ix*mod->naz+iz],wav->txx[ix*mod->naz+iz],mod->lam[ix*mod->naz+iz],mod->l2m[ix*mod->naz+iz]);
				}
			}*/
		} /* end elastic scheme */

	}

/**************************************************************/
/* Circular boundaries for both elastic and acoustic schemes. */
/* Set boundary to values on other grid side. Bnd. Type= 999  */
/**************************************************************/

	/*****************/
	/*  Top & Bottom */
	/*****************/
	if(bnd->top==999){
		if(bnd->bot==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
			for(ix=mod->ioZxb;ix<=mod->ieZxb;ix++){
				for(iz=0;iz<=mod->ioZzb;iz++){
//					wav->vz[ix*mod->naz+iz]           =wav->vz[ix*mod->naz+mod->ieZzb-1-iz]; //Top
//					wav->vz[ix*mod->naz+mod->ieZzb+iz]=wav->vz[ix*mod->naz+mod->ioZzb+iz]; //Bottom
					wav->vz[ix*mod->naz+iz]           =wav->vz[ix*mod->naz+mod->ieZzb-mod->ioZzb-1+iz]; //Top
					wav->vz[ix*mod->naz+mod->ieZzb+iz]=wav->vz[ix*mod->naz+mod->ioZzb+iz]; //Bottom
				}
			}
		}else{
#pragma omp for private (ix,iz) nowait
#pragma ivdep
			for(ix=mod->ioZxb;ix<=mod->ieZxb;ix++){
				for(iz=0;iz<=mod->ioZzb;iz++){
//					wav->vz[ix*mod->naz+iz]=wav->vz[ix*mod->naz+mod->ieZzb-1-iz]; //Top
					wav->vz[ix*mod->naz+iz]=wav->vz[ix*mod->naz+mod->ieZzb-mod->ioZzb-1+iz]; //Top
				}
			}
		}
	}else if(bnd->bot==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=mod->ioZxb;ix<=mod->ieZxb;ix++){
			for(iz=0;iz<=mod->ioZzb;iz++){
//				wav->vz[ix*mod->naz+mod->ieZzb+iz]=wav->vz[ix*mod->naz+mod->ioZzb+iz]; //Bottom
				wav->vz[ix*mod->naz+mod->ieZzb+iz]=wav->vz[ix*mod->naz+mod->ioZzb+iz]; //Bottom
			}
		}
	}

	/*********/
	/* Left  */
	/*********/
	if(bnd->lef==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=0;ix<mod->ioXxb;ix++){
			for(iz=mod->ioXzb;iz<=mod->ieXzb;iz++){
				wav->vx[ix*mod->naz+iz]=wav->vx[(mod->ieXxb-mod->ioXxb-1+ix)*mod->naz+iz]; //Left
			}
		}
	}

	/*********/
	/* Right */
	/*********/
	if(bnd->rig==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=0;ix<mod->ioXxb;ix++){
			for(iz=mod->ioXzb;iz<=mod->ieXzb;iz++){
				wav->vx[(mod->ieXxb+ix)*mod->naz+iz]=wav->vx[(mod->ioXxb+ix)*mod->naz+iz]; //Right
			}
		}
	}

	return(0);
}

int boundariesV(modPar *mod, bndPar *bnd, wavPar *wav, size_t itime, int verbose){
/*********************************************************************

   AUTHOR:
           Jan Thorbecke (janth@xs4all.nl)
           The Netherlands 

***********************************************************************/

	float dp, dvx, dvz;
	size_t ix, iz, izp, ib;
	size_t ixo, ixe, izo, ize;
	size_t ipml;
	float *p;
	float Jx, Jz, d;

/************************************************************/
/* PML boundaries for acoustic schemes                      */
/* compute all field values in tapered areas                */
/************************************************************/
#pragma omp barrier
	if(mod->ischeme==1&&bnd->pml){ /* Acoustic scheme PML's */
		p=wav->tzz; /* Tzz array pointer points to P-field */
		/* PML top P */
		if(bnd->top==2){
			/* PML top P-Vz-component */
#pragma omp for private (ix, iz, dvx, dvz, Jz, ipml) 
			for(ix=mod->ioPx;ix<mod->iePx;ix++){
				for(iz=mod->ioPzb,ipml=bnd->ntap-1;iz<mod->ioPz;iz++,ipml--){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]  -wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]  -wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[ix*bnd->ntap+ipml];
					Pzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*(Jz+dvx);
				}
			}
		}
		/* PML left P */
		if(bnd->lef==2){
			/* PML left P-Vx-component */
#pragma omp for private (ix, iz, dvx, dvz, Jx, ipml)
			for (iz=mod->ioPz; iz<mod->iePz; iz++) {
				for(ix=mod->ioPxb,ipml=bnd->ntap-1;ix<mod->ioPx;ix++,ipml--){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]  -wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]  -wav->vz[ix*mod->naz+iz-1]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[iz*bnd->ntap+ipml];
					Pxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*(Jx+dvz);
				}
			}
		}
		/* PML corner left-top P */
		if(bnd->lef==2&&bnd->top==2){
			/* PML left P-Vx-component */
#pragma omp for private (ix, iz, dvx, Jx, ipml) 
			for (iz=mod->ioPzb; iz<mod->ioPz; iz++){
				for(ix=mod->ioPxb,ipml=bnd->ntap-1;ix<mod->ioPx;ix++,ipml--){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[iz*bnd->ntap+ipml];
					Pxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML top P-Vz-component */
#pragma omp for private (ix, iz, dvz, Jz, ipml) 
			for(ix=mod->ioPxb;ix<mod->ioPx;ix++){
				for(iz=mod->ioPzb,ipml=bnd->ntap-1;iz<mod->ioPz;iz++,ipml--){
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]-wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]-wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[ix*bnd->ntap+ipml];
					Pzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jz;
				}
			}
		}
		/* PML right P */
		if(bnd->rig==2){
			/* PML right P Vx-component */
#pragma omp for private (ix, iz, dvx, dvz, Jx, ipml) 
			for (iz=mod->ioPz; iz<mod->iePz; iz++){
				for(ix=mod->iePx,ipml=0;ix<mod->iePxb;ix++,ipml++){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]  -wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]  -wav->vz[ix*mod->naz+iz-1]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml];
					Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*(Jx+dvz);
				}
			}
		}
		/* PML corner right-top P */
		if(bnd->rig==2&&bnd->top==2){
			/* PML right P Vx-component */
#pragma omp for private (ix, iz, dvx, Jx, ipml) 
			for (iz=mod->ioPz-bnd->ntap; iz<mod->ioPz; iz++) {
				for(ix=mod->iePx,ipml=0;ix<mod->iePxb;ix++,ipml++){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml];
					Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jx;
				}
			}
			/* PML top P-Vz-component */
#pragma omp for private (ix, iz, dvz, Jz, ipml) 
			for(ix=mod->iePx;ix<mod->iePxb;ix++){
				for(iz=mod->ioPzb,ipml=bnd->ntap-1;iz<mod->ioPz;iz++,ipml--){
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]-wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]-wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[ix*bnd->ntap+ipml];
					Pzpml[ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jz;
				}
			}
		}
		/* PML bottom P */
		if(bnd->bot==2){
			/* PML bottom P Vz-component */
#pragma omp for private (ix, iz, dvx, dvz, Jz, ipml)
			for (ix=mod->ioPx; ix<mod->iePx; ix++) {
				for(iz=mod->iePz,ipml=0;iz<mod->iePzb;iz++,ipml++){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]  -wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]  -wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml];
					Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*(Jz+dvx);
				}
			}
		}
		/* PML corner bottom-right P */
		if(bnd->bot==2&&bnd->rig==2){
			/* PML bottom P Vz-component */
#pragma omp for private (ix, iz, dvz, Jz, ipml)
			for (ix=mod->iePx;ix<mod->iePxb;ix++){
				for(iz=mod->iePz,ipml=0;iz<mod->iePzb;iz++,ipml++){
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]-wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]-wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml];
					Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML right P Vx-component */
#pragma omp for private (ix, iz, dvx, Jx, ipml)
			for(iz=mod->iePz;iz<mod->iePzb;iz++){
				for(ix=mod->iePx,ipml=0;ix<mod->iePxb;ix++,ipml++){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml];
					Pxpml[mod->naz*bnd->ntap+iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jx;
					//p[ix*mod->naz+iz] -= mod->l2m[ix*mod->naz+iz]*(dvx);
				}
			}
		}
		/* PML corner left-bottom P */
		if(bnd->bot==2&&bnd->lef==2){
			/* PML bottom P Vz-component */
#pragma omp for private (ix, iz, dvz, Jz, ipml)
			for(ix=mod->ioPxb;ix<mod->ioPx;ix++){
				for(iz=mod->iePz,ipml=0;iz<mod->iePzb;iz++,ipml++){
					dvz=c1*(wav->vz[ix*mod->naz+iz+1]-wav->vz[ix*mod->naz+iz])+
					    c2*(wav->vz[ix*mod->naz+iz+2]-wav->vz[ix*mod->naz+iz-1]);
					Jz=RA[ipml]*dvz-RA[ipml]*mod->dt*Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml];
					Pzpml[mod->nax*bnd->ntap+ix*bnd->ntap+ipml]+=sigmu[ipml]*Jz;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jz;
				}
			}
			/* PML left P Vx-component */
#pragma omp for private (ix, iz, dvx, Jx, ipml)
			for(iz=mod->iePz;iz<mod->iePzb;iz++){
				for(ix=mod->ioPxb,ipml=bnd->ntap-1;ix<mod->ioPx;ix++,ipml--){
					dvx=c1*(wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])+
					    c2*(wav->vx[(ix+2)*mod->naz+iz]-wav->vx[(ix-1)*mod->naz+iz]);
					Jx=RA[ipml]*dvx-RA[ipml]*mod->dt*Pxpml[iz*bnd->ntap+ipml];
					Pxpml[iz*bnd->ntap+ipml]+=sigmu[ipml]*Jx;
					p[ix*mod->naz+iz]-=mod->l2m[ix*mod->naz+iz]*Jx;
				}
			}
		}
	} /* end acoustic PML */
/****************************************************************/	
/* Free surface: calculate free surface conditions for stresses */
/****************************************************************/
	ixo=mod->ioPx;
	if(mod->ischeme<=2){ /* Acoustic scheme */
// NOTE: Boundaries applied at the end of getParameters.c by zeroing pressure boundary.
	}else{ /* Elastic scheme */
/* The implementation for a topgraphy surface is not yet correct */
		/* Free surface: calculate free surface conditions for stresses 
		 *   Conditions (for upper boundary):
		 *   1. Tzz = 0
		 *   2. Txz = 0
		 *   3. Txx: remove term with dVz/dz, computed in e2/e4 routines
		 *           and add extra term with dVx/dx,
		 *           corresponding to free-surface condition for Txx.
		 *           In this way, dVz/dz is not needed in computing Txx
		 *           on the upper stress free boundary. Other boundaries
		 *           are treated similar.
		 *           For the 4th order schemes, the whole virtual boundary
		 *           must be taken into account in the removal terms, 
		 *           because the algorithm sets
		 *           velocities on this boundary!
		 *
		 *  Compute the velocities on the virtual boundary to make interpolation
		 *  possible for receivers. 
		 */
		if (bnd->top==1) { /* free surface at top */
			izp = bnd->surface[mod->ioPx];
#pragma omp for private (ix, iz) 
			for (ix=mod->ioPx; ix<mod->iePx; ix++) {
				iz = bnd->surface[ix];
				if ( izp==iz ) {
					/* clear normal pressure */
					wav->tzz[ix*mod->naz+iz] = 0.0;
					/* This update to Vz might become unstable (2nd order scheme) */
//					wav->vz[ix*mod->naz+iz] = wav->vz[ix*mod->naz+iz+1] - (wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])*
//					mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
				}
				izp=iz;
			}
			izp = bnd->surface[mod->ioPx];
#pragma omp for private (ix, iz) 
			for (ix=mod->ioTx; ix<mod->ieTx; ix++) {
				iz = bnd->surface[ix];
				if ( izp==iz ) {
					/* assure that txz=0 on boundary by filling virtual boundary */
					wav->txz[ix*mod->naz+iz] = -wav->txz[ix*mod->naz+iz+1];
					/* extra line of txz has to be copied */
					wav->txz[ix*mod->naz+iz-1] = -wav->txz[ix*mod->naz+iz+2];
				}
				izp=iz;
			}
			/* calculate txx on top stress-free boundary */
			izp = bnd->surface[mod->ioPx];
#pragma omp for private (ix, iz, dp, dvx) 
			for (ix=mod->ioPx; ix<mod->iePx; ix++) {
				iz = bnd->surface[ix];
				if ( izp==iz ) {
					if (mod->l2m[ix*mod->naz+iz]!=0.0) {
						dp = mod->l2m[ix*mod->naz+iz]-mod->lam[ix*mod->naz+iz]*mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
						dvx=c1*(wav->vx[(ix+1)*mod->naz+iz] - wav->vx[(ix)*mod->naz+iz]) +
						    c2*(wav->vx[(ix+2)*mod->naz+iz] - wav->vx[(ix-1)*mod->naz+iz]);
						wav->txx[ix*mod->naz+iz] = -dvx*dp;
					}
				}
				izp=iz;
			}
			/* if surface has also left or right edges */
			izp = bnd->surface[mod->ioPx];
#pragma omp for private (ix, iz, dp, dvz) 
			for (ix=mod->ioPx+1; ix<mod->iePx; ix++) {
				iz = bnd->surface[ix-1];
				if ( izp < iz ) { /* right boundary */
					/* clear normal pressure */
					wav->txx[ix*mod->naz+iz] = 0.0;
					if ( (iz-izp) >= 2 ) { /* VR point */
						/* assure that txz=0 on boundary */
						wav->txz[(ix+1)*mod->naz+iz] = -wav->txz[ix*mod->naz+iz];
						wav->txz[(ix+2)*mod->naz+iz] = -wav->txz[(ix-1)*mod->naz+iz] ;
						/* calculate tzz on right stress-free boundary */
						if (mod->l2m[ix*mod->naz+iz]!=0.0) {
							dvz = c1*(wav->vz[ix*mod->naz+iz+1] - wav->vz[ix*mod->naz+iz]) +
							c2*(wav->vz[ix*mod->naz+iz+2] - wav->vz[ix*mod->naz+iz-1]);
							dp = mod->l2m[ix*mod->naz+iz]-mod->lam[ix*mod->naz+iz]*mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
							wav->tzz[ix*mod->naz+iz] = -dvz*dp;
						}
					}else{
						if (izp) { /* IR point */   
//							wav->txz[ix*mod->naz+iz] = -wav->txz[ix*mod->naz+iz+1] ;
//							wav->txz[ix*mod->naz+iz-1] = -wav->txz[ix*mod->naz+iz+2];
//							wav->txz[(ix+1)*mod->naz+iz] = -wav->txz[ix*mod->naz+iz];
//							wav->txz[(ix+2)*mod->naz+iz] = -wav->txz[(ix-1)*mod->naz+iz] ;
//							wav->tzz[ix*mod->naz+iz] = 0.0;
						}else{ /* OR point */
//							wav->txz[(ix-1)*mod->naz+iz] = 0.0;
//							wav->txz[(ix+1)*mod->naz+iz] = -wav->txz[ix*mod->naz+iz];
//							wav->txz[(ix+2)*mod->naz+iz] = -wav->txz[(ix-1)*mod->naz+iz] ;
//							if (mod->l2m[ix*mod->naz+iz]!=0.0) {
//								wav->vz[ix*mod->naz+iz] = wav->vz[ix*mod->naz+iz+1] - (wav->vx[(ix+1)*mod->naz+iz]-wav->vx[ix*mod->naz+iz])*
//								mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
//							}
						}
					}
				} /* end if right */
				if ( izp > iz ) { /* left boundary */
					/* clear normal pressure */
					wav->txx[ix*mod->naz+iz] = 0.0;
					/* assure that txz=0 on boundary */
					wav->txz[(ix-1)*mod->naz+iz] = -wav->txz[ix*mod->naz+iz];
					/* extra line of txz has to be copied */
					wav->txz[(ix-2)*mod->naz+iz] = -wav->txz[(ix+1)*mod->naz+iz] ;
					/* calculate tzz on left stress-free boundary */
					dvz = c1*(wav->vz[ix*mod->naz+iz+1] - wav->vz[ix*mod->naz+iz]) +
					c2*(wav->vz[ix*mod->naz+iz+2] - wav->vz[ix*mod->naz+iz-1]);
					if (mod->l2m[ix*mod->naz+iz]!=0.0) {
						dp = mod->l2m[ix*mod->naz+iz]-mod->lam[ix*mod->naz+iz]*mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
						wav->tzz[ix*mod->naz+iz] = -dvz*dp;
					}
				} /* end if left */
				izp=iz;
//				izp=bnd->surface[MAX(ix-2,0)];;
			} /* end ix loop */
		}
		if (bnd->rig==1) { /* free surface at right */
			ix = mod->iePx;
#pragma omp for private (ix, iz) 
			for (iz=mod->ioPz; iz<mod->iePz; iz++) {
				/* clear normal pressure */
				wav->txx[(ix)*mod->naz+iz] = 0.0;
			}
#pragma omp for private (ix, iz) 
			for (iz=mod->ioTz; iz<mod->ieTz; iz++) {
				/* assure that txz=0 on boundary by filling virtual boundary */
				wav->txz[(ix+1)*mod->naz+iz] = -wav->txz[(ix)*mod->naz+iz];
				/* extra line of wav->txz has to be copied */
				wav->txz[(ix+2)*mod->naz+iz] = -wav->txz[(ix-1)*mod->naz+iz] ;
			}
			/* calculate tzz on right stress-free boundary */
#pragma omp for private (iz) 
			for (iz=mod->ioPz; iz<mod->iePz; iz++) {
				dvz = c1*(wav->vz[(ix)*mod->naz+iz+1] - wav->vz[(ix)*mod->naz+iz]) +
					  c2*(wav->vz[(ix)*mod->naz+iz+2] - wav->vz[(ix)*mod->naz+iz-1]);
				if (mod->l2m[ix*mod->naz+iz]!=0.0) {
					dp = mod->l2m[(ix)*mod->naz+iz]-mod->lam[(ix)*mod->naz+iz]*mod->lam[(ix)*mod->naz+iz]/mod->l2m[(ix)*mod->naz+iz];
					wav->tzz[(ix)*mod->naz+iz] = -dvz*dp;
				}
			}
		}
		if (bnd->bot==1) { /* free surface at bottom */
			iz = mod->iePz;
#pragma omp for private (ix) 
			for (ix=mod->ioPx; ix<mod->iePx; ix++) {
				/* clear normal pressure */
				wav->tzz[ix*mod->naz+iz] = 0.0;
			}
#pragma omp for private (ix) 
			for (ix=mod->ioTx; ix<mod->ieTx; ix++) {
				/* assure that txz=0 on boundary by filling virtual boundary */
				wav->txz[ix*mod->naz+iz+1] = -wav->txz[ix*mod->naz+iz];
				/* extra line of wav->txz has to be copied */
				wav->txz[ix*mod->naz+iz+2] = -wav->txz[ix*mod->naz+iz-1];
			}
			/* calculate txx on bottom stress-free boundary */
#pragma omp for private (ix) 
			for (ix=mod->ioPx; ix<mod->iePx; ix++) {
				dvx = c1*(wav->vx[(ix+1)*mod->naz+iz] - wav->vx[ix*mod->naz+iz]) +
					  c2*(wav->vx[(ix+2)*mod->naz+iz] - wav->vx[(ix-1)*mod->naz+iz]);
				if (mod->l2m[ix*mod->naz+iz]!=0.0) {
					dp = mod->l2m[ix*mod->naz+iz]-mod->lam[ix*mod->naz+iz]*mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
					wav->txx[ix*mod->naz+iz] = -dvx*dp;
				}
			}
		}
		if (bnd->lef==1) { /* free surface at left */
			ix = mod->ioPx;
#pragma omp for private (iz) 
			for (iz=mod->ioPz; iz<mod->iePz; iz++) {
				/* clear normal pressure */
				wav->txx[ix*mod->naz+iz] = 0.0;
			}
#pragma omp for private (iz) 
			for (iz=mod->ioTz; iz<mod->ieTz; iz++) {
				/* assure that txz=0 on boundary by filling virtual boundary */
				wav->txz[(ix)*mod->naz+iz] = -wav->txz[(ix+1)*mod->naz+iz];
				/* extra line of wav->txz has to be copied */
				wav->txz[(ix-1)*mod->naz+iz] = -wav->txz[(ix+2)*mod->naz+iz] ;
			}
			/* calculate tzz on left stress-free boundary */
#pragma omp for private (iz) 
			for (iz=mod->ioPz; iz<mod->iePz; iz++) {
				dvz = c1*(wav->vz[ix*mod->naz+iz+1] - wav->vz[ix*mod->naz+iz]) +
				      c2*(wav->vz[ix*mod->naz+iz+2] - wav->vz[ix*mod->naz+iz-1]);
				if (mod->l2m[ix*mod->naz+iz]!=0.0) {
					dp = mod->l2m[ix*mod->naz+iz]-mod->lam[ix*mod->naz+iz]*mod->lam[ix*mod->naz+iz]/mod->l2m[ix*mod->naz+iz];
					wav->tzz[ix*mod->naz+iz] = -dvz*dp;
				}
			}
		}
	}

	/**************************************************************/
/* Circular boundaries for both elastic and acoustic schemes. */
/* Set boundary to values on other grid side. Bnd. Type= 999  */
/**************************************************************/

	/*****************/
	/*  Top & Bottom */
	/*****************/
	if(bnd->top==999){
		if(bnd->bot==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
			for(ix=mod->ioPxb;ix<=mod->iePxb;ix++){
				for(iz=0;iz<=mod->ioPzb;iz++){
					wav->tzz[ix*mod->naz+iz]           =wav->tzz[ix*mod->naz+mod->iePzb-mod->ioPzb-1+iz]; //Top
					wav->tzz[ix*mod->naz+mod->iePzb+iz]=wav->tzz[ix*mod->naz+mod->ioPzb+iz]; //Bottom
				}
			}
		}else{
#pragma omp for private (ix,iz) nowait
#pragma ivdep
			for(ix=mod->ioPxb;ix<=mod->iePxb;ix++){
				for(iz=0;iz<=mod->ioPzb;iz++){
					wav->tzz[ix*mod->naz+iz]=wav->tzz[ix*mod->naz+mod->iePzb-mod->ioPzb-1+iz]; //Top
				}
			}
		}
	}else if(bnd->bot==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=mod->ioPxb;ix<=mod->iePxb;ix++){
			for(iz=0;iz<=mod->ioPzb;iz++){
				wav->tzz[ix*mod->naz+mod->iePzb+iz]=wav->tzz[ix*mod->naz+mod->ioPzb+iz]; //Bottom
			}
		}
	}

	/*********/
	/* Left  */
	/*********/
	if(bnd->lef==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=0;ix<mod->ioPxb;ix++){
			for(iz=mod->ioPzb;iz<=mod->iePzb;iz++){
				wav->tzz[ix*mod->naz+iz]=wav->tzz[(mod->iePxb-mod->ioPxb-1+ix)*mod->naz+iz]; //Left
			}
		}
	}

	/*********/
	/* Right */
	/*********/
	if(bnd->rig==999){
#pragma omp for private (ix,iz) nowait
#pragma ivdep
		for(ix=0;ix<mod->ioPxb;ix++){
			for(iz=mod->ioPzb;iz<=mod->iePzb;iz++){
				wav->tzz[(mod->iePxb+ix)*mod->naz+iz]=wav->tzz[(mod->ioPxb+ix)*mod->naz+iz]; //Right
			}
		}
	}

	return(0);
}