diff --git a/fdelmodc3D/Makefile b/fdelmodc3D/Makefile
index cb9e49d998d477e2350c36ae8ee5c12aead90fa3..e3f21d2bd2a8f7636a8bde0f7bf7ce8784177db4 100644
--- a/fdelmodc3D/Makefile
+++ b/fdelmodc3D/Makefile
@@ -25,6 +25,7 @@ SRCC	= $(PRG).c \
 		acoustic6_3D.c \
 		acousticSH4_3D.c \
 		acoustic4_qr_3D.c \
+		elastic4dc_3D.c \
 		defineSource3D.c  \
 		getParameters3D.c  \
 		getWaveletInfo3D.c  \
diff --git a/fdelmodc3D/acoustic4_3D.c b/fdelmodc3D/acoustic4_3D.c
index f3c2c346f37b0b935d0f32ab3d8c466bf3b16ade..36316d652c7b0bbb1c4006368d18d0ad13003a1b 100644
--- a/fdelmodc3D/acoustic4_3D.c
+++ b/fdelmodc3D/acoustic4_3D.c
@@ -6,22 +6,26 @@
 
 #define MIN(x,y) ((x) < (y) ? (x) : (y))
 
-long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose);
-//long applySource(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float **src_nwav, long verbose);
+long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, 
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose);
 
-long storeSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
-//long storeSourceOnSurface(modPar mod, srcPar src, bndPar bnd, long ixsrc, long izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, long verbose);
+long storeSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
 
-long reStoreSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
-//long reStoreSourceOnSurface(modPar mod, srcPar src, bndPar bnd, long ixsrc, long izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, long verbose);
+long reStoreSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
 
-long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose);
-//long boundariesP(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose);
+long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
 
-long boundariesV3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose);
-//long boundariesV(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose);
+long boundariesV3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
 
-long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float **src_nwav, float *vx, float *vy, float *vz, float *p, float *rox, float *roy, float *roz, float *l2m, long verbose)
+long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float **src_nwav,
+    float *vx, float *vy, float *vz, float *p, float *rox, float *roy, float *roz, float *l2m, long verbose)
 {
 /*********************************************************************
        COMPUTATIONAL OVERVIEW OF THE 4th ORDER STAGGERED GRID: 
@@ -82,9 +86,8 @@ long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, lo
 	/* calculate vx for all grid points except on the virtual boundary*/
 #pragma omp for private (ix, iy, iz) nowait schedule(guided,1)
 	for (iy=mod.ioXy; iy<mod.ieXy; iy++) {
-//#pragma ivdep
         for (ix=mod.ioXx; ix<mod.ieXx; ix++) {
-       #pragma ivdep //deletar 
+       #pragma ivdep 
             for (iz=mod.ioXz; iz<mod.ieXz; iz++) {
                 vx[iy*n2*n1+ix*n1+iz] -= rox[iy*n2*n1+ix*n1+iz]*(
                     c1*(p[iy*n2*n1+ix*n1+iz]     - p[iy*n2*n1+(ix-1)*n1+iz]) +
@@ -96,9 +99,8 @@ long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, lo
 	/* calculate vy for all grid points except on the virtual boundary*/
 #pragma omp for private (ix, iy, iz) nowait schedule(guided,1)
 	for (iy=mod.ioYy; iy<mod.ieYy; iy++) {
-//#pragma ivdep
         for (ix=mod.ioYx; ix<mod.ieYx; ix++) {
-            #pragma ivdep //deletar
+            #pragma ivdep
             for (iz=mod.ioYz; iz<mod.ieYz; iz++) {
                 vy[iy*n2*n1+ix*n1+iz] -= roy[iy*n2*n1+ix*n1+iz]*(
                     c1*(p[iy*n2*n1+ix*n1+iz]     - p[(iy-1)*n2*n1+ix*n1+iz]) +
@@ -110,9 +112,8 @@ long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, lo
 	/* calculate vz for all grid points except on the virtual boundary */
 #pragma omp for private (ix, iy, iz) schedule(guided,1) 
 	for (iy=mod.ioZy; iy<mod.ieZy; iy++) {
-//#pragma ivdep
         for (ix=mod.ioZx; ix<mod.ieZx; ix++) {
-            #pragma ivdep //deletar
+            #pragma ivdep 
             for (iz=mod.ioZz; iz<mod.ieZz; iz++) {
                 vz[iy*n2*n1+ix*n1+iz] -= roz[iy*n2*n1+ix*n1+iz]*(
                     c1*(p[iy*n2*n1+ix*n1+iz]   - p[iy*n2*n1+ix*n1+iz-1]) +
@@ -142,12 +143,10 @@ long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, lo
 
 	/* calculate p/tzz for all grid points except on the virtual boundary */
 #pragma omp for private (ix, iy, iz) schedule(guided,1) 
-//#pragma omp for private (ix, iz) schedule(dynamic) 
 #pragma ivdep
 	for (ix=mod.ioPx; ix<mod.iePx; ix++) {
-//#pragma ivdep
 		for (iy=mod.ioPy; iy<mod.iePy; iy++) {
-            #pragma ivdep //deletar
+            #pragma ivdep
             for (iz=mod.ioPz; iz<mod.iePz; iz++) {
                 p[iy*n1*n2+ix*n1+iz] -= l2m[iy*n1*n2+ix*n1+iz]*(
                             c1*(vx[iy*n1*n2+(ix+1)*n1+iz] - vx[iy*n1*n2+ix*n1+iz]) +
@@ -156,11 +155,6 @@ long acoustic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, lo
                             c2*(vy[(iy+2)*n1*n2+ix*n1+iz] - vy[(iy-1)*n1*n2+ix*n1+iz]) +
                             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]));
-
-                                //checking //deletar   
-                if(iz==(izsrc+mod.ioPz+bnd.ntap) && ix==(ixsrc+mod.ioPx+bnd.ntap) && iy==(iysrc+mod.ioPy+bnd.ntap) ){
-                    //vmess("inloop--p[ix=%li,iy=%li,iz=%li] at itime %li has value %e", ix, iy, iz, itime, p[iy*n1*n2+ix*n1+iz]); //deletar
-                }
             }
         }
 	}
diff --git a/fdelmodc3D/applySource3D.c b/fdelmodc3D/applySource3D.c
index fa6437dab6aea1d48056c02a62228145728b9816..0a7d1f1165a4eb2d7c7f4c3bdcaa374fd205c1c0 100644
--- a/fdelmodc3D/applySource3D.c
+++ b/fdelmodc3D/applySource3D.c
@@ -20,14 +20,15 @@ void vmess(char *fmt, ...);
  *           The Netherlands 
  *
  **********************************************************************/
-//      applySource3D(mod, src,            wav,              bnd,        itime,      ixsrc,    iysrc,    izsrc,            vx,     vy,           vz,       p,        NULL,         NULL,         NULL,    NULL,       NULL,         rox,       roy,        roz,        l2m,          src_nwav,     verbose);
-long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose)
+long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc,
+	float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+	float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose)
 {
 	long is0, ibndz, ibndy, ibndx;
 	long isrc, ix, iy, iz, n1, n2;
 	long id1, id2, id3;
 	float src_ampl, time, scl, dt, sdx;
-	float Mxx, Myy, Mzz, Mxz, Myz, Mxy, rake;
+	float Mxx, Myy, Mzz, Mxz, Myz, Mxy;
 	static long first=1;
 
 	if (src.type==6) {
@@ -350,19 +351,22 @@ long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, l
                 }
 			}
             else if(src.type == 9) {
-				rake = 0.5*M_PI;
-				Mxx = -1.0*(sin(src.dip)*cos(rake)*sin(2.0*src.strike)+sin(src.dip*2.0)*sin(rake)*sin(src.strike)*sin(src.strike));
-				Mxz = -1.0*(cos(src.dip)*cos(rake)*cos(src.strike)+cos(src.dip*2.0)*sin(rake)*sin(src.strike));
-				Mzz = sin(src.dip*2.0)*sin(rake);
+				Mxx = -1.0*(sin(src.dip)*cos(src.rake)*sin(2.0*src.strike)+sin(src.dip*2.0)*sin(src.rake)*sin(src.strike)*sin(src.strike));
+				Myy = sin(src.dip)*cos(src.rake)*sin(2.0*src.strike)-sin(src.dip*2.0)*sin(src.rake)*cos(src.strike)*cos(src.strike);
+				Mzz = sin(src.dip*2.0)*sin(src.rake);
+				Mxz = -1.0*(cos(src.dip)*cos(src.rake)*cos(src.strike)+cos(src.dip*2.0)*sin(src.rake)*sin(src.strike));
+				Mxy = sin(src.dip)*cos(src.rake)*cos(src.strike*2.0)+0.5*(sin(src.dip*2.0)*sin(src.rake)*sin(src.strike*2.0));
+				Myz = -1.0*(cos(src.dip)*cos(src.rake)*sin(src.strike)-cos(src.dip*2.0)*sin(src.rake)*cos(src.strike));
 
 				txx[iy*n1*n2+ix*n1+iz] -= Mxx*src_ampl;
+				tyy[iy*n1*n2+ix*n1+iz] -= Myy*src_ampl;
 				tzz[iy*n1*n2+ix*n1+iz] -= Mzz*src_ampl;
 				txz[iy*n1*n2+ix*n1+iz] -= Mxz*src_ampl;
+				txy[iy*n1*n2+ix*n1+iz] -= Mxy*src_ampl;
+				tyz[iy*n1*n2+ix*n1+iz] -= Myz*src_ampl;
 			} /* src.type */
 		} /* ischeme */
 	} /* loop over isrc */
 
-
-
 	return 0;
-}
+}
\ No newline at end of file
diff --git a/fdelmodc3D/boundaries3D.c b/fdelmodc3D/boundaries3D.c
index 180e774d6ae6be26f7d07f14bfd3aef92eaeb617..8281c66e6db3dc7b1e34c946381aeec9c3711839 100644
--- a/fdelmodc3D/boundaries3D.c
+++ b/fdelmodc3D/boundaries3D.c
@@ -6,7 +6,9 @@
 
 void vmess(char *fmt, ...);
 
-long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose)
+long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+	float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+	float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long itime, long verbose)
 {
 /*********************************************************************
 Joeri's original filling order
@@ -77,7 +79,7 @@ MID 	left 	mid 	mid
     dy  = mod.dy;
     dt  = mod.dt;
     fac = dt/dx;
-    if ( (bnd.top==2) || (bnd.bot==2) || (bnd.lef==2) || (bnd.rig==2) ) pml=1;
+    if ( (bnd.top==2) || (bnd.bot==2) || (bnd.lef==2) || (bnd.rig==2) || (bnd.fro==2) || (bnd.bac==2) ) pml=1;
 	else pml=0;
 
 	ibnd = mod.iorder/2-1;
@@ -102,7 +104,6 @@ MID 	left 	mid 	mid
 
 	if (bnd.top==3) { /* rigid surface at top */
 #pragma omp for private (ix, iy, iz) nowait
-//#pragma ivdep
         for (iy=1; iy<=ny; iy++) {
         	#pragma ivdep
             for (ix=1; ix<=nx; ix++) {
@@ -116,7 +117,6 @@ MID 	left 	mid 	mid
 	}
 	if (bnd.rig==3) { /* rigid surface at right */
 #pragma omp for private (ix, iy, iz) nowait
-//#pragma ivdep
         for (iy=1; iy<=ny; iy++) {
         	#pragma ivdep
             for (iz=1; iz<=nz; iz++) {
@@ -220,7 +220,6 @@ MID 	left 	mid 	mid
 			ibz = (bnd.ntap+izo-1);
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
 					#pragma ivdep
 					for (iz=izo; iz<ize; iz++) {
@@ -242,7 +241,6 @@ MID 	left 	mid 	mid
 				ibx = (ixo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
@@ -263,7 +261,6 @@ MID 	left 	mid 	mid
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -285,7 +282,6 @@ MID 	left 	mid 	mid
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -315,7 +311,6 @@ MID 	left 	mid 	mid
 				ibx = (bnd.ntap+ixo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
@@ -335,7 +330,6 @@ MID 	left 	mid 	mid
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -357,7 +351,6 @@ MID 	left 	mid 	mid
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -383,7 +376,6 @@ MID 	left 	mid 	mid
 				iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
@@ -406,7 +398,6 @@ MID 	left 	mid 	mid
 				iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
@@ -433,7 +424,6 @@ MID 	left 	mid 	mid
 			ib = (bnd.ntap+izo-1);
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
 					#pragma ivdep
 					for (iz=izo; iz<ize; iz++) {
@@ -455,7 +445,6 @@ MID 	left 	mid 	mid
 				ibx = (ixo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
@@ -474,7 +463,6 @@ MID 	left 	mid 	mid
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -497,7 +485,6 @@ MID 	left 	mid 	mid
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
 							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
@@ -813,92 +800,109 @@ MID 	left 	mid 	mid
 				}
 			}
 		}
-		
-	}
 
-	/*********/
-	/* Bottom */
-	/*********/
-	if (bnd.bot==4) {
-		
-		if (mod.ischeme <= 2) { /* Acoustic scheme */
+		else { /* Elastic scheme */
 			
 			/* Vx field */
-			/* mid bottom mid vx*/
+			/* mid top mid vx */
 			ixo = mod.ioXx;
 			ixe = mod.ieXx;
 			iyo = mod.ioXy;
 			iye = mod.ieXy;
-			izo = mod.ieXz;
-			ize = mod.ieXz+bnd.ntap;
-			
-			ib = (ize-bnd.ntap);
+			izo = mod.ioXz-bnd.ntap;
+			ize = mod.ioXz;
+	
+			ibz = (bnd.ntap+izo-1);
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
+					#pragma ivdep
 					for (iz=izo; iz<ize; iz++) {
 						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 
-						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[iz-ib];
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ibz-iz];
 					}
 				}
 			}
-			/* right bottom mid corner vx */
+
+
+			/* right top mid corner vx */
 			if (bnd.rig==4) {
 				ixo = mod.ieXx;
 				ixe = mod.ieXx+bnd.ntap;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				ibx = (ixo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 		
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-				/* right bottom front corner vx */
+
+
+				/* right top front corner vx */
 				if (bnd.fro==4) {
 					iyo = mod.ioXy-bnd.ntap;
 					iye = mod.ioXy;
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 			
-								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-				/* right bottom back corner vx */
+		
+		
+				/* right top back corner vx */
 				if (bnd.bac==4) {
 					iyo = mod.ieXy;
 					iye = mod.ieXy+bnd.ntap;
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 			
-								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
@@ -909,187 +913,244 @@ MID 	left 	mid 	mid
 			ixe = mod.ieXx;
 			iyo = mod.ioXy;
 			iye = mod.ieXy;
-			izo = mod.ieXz;
-			ize = mod.ieXz+bnd.ntap;
+			izo = mod.ioXz-bnd.ntap;
+			ize = mod.ioXz;
 
-			/* left bottom mid corner vx*/
+			/* left top mid corner vx */
 			if (bnd.lef==4) {
 				ixo = mod.ioXx-bnd.ntap;
 				ixe = mod.ioXx;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				ibx = (bnd.ntap+ixo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 							
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-				/* left bottom front corner vx */
+
+				/* left top front corner vx */
 				if (bnd.fro==4) {
 					iyo = mod.ioXy-bnd.ntap;
 					iye = mod.ioXy;
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 			
-								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-				/* left bottom back corner vx*/
+
+
+				/* left top back corner vx */
 				if (bnd.bac==4) {
 					iyo = mod.ieXy;
 					iye = mod.ieXy+bnd.ntap;
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 			
-								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
 			}
-			/* mid bottom front corner vx */
+
+
+			/* mid top front corner vx */
 			if (bnd.fro==4) {
 				ixo = mod.ioXx;
 				ixe = mod.ieXx;
 				iyo = mod.ioXy-bnd.ntap;
 				iye = mod.ioXy;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 		
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
 			}
-			/*  mid bottom back corner vx */
+
+
+			/* mid top back corner vx */
 			if (bnd.bac==4) {
 				iyo = mod.ieXy;
 				iye = mod.ieXy+bnd.ntap;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 		
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-			}
-
+			}		
+	
 
 			/* Vy field */
-			/* mid bottom mid vy */
+			/* mid top mid vy */
 			ixo = mod.ioYx;
 			ixe = mod.ieYx;
 			iyo = mod.ioYy;
 			iye = mod.ieYy;
-			izo = mod.ieYz;
-			ize = mod.ieYz+bnd.ntap;
+			izo = mod.ioYz-bnd.ntap;
+			ize = mod.ioYz;
 	
-			ib = (ize-bnd.ntap);
+			ib = (bnd.ntap+izo-1);
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
+					#pragma ivdep
 					for (iz=izo; iz<ize; iz++) {
 						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 
-						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iz-ib];
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[ib-iz];
 					}
 				}
 			}
-			/* right bottom mid corner vy */
+	
+
+			/* right top mid corner vy */
 			if (bnd.rig==4) {
 				ixo = mod.ieYx;
-				ixe = ixo+bnd.ntap;
-				ibz = (izo);
+				ixe = mod.ieYx+bnd.ntap;
+				ibz = (bnd.ntap+izo-1);
 				ibx = (ixo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-				/* right bottom front corner vy */
+				/* right top front corner vy */
 				if (bnd.fro==4) {
 					iyo = mod.ioYy-bnd.ntap;
 					iye = mod.ioYy;
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-				/* right bottom back corner vy */
+
+	
+
+				/* right top back corner vy */
 				if (bnd.bac==4) {
 					iyo = mod.ieYy;
 					iye = mod.ieYy+bnd.ntap;
 					iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
-#pragma ivdep
+//#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
@@ -1099,14 +1160,15 @@ MID 	left 	mid 	mid
 			ixe = mod.ieYx;
 			iyo = mod.ioYy;
 			iye = mod.ieYy;
-			izo = mod.ieYz;
-			ize = mod.ieYz+bnd.ntap;
+			izo = mod.ioYz-bnd.ntap;
+			ize = mod.ioYz;
 
-			/* left bottom mid corner vy */
+
+			/* left top mid corner vy */
 			if (bnd.lef==4) {
 				ixo = mod.ioYx-bnd.ntap;
 				ixe = mod.ioYx;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				ibx = (bnd.ntap+ixo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
@@ -1114,14 +1176,19 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 							
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-				/* left bottom front corner vy */
+
+				/* left top front corner vy */
 				if (bnd.fro==4) {
 					iyo = mod.ioYy-bnd.ntap;
 					iye = mod.ioYy;
@@ -1132,15 +1199,20 @@ MID 	left 	mid 	mid
 						for (iy=iyo; iy<iye; iy++) {
 							for (iz=izo; iz<ize; iz++) {
 								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-				/* left bottom back corner vy */
+
+				/* left top back corner vy */
 				if (bnd.bac==4) {
 					iyo = mod.ieYy;
 					iye = mod.ieYy+bnd.ntap;
@@ -1151,22 +1223,26 @@ MID 	left 	mid 	mid
 						for (iy=iyo; iy<iye; iy++) {
 							for (iz=izo; iz<ize; iz++) {
 								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
 			}
-			/* mid bottom front corner vy */
+			/* front top mid corner vy */
 			if (bnd.fro==4) {
 				ixo = mod.ioYx;
 				ixe = mod.ieYx;
 				iyo = mod.ioYy-bnd.ntap;
 				iye = mod.ioYy;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
@@ -1174,19 +1250,23 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
 			}
-			/* mid bottom back corner vy */
+			/* back top mid corner vy */
 			if (bnd.bac==4) {
 				iyo = mod.ieYy;
 				iye = mod.ieYy+bnd.ntap;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
@@ -1194,10 +1274,14 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
@@ -1205,49 +1289,56 @@ MID 	left 	mid 	mid
 
 
 			/* Vz field */
+			/* mid top mid vz*/
 			ixo = mod.ioZx;
 			ixe = mod.ieZx;
 			iyo = mod.ioZy;
 			iye = mod.ieZy;
-			izo = mod.ieZz;
-			ize = mod.ieZz+bnd.ntap;
-			
-			ib = (ize-bnd.ntap);
+			izo = mod.ioZz-bnd.ntap;
+			ize = mod.ioZz;
+	
+			ib = (bnd.ntap+izo-1);
 #pragma omp for private (ix, iy, iz) 
 			for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
 					for (iz=izo; iz<ize; iz++) {
 						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
-						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[iz-ib];
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ib-iz];
 					}
 				}
 			}
-
-
-			/* right bottom corner */
+			/* right top mid corner vz */
 			if (bnd.rig==4) {
 				ixo = mod.ieZx;
 				ixe = ixo+bnd.ntap;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				ibx = (ixo);
-#pragma omp for private(ix,iy,iz)
+#pragma omp for private(ix,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
-							
-							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-
-				/* right bottom front corner */
+				/* right top front corner vz */
 				if (bnd.fro==4) {
 					iyo = mod.ioZy-bnd.ntap;
 					iye = mod.ioZy;
@@ -1258,18 +1349,19 @@ MID 	left 	mid 	mid
 						for (iy=iyo; iy<iye; iy++) {
 							for (iz=izo; iz<ize; iz++) {
 								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-
-
-
-				/* right bottom back corner */
+				/* right top back corner vz */
 				if (bnd.bac==4) {
 					iyo = mod.ieZy;
 					iye = mod.ieZy+bnd.ntap;
@@ -1280,63 +1372,74 @@ MID 	left 	mid 	mid
 						for (iy=iyo; iy<iye; iy++) {
 							for (iz=izo; iz<ize; iz++) {
 								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
 			}
-			
+
 			ixo = mod.ioZx;
 			ixe = mod.ieZx;
 			iyo = mod.ioZy;
 			iye = mod.ieZy;
-			izo = mod.ieZz;
-			ize = mod.ieZz+bnd.ntap;
+			izo = mod.ioZz-bnd.ntap;
+			ize = mod.ioZz;
 
-			/* left bottom corner */
+			/* left top mid corner vz */
 			if (bnd.lef==4) {
 				ixo = mod.ioZx-bnd.ntap;
 				ixe = mod.ioZx;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				ibx = (bnd.ntap+ixo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
-//#pragma ivdep
+#pragma ivdep
 					for (iy=iyo; iy<iye; iy++) {
-						#pragma ivdep
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 							
-							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
-				/* left bottom front corner */
+				/* left top front corner vz */
 				if (bnd.fro==4) {
 					iyo = mod.ioZy-bnd.ntap;
 					iye = mod.ioZy;
 					iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
 						for (iy=iyo; iy<iye; iy++) {
-							#pragma ivdep
 							for (iz=izo; iz<ize; iz++) {
 								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
-				/* left bottom back corner */
+				/* left top back corner vz */
 				if (bnd.bac==4) {
 					iyo = mod.ieZy;
 					iye = mod.ieZy+bnd.ntap;
@@ -1347,22 +1450,26 @@ MID 	left 	mid 	mid
 						for (iy=iyo; iy<iye; iy++) {
 							for (iz=izo; iz<ize; iz++) {
 								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 			
-								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(ibz-iz)];
 							}
 						}
 					}
 				}
 			}
-			/* front bottom corner */
+			/* mid top front corner vz */
 			if (bnd.fro==4) {
 				ixo = mod.ioZx;
 				ixe = mod.ieZx;
 				iyo = mod.ioZy-bnd.ntap;
 				iye = mod.ioZy;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (bnd.ntap+iyo-1);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
@@ -1370,19 +1477,23 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 		
-							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
 			}
-			/* Back bottom corner */
+			/* mid top back corner vz */
 			if (bnd.bac==4) {
 				iyo = mod.ieZy;
 				iye = mod.ieZy+bnd.ntap;
-				ibz = (izo);
+				ibz = (bnd.ntap+izo-1);
 				iby = (iyo);
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
@@ -1390,37 +1501,1753 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 		
-							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibz-iz)];
 						}
 					}
 				}
 			}
-			
 		}
+		
 	}
 
-
-	
 	/*********/
-	/* Left  */
+	/* Bottom */
+	/*********/
+	if (bnd.bot==4) {
+		
+		if (mod.ischeme <= 2) { /* Acoustic scheme */
+			
+			/* Vx field */
+			/* mid bottom mid vx*/
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ieXz;
+			ize = mod.ieXz+bnd.ntap;
+			
+			ib = (ize-bnd.ntap);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[iz-ib];
+					}
+				}
+			}
+			/* right bottom mid corner vx */
+			if (bnd.rig==4) {
+				ixo = mod.ieXx;
+				ixe = mod.ieXx+bnd.ntap;
+				ibz = (izo);
+				ibx = (ixo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* right bottom front corner vx */
+				if (bnd.fro==4) {
+					iyo = mod.ioXy-bnd.ntap;
+					iye = mod.ioXy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* right bottom back corner vx */
+				if (bnd.bac==4) {
+					iyo = mod.ieXy;
+					iye = mod.ieXy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ieXz;
+			ize = mod.ieXz+bnd.ntap;
+
+			/* left bottom mid corner vx*/
+			if (bnd.lef==4) {
+				ixo = mod.ioXx-bnd.ntap;
+				ixe = mod.ioXx;
+				ibz = (izo);
+				ibx = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+							
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner vx */
+				if (bnd.fro==4) {
+					iyo = mod.ioXy-bnd.ntap;
+					iye = mod.ioXy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner vx*/
+				if (bnd.bac==4) {
+					iyo = mod.ieXy;
+					iye = mod.ieXy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* mid bottom front corner vx */
+			if (bnd.fro==4) {
+				ixo = mod.ioXx;
+				ixe = mod.ieXx;
+				iyo = mod.ioXy-bnd.ntap;
+				iye = mod.ioXy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/*  mid bottom back corner vx */
+			if (bnd.bac==4) {
+				iyo = mod.ieXy;
+				iye = mod.ieXy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+
+
+			/* Vy field */
+			/* mid bottom mid vy */
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ieYz;
+			ize = mod.ieYz+bnd.ntap;
+	
+			ib = (ize-bnd.ntap);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iz-ib];
+					}
+				}
+			}
+			/* right bottom mid corner vy */
+			if (bnd.rig==4) {
+				ixo = mod.ieYx;
+				ixe = ixo+bnd.ntap;
+				ibz = (izo);
+				ibx = (ixo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* right bottom front corner vy */
+				if (bnd.fro==4) {
+					iyo = mod.ioYy-bnd.ntap;
+					iye = mod.ioYy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* right bottom back corner vy */
+				if (bnd.bac==4) {
+					iyo = mod.ieYy;
+					iye = mod.ieYy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ieYz;
+			ize = mod.ieYz+bnd.ntap;
+
+			/* left bottom mid corner vy */
+			if (bnd.lef==4) {
+				ixo = mod.ioYx-bnd.ntap;
+				ixe = mod.ioYx;
+				ibz = (izo);
+				ibx = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+							
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner vy */
+				if (bnd.fro==4) {
+					iyo = mod.ioYy-bnd.ntap;
+					iye = mod.ioYy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner vy */
+				if (bnd.bac==4) {
+					iyo = mod.ieYy;
+					iye = mod.ieYy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+											c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+											c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* mid bottom front corner vy */
+			if (bnd.fro==4) {
+				ixo = mod.ioYx;
+				ixe = mod.ieYx;
+				iyo = mod.ioYy-bnd.ntap;
+				iye = mod.ioYy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/* mid bottom back corner vy */
+			if (bnd.bac==4) {
+				iyo = mod.ieYy;
+				iye = mod.ieYy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+
+
+			/* Vz field */
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ieZz;
+			ize = mod.ieZz+bnd.ntap;
+			
+			ib = (ize-bnd.ntap);
+#pragma omp for private (ix, iy, iz) 
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+						vz[iy*n1*n2+ix*n1+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,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+							
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+
+				/* right bottom front corner */
+				if (bnd.fro==4) {
+					iyo = mod.ioZy-bnd.ntap;
+					iye = mod.ioZy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+
+
+
+				/* right bottom back corner */
+				if (bnd.bac==4) {
+					iyo = mod.ieZy;
+					iye = mod.ieZy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ieZz;
+			ize = mod.ieZz+bnd.ntap;
+
+			/* 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,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+//#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+							
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner */
+				if (bnd.fro==4) {
+					iyo = mod.ioZy-bnd.ntap;
+					iye = mod.ioZy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner */
+				if (bnd.bac==4) {
+					iyo = mod.ieZy;
+					iye = mod.ieZy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* front bottom corner */
+			if (bnd.fro==4) {
+				ixo = mod.ioZx;
+				ixe = mod.ieZx;
+				iyo = mod.ioZy-bnd.ntap;
+				iye = mod.ioZy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/* Back bottom corner */
+			if (bnd.bac==4) {
+				iyo = mod.ieZy;
+				iye = mod.ieZy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			
+		}
+		else { /* Elastic scheme */
+			
+			/* Vx field */
+			/* mid bottom mid vx*/
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ieXz;
+			ize = mod.ieXz+bnd.ntap;
+			
+			ib = (ize-bnd.ntap);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[iz-ib];
+					}
+				}
+			}
+			/* right bottom mid corner vx */
+			if (bnd.rig==4) {
+				ixo = mod.ieXx;
+				ixe = mod.ieXx+bnd.ntap;
+				ibz = (izo);
+				ibx = (ixo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* right bottom front corner vx */
+				if (bnd.fro==4) {
+					iyo = mod.ioXy-bnd.ntap;
+					iye = mod.ioXy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* right bottom back corner vx */
+				if (bnd.bac==4) {
+					iyo = mod.ieXy;
+					iye = mod.ieXy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ieXz;
+			ize = mod.ieXz+bnd.ntap;
+
+			/* left bottom mid corner vx*/
+			if (bnd.lef==4) {
+				ixo = mod.ioXx-bnd.ntap;
+				ixe = mod.ioXx;
+				ibz = (izo);
+				ibx = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+							
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner vx */
+				if (bnd.fro==4) {
+					iyo = mod.ioXy-bnd.ntap;
+					iye = mod.ioXy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner vx*/
+				if (bnd.bac==4) {
+					iyo = mod.ieXy;
+					iye = mod.ieXy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+			
+								vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* mid bottom front corner vx */
+			if (bnd.fro==4) {
+				ixo = mod.ioXx;
+				ixe = mod.ieXx;
+				iyo = mod.ioXy-bnd.ntap;
+				iye = mod.ioXy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/*  mid bottom back corner vx */
+			if (bnd.bac==4) {
+				iyo = mod.ieXy;
+				iye = mod.ieXy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+
+
+			/* Vy field */
+			/* mid bottom mid vy */
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ieYz;
+			ize = mod.ieYz+bnd.ntap;
+	
+			ib = (ize-bnd.ntap);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iz-ib];
+					}
+				}
+			}
+			/* right bottom mid corner vy */
+			if (bnd.rig==4) {
+				ixo = mod.ieYx;
+				ixe = ixo+bnd.ntap;
+				ibz = (izo);
+				ibx = (ixo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* right bottom front corner vy */
+				if (bnd.fro==4) {
+					iyo = mod.ioYy-bnd.ntap;
+					iye = mod.ioYy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* right bottom back corner vy */
+				if (bnd.bac==4) {
+					iyo = mod.ieYy;
+					iye = mod.ieYy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ieYz;
+			ize = mod.ieYz+bnd.ntap;
+
+			/* left bottom mid corner vy */
+			if (bnd.lef==4) {
+				ixo = mod.ioYx-bnd.ntap;
+				ixe = mod.ioYx;
+				ibz = (izo);
+				ibx = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+							
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner vy */
+				if (bnd.fro==4) {
+					iyo = mod.ioYy-bnd.ntap;
+					iye = mod.ioYy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner vy */
+				if (bnd.bac==4) {
+					iyo = mod.ieYy;
+					iye = mod.ieYy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* mid bottom front corner vy */
+			if (bnd.fro==4) {
+				ixo = mod.ioYx;
+				ixe = mod.ieYx;
+				iyo = mod.ioYy-bnd.ntap;
+				iye = mod.ioYy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/* mid bottom back corner vy */
+			if (bnd.bac==4) {
+				iyo = mod.ieYy;
+				iye = mod.ieYy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+
+
+			/* Vz field */
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ieZz;
+			ize = mod.ieZz+bnd.ntap;
+			
+			ib = (ize-bnd.ntap);
+#pragma omp for private (ix, iy, iz) 
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+						vz[iy*n1*n2+ix*n1+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,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+							
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ix-ibx)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+
+				/* right bottom front corner */
+				if (bnd.fro==4) {
+					iyo = mod.ioZy-bnd.ntap;
+					iye = mod.ioZy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+
+
+
+				/* right bottom back corner */
+				if (bnd.bac==4) {
+					iyo = mod.ieZy;
+					iye = mod.ieZy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ix-ibx)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ieZz;
+			ize = mod.ieZz+bnd.ntap;
+
+			/* 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,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+//#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						#pragma ivdep
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+							
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(ibx-ix)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+				/* left bottom front corner */
+				if (bnd.fro==4) {
+					iyo = mod.ioZy-bnd.ntap;
+					iye = mod.ioZy;
+					iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+						for (iy=iyo; iy<iye; iy++) {
+							#pragma ivdep
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iby-iy)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+				/* left bottom back corner */
+				if (bnd.bac==4) {
+					iyo = mod.ieZy;
+					iye = mod.ieZy+bnd.ntap;
+					iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+					for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+						for (iy=iyo; iy<iye; iy++) {
+							for (iz=izo; iz<ize; iz++) {
+								vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+			
+								vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxyz[(iy-iby)*bnd.ntap*bnd.ntap+(ibx-ix)*bnd.ntap+(iz-ibz)];
+							}
+						}
+					}
+				}
+			}
+			/* front bottom corner */
+			if (bnd.fro==4) {
+				ixo = mod.ioZx;
+				ixe = mod.ieZx;
+				iyo = mod.ioZy-bnd.ntap;
+				iye = mod.ioZy;
+				ibz = (izo);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			/* Back bottom corner */
+			if (bnd.bac==4) {
+				iyo = mod.ieZy;
+				iye = mod.ieZy+bnd.ntap;
+				ibz = (izo);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(iz-ibz)];
+						}
+					}
+				}
+			}
+			
+		}
+	}
+
+
+	
+	/*********/
+	/* Left  */
+	/*********/
+	if (bnd.lef==4) {
+		
+		if (mod.ischeme <= 2) { /* Acoustic scheme */
+			
+			/* Vx field */
+			/* left mid mid vx */
+			ixo = mod.ioXx-bnd.ntap;
+			ixe = mod.ioXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ioXz;
+			ize = mod.ieXz;
+			
+			ib = (bnd.ntap+ixo-1);
+
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix]; 
+					}
+				}
+			}
+			/* left mid front corner vx */
+			if (bnd.fro==4) {
+				iyo = mod.ioXy-bnd.ntap;
+				iye = mod.ioXy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)]; 
+						}
+					}
+				}
+			}
+			/* left mid back corner vx */
+			if (bnd.bac==4) {
+				iyo = mod.ieXy;
+				iye = mod.ieXy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+
+			/* Vy field */
+			/* left mid mid vy */
+			ixo = mod.ioYx-bnd.ntap;
+			ixe = mod.ioYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ioYz;
+			ize = mod.ieYz;
+			
+			ib = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+									c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+									c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+						
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix];
+					}
+				}
+			}
+			/* left mid front corner vy */
+			if (bnd.fro==4) {
+				iyo = mod.ioYy-bnd.ntap;
+				iye = mod.ioYy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			/* left mid back corner vy */
+			if (bnd.bac==4) {
+				iyo = mod.ieYy;
+				iye = mod.ieYy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
+										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			
+			/* Vz field */
+			/* left mid mid vz */
+			ixo = mod.ioZx-bnd.ntap;
+			ixe = mod.ioZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ioZz;
+			ize = mod.ieZz;
+
+			ib = (bnd.ntap+ixo-1);
+
+#pragma omp for private (ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+						
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ib-ix];
+					}
+				}
+			}
+			/* left mid front corner vz*/
+			if (bnd.fro==4) {
+				iyo = mod.ioZy-bnd.ntap;
+				iye = mod.ioZy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			/* left mid back corner vz */
+			if (bnd.bac==4) {
+				iyo = mod.ieZy;
+				iye = mod.ieZy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+
+		}
+
+		else { /* Elastic scheme */
+			
+			/* Vx field */
+			/* left mid mid vx */
+			ixo = mod.ioXx-bnd.ntap;
+			ixe = mod.ioXx;
+			iyo = mod.ioXy;
+			iye = mod.ieXy;
+			izo = mod.ioXz;
+			ize = mod.ieXz;
+			
+			ib = (bnd.ntap+ixo-1);
+
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix]; 
+					}
+				}
+			}
+			/* left mid front corner vx */
+			if (bnd.fro==4) {
+				iyo = mod.ioXy-bnd.ntap;
+				iye = mod.ioXy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)]; 
+						}
+					}
+				}
+			}
+			/* left mid back corner vx */
+			if (bnd.bac==4) {
+				iyo = mod.ieXy;
+				iye = mod.ieXy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+
+			/* Vy field */
+			/* left mid mid vy */
+			ixo = mod.ioYx-bnd.ntap;
+			ixe = mod.ioYx;
+			iyo = mod.ioYy;
+			iye = mod.ieYy;
+			izo = mod.ioYz;
+			ize = mod.ieYz;
+			
+			ib = (bnd.ntap+ixo-1);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+						
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix];
+					}
+				}
+			}
+			/* left mid front corner vy */
+			if (bnd.fro==4) {
+				iyo = mod.ioYy-bnd.ntap;
+				iye = mod.ioYy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			/* left mid back corner vy */
+			if (bnd.bac==4) {
+				iyo = mod.ieYy;
+				iye = mod.ieYy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			
+			/* Vz field */
+			/* left mid mid vz */
+			ixo = mod.ioZx-bnd.ntap;
+			ixe = mod.ioZx;
+			iyo = mod.ioZy;
+			iye = mod.ieZy;
+			izo = mod.ioZz;
+			ize = mod.ieZz;
+
+			ib = (bnd.ntap+ixo-1);
+
+#pragma omp for private (ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+						
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ib-ix];
+					}
+				}
+			}
+			/* left mid front corner vz*/
+			if (bnd.fro==4) {
+				iyo = mod.ioZy-bnd.ntap;
+				iye = mod.ioZy;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+			/* left mid back corner vz */
+			if (bnd.bac==4) {
+				iyo = mod.ieZy;
+				iye = mod.ieZy+bnd.ntap;
+				ibx = (bnd.ntap+ixo-1);
+				iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+				for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+					for (iy=iyo; iy<iye; iy++) {
+						for (iz=izo; iz<ize; iz++) {
+							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+						}
+					}
+				}
+			}
+
+		}
+		
+	}
+
+	/*********/
+	/* Right */
 	/*********/
-	if (bnd.lef==4) {
+	if (bnd.rig==4) {
 		
 		if (mod.ischeme <= 2) { /* Acoustic scheme */
 			
 			/* Vx field */
-			/* left mid mid vx */
-			ixo = mod.ioXx-bnd.ntap;
-			ixe = mod.ioXx;
+			/* right mid mid vx */
+			ixo = mod.ieXx;
+			ixe = mod.ieXx+bnd.ntap;
 			iyo = mod.ioXy;
 			iye = mod.ieXy;
 			izo = mod.ioXz;
 			ize = mod.ieXz;
-			
-			ib = (bnd.ntap+ixo-1);
+		
+			ib = (ixo);
 
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
@@ -1431,16 +3258,17 @@ MID 	left 	mid 	mid
 									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]));
 
-						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix]; 
+						vx[iy*n1*n2+ix*n1+iz] *= bnd.tapx[ix-ib]; 
 					}
 				}
 			}
-			/* left mid front corner vx */
+			/* right mid front corner vx */
 			if (bnd.fro==4) {
 				iyo = mod.ioXy-bnd.ntap;
 				iye = mod.ioXy;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (bnd.ntap+iyo-1);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1450,17 +3278,18 @@ MID 	left 	mid 	mid
 										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]));
 		
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)]; 
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)]; 
 						}
 					}
 				}
 			}
-			/* left mid back corner vx */
+			/* right mid back corner vx*/
 			if (bnd.bac==4) {
 				iyo = mod.ieXy;
 				iye = mod.ieXy+bnd.ntap;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (iyo);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1470,22 +3299,23 @@ MID 	left 	mid 	mid
 										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]));
 		
-							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
 					}
 				}
 			}
 
 			/* Vy field */
-			/* left mid mid vy */
-			ixo = mod.ioYx-bnd.ntap;
-			ixe = mod.ioYx;
+			/* right mid mid vy */
+			ixo = mod.ieYx;
+			ixe = mod.ieYx+bnd.ntap;
 			iyo = mod.ioYy;
 			iye = mod.ieYy;
 			izo = mod.ioYz;
 			ize = mod.ieYz;
-			
-			ib = (bnd.ntap+ixo-1);
+		
+			ib = (ixo);
+
 #pragma omp for private(ix,iy,iz)
 			for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1494,17 +3324,18 @@ MID 	left 	mid 	mid
 						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
 									c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
 									c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
-						
-						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ib-ix];
+		
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ix-ib];
 					}
 				}
 			}
-			/* left mid front corner vy */
+			/* right mid front corner vy */
 			if (bnd.fro==4) {
 				iyo = mod.ioYy-bnd.ntap;
 				iye = mod.ioYy;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (bnd.ntap+iyo-1);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1514,17 +3345,18 @@ MID 	left 	mid 	mid
 										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
 										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
 		
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)]; 
 						}
 					}
 				}
 			}
-			/* left mid back corner vy */
+			/* right mid back corner vy */
 			if (bnd.bac==4) {
 				iyo = mod.ieYy;
 				iye = mod.ieYy+bnd.ntap;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (iyo);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1534,24 +3366,25 @@ MID 	left 	mid 	mid
 										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
 										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
 		
-							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
 					}
 				}
 			}
-			
+
 			/* Vz field */
-			/* left mid mid vz */
-			ixo = mod.ioZx-bnd.ntap;
-			ixe = mod.ioZx;
+			/* right mid mid vz */
+
+			ixo = mod.ieZx;
+			ixe = mod.ieZx+bnd.ntap;
 			iyo = mod.ioZy;
 			iye = mod.ieZy;
 			izo = mod.ioZz;
 			ize = mod.ieZz;
+			
+			ib = (ixo);
 
-			ib = (bnd.ntap+ixo-1);
-
-#pragma omp for private (ix,iy,iz)
+#pragma omp for private (ix,iy,iz) 
 			for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
 				for (iy=iyo; iy<iye; iy++) {
@@ -1559,17 +3392,18 @@ MID 	left 	mid 	mid
 						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
-						
-						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ib-ix];
+		
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ix-ib]; 
 					}
 				}
 			}
-			/* left mid front corner vz*/
+			/* right mid front corner vz */
 			if (bnd.fro==4) {
 				iyo = mod.ioZy-bnd.ntap;
 				iye = mod.ioZy;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (bnd.ntap+iyo-1);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1579,17 +3413,18 @@ MID 	left 	mid 	mid
 										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[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ibx-ix)];
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)];
 						}
 					}
 				}
 			}
-			/* left mid back corner vz */
+			/* right mid back corner vz */
 			if (bnd.bac==4) {
 				iyo = mod.ieZy;
 				iye = mod.ieZy+bnd.ntap;
-				ibx = (bnd.ntap+ixo-1);
+				ibx = (ixo);
 				iby = (iyo);
+
 #pragma omp for private(ix,iy,iz)
 				for (ix=ixo; ix<ixe; ix++) {
 #pragma ivdep
@@ -1599,22 +3434,14 @@ MID 	left 	mid 	mid
 										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[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ibx-ix)];
+							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
 					}
 				}
 			}
-
-		}
-		
-	}
-
-	/*********/
-	/* Right */
-	/*********/
-	if (bnd.rig==4) {
 		
-		if (mod.ischeme <= 2) { /* Acoustic scheme */
+		}
+		else { /* Elastic scheme */
 			
 			/* Vx field */
 			/* right mid mid vx */
@@ -1633,8 +3460,12 @@ MID 	left 	mid 	mid
 				for (iy=iyo; iy<iye; iy++) {
 					for (iz=izo; iz<ize; iz++) {
 						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 
 						vx[iy*n1*n2+ix*n1+iz] *= bnd.tapx[ix-ib]; 
 					}
@@ -1653,8 +3484,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 		
 							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)]; 
 						}
@@ -1674,8 +3509,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+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]));
+										c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+											txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+										c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+											txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
 		
 							vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
@@ -1700,11 +3539,14 @@ MID 	left 	mid 	mid
 				for (iy=iyo; iy<iye; iy++) {
 					for (iz=izo; iz<ize; iz++) {
 						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-									c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-									c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapx[ix-ib];
-						//vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[ix-ib]; 
 					}
 				}
 			}
@@ -1721,8 +3563,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)]; 
 						}
@@ -1742,8 +3588,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
-										c1*(tzz[iy*n1*n2+ix*n1+iz]	   - tzz[(iy-1)*n1*n2+ix*n1+iz]) +
-										c2*(tzz[(iy+1)*n1*n2+ix*n1+iz] - tzz[(iy-2)*n1*n2+ix*n1+iz]));
+										c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+											txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+										c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+											tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+											txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 							vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
@@ -1769,11 +3619,14 @@ MID 	left 	mid 	mid
 				for (iy=iyo; iy<iye; iy++) {
 					for (iz=izo; iz<ize; iz++) {
 						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapz[ix-ib]; 
-						//vz[iy*n1*n2+ix*n1+iz] *= bnd.tapx[ix-ib]; 
 					}
 				}
 			}
@@ -1790,8 +3643,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iby-iy)*bnd.ntap+(ix-ibx)];
 						}
@@ -1811,8 +3668,12 @@ MID 	left 	mid 	mid
 					for (iy=iyo; iy<iye; iy++) {
 						for (iz=izo; iz<ize; iz++) {
 							vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+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]));
+										c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+										c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+											tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+											txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
 		
 							vz[iy*n1*n2+ix*n1+iz]   *= bnd.tapxz[(iy-iby)*bnd.ntap+(ix-ibx)];
 						}
@@ -1903,6 +3764,93 @@ MID 	left 	mid 	mid
 				}
 			}
 		}
+
+		else { /* Elastic scheme */
+			
+			/* Vx field */
+			/* mid mid front vx */
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ioXy-bnd.ntap;
+			iye = mod.ioXy;
+			izo = mod.ioXz;
+			ize = mod.ieXz;
+		
+			iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+									c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+										txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+									c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+										txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iby-iy]; 
+					}
+				}
+			}
+
+			/* Vy field */
+			/* mid mid front vy */
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ioYy-bnd.ntap;
+			iye = mod.ioYy;
+			izo = mod.ioYz;
+			ize = mod.ieYz;
+		
+			iby = (bnd.ntap+iyo-1);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+									c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+										tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+										txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+									c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+										tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+										txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iby-iy]; 
+					}
+				}
+			}
+
+			/* Vz field */
+			/* mid mid front vz */
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ioZy-bnd.ntap;
+			iye = mod.ioZy;
+			izo = mod.ioZz;
+			ize = mod.ieZz;
+			
+			iby = (bnd.ntap+iyo-1);
+#pragma omp for private (ix,iy,iz) 
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+									c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+										tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+									c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+										tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapy[iby-iy]; 
+					}
+				}
+			}
+		}
 		
 	}
 
@@ -1985,6 +3933,93 @@ MID 	left 	mid 	mid
 				}
 			}
 		}
+
+		else { /* Elastic scheme */
+			
+			/* Vx field */
+			/* mid mid back vx */
+			ixo = mod.ioXx;
+			ixe = mod.ieXx;
+			iyo = mod.ieXy;
+			iye = mod.ieXy+bnd.ntap;
+			izo = mod.ioXz;
+			ize = mod.ieXz;
+		
+			iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vx[iy*n1*n2+ix*n1+iz] -= rox[iy*n1*n2+ix*n1+iz]*(
+									c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+										txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+									c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+										txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+		
+						vx[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iy-iby];
+					}
+				}
+			}
+
+			/* Vy field */
+			/* mid mid back vy */
+			ixo = mod.ioYx;
+			ixe = mod.ieYx;
+			iyo = mod.ieYy;
+			iye = mod.ieYy+bnd.ntap;
+			izo = mod.ioYz;
+			ize = mod.ieYz;
+		
+			iby = (iyo);
+#pragma omp for private(ix,iy,iz)
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vy[iy*n1*n2+ix*n1+iz] -= roy[iy*n1*n2+ix*n1+iz]*(
+									c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+										tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+										txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+									c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+										tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+										txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+						vy[iy*n1*n2+ix*n1+iz]   *= bnd.tapy[iy-iby];
+					}
+				}
+			}
+
+			/* Vz field */
+			/* mid mid back vz */
+			ixo = mod.ioZx;
+			ixe = mod.ieZx;
+			iyo = mod.ieZy;
+			iye = mod.ieZy+bnd.ntap;
+			izo = mod.ioZz;
+			ize = mod.ieZz;
+			
+			iby = (iyo);
+#pragma omp for private (ix,iy,iz) 
+			for (ix=ixo; ix<ixe; ix++) {
+#pragma ivdep
+				for (iy=iyo; iy<iye; iy++) {
+					for (iz=izo; iz<ize; iz++) {
+						vz[iy*n1*n2+ix*n1+iz] -= roz[iy*n1*n2+ix*n1+iz]*(
+									c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+										tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+									c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+										tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+										txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+		
+						vz[iy*n1*n2+ix*n1+iz] *= bnd.tapy[iy-iby];
+					}
+				}
+			}
+		}
 		
 	}
 
@@ -1993,6 +4028,7 @@ MID 	left 	mid 	mid
 {
 		if (allocated) {
             free(Vxpml);
+			free(Vypml);
         	free(Vzpml);
         	free(sigmu);
         	free(RA);
@@ -2039,7 +4075,7 @@ long boundariesV3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz, floa
     dy  = mod.dy;
     dt  = mod.dt;
     fac = dt/dx;
-    if ( (bnd.top==2) || (bnd.bot==2) || (bnd.lef==2) || (bnd.rig==2) ) pml=1;
+    if ( (bnd.top==2) || (bnd.bot==2) || (bnd.lef==2) || (bnd.rig==2) || (bnd.fro==2) || (bnd.bac==2) ) pml=1;
 	else pml=0;
 
 /************************************************************/
diff --git a/fdelmodc3D/elastic4_3D.c b/fdelmodc3D/elastic4_3D.c
new file mode 100644
index 0000000000000000000000000000000000000000..630ee02ac8c8d2499225963e2bbe6898a2c6a7be
--- /dev/null
+++ b/fdelmodc3D/elastic4_3D.c
@@ -0,0 +1,227 @@
+#include<stdlib.h>
+#include<stdio.h>
+#include<math.h>
+#include<assert.h>
+#include"fdelmodc3D.h"
+
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, 
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose);
+
+long storeSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
+
+long reStoreSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
+
+long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
+
+long boundariesV3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
+
+long elastic4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float **src_nwav,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long verbose)
+{
+/*********************************************************************
+       COMPUTATIONAL OVERVIEW OF THE 4th ORDER STAGGERED GRID: 
+
+  The captial symbols T (=Txx,Tzz) Txz,Vx,Vz represent the actual grid
+  The indices ix,iz are related to the T grid, so the capital T 
+  symbols represent the actual modelled grid.
+
+  one cel (iz,ix)
+       |
+       V                              extra column of vx,txz
+                                                      |
+    -------                                           V
+   | txz vz| txz vz  txz vz  txz vz  txz vz  txz vz txz
+   |       |      
+   | vx  t | vx  t   vx  t   vx  t   vx  t   vx  t  vx
+    -------
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz
+
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   | 
+     txz vz  txz Vz--Txz-Vz--Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   |
+     txz vz  txz Vz  Txz-Vz  Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   |
+     txz vz  txz Vz  Txz-Vz  Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz
+
+     vx  t   vx  t   vx  t   vx  t   vx  t   vx  t  vx
+
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz  <--| 
+                                                             |
+                                         extra row of txz/vz |
+
+   AUTHOR:
+           Jan Thorbecke (janth@xs4all.nl)
+           The Netherlands 
+
+***********************************************************************/
+
+	float c1, c2;
+	float dvx, dvy, dvz;
+	long   ix, iy, iz;
+	long   n1, n2;
+
+	c1  = 9.0/8.0; 
+	c2  = -1.0/24.0;
+	n1  = mod.naz;
+    n2  = mod.nax;
+
+	/* calculate vx for all grid points except on the virtual boundary*/
+#pragma omp for private (ix, iy, iz) nowait schedule(guided,1)
+    for (iy=mod.ioXy; iy<mod.ieXy; iy++) {
+	    for (ix=mod.ioXx; ix<mod.ieXx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioXz; iz<mod.ieXz; iz++) {
+                vx[iy*n2*n1+ix*n1+iz] -= rox[iy*n2*n1+ix*n1+iz]*(
+                            c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+                                txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+                            c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+                                txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+            }
+        }
+	}
+
+    /* calculate vy for all grid points except on the virtual boundary */
+#pragma omp for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioYy; iy<mod.ieYy; iy++) {
+	    for (ix=mod.ioYx; ix<mod.ieYx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioYz; iz<mod.ieYz; iz++) {
+                vy[iy*n2*n1+ix*n1+iz] -= roy[iy*n2*n1+ix*n1+iz]*(
+                            c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+                                tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+                                txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+                            c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+                                tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+                                txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+            }
+        }
+	}
+
+	/* calculate vz for all grid points except on the virtual boundary */
+#pragma omp for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioZy; iy<mod.ieZy; iy++) {
+	    for (ix=mod.ioZx; ix<mod.ieZx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioZz; iz<mod.ieZz; iz++) {
+                vz[iy*n2*n1+ix*n1+iz] -= roz[iy*n2*n1+ix*n1+iz]*(
+                            c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+                                tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+                            c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+                                tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+            }
+        }
+	}
+
+    /* Add force source */
+	if (src.type > 5) {
+         applySource3D(mod, src, wav, bnd, itime, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, src_nwav, verbose);
+	}
+    
+	/* boundary condition clears velocities on boundaries */
+    boundariesP3D(mod, bnd, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, lam, mul, itime, verbose);
+
+	/* calculate Txx/tzz for all grid points except on the virtual boundary */
+#pragma omp	for private (ix, iy, iz, dvx, dvy, dvz) nowait schedule(guided,1)
+	for (iy=mod.ioPy; iy<mod.iePy; iy++) {
+	    for (ix=mod.ioPx; ix<mod.iePx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioPz; iz<mod.iePz; iz++) {
+                dvx =   c1*(vx[iy*n2*n1+(ix+1)*n1+iz] - vx[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vx[iy*n2*n1+(ix+2)*n1+iz] - vx[iy*n2*n1+(ix-1)*n1+iz]);
+                dvy =   c1*(vy[(iy+1)*n2*n1+ix*n1+iz] - vy[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vy[(iy+2)*n2*n1+ix*n1+iz] - vy[(iy-1)*n2*n1+ix*n1+iz]);
+                dvz =   c1*(vz[iy*n2*n1+ix*n1+iz+1]   - vz[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vz[iy*n2*n1+ix*n1+iz+2]   - vz[iy*n2*n1+ix*n1+iz-1]);
+                txx[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvx + lam[iy*n2*n1+ix*n1+iz]*(dvy + dvz);
+                tyy[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvy + lam[iy*n2*n1+ix*n1+iz]*(dvz + dvx);
+                tzz[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvz + lam[iy*n2*n1+ix*n1+iz]*(dvx + dvy);
+            }
+        }
+	}
+
+    
+    
+	/* calculate Txz for all grid points except on the virtual boundary */
+#pragma omp	for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioTy; iy<mod.ieTy; iy++) {
+        for (ix=mod.ioTx; ix<mod.ieTx; ix++) {
+    #pragma ivdep
+            for (iz=mod.ioTz; iz<mod.ieTz; iz++) {
+                txz[iy*n2*n1+ix*n1+iz] -= mul[iy*n2*n1+ix*n1+iz]*(
+                        c1*(vx[iy*n2*n1+ix*n1+iz]     - vx[iy*n2*n1+ix*n1+iz-1] +
+                            vz[iy*n2*n1+ix*n1+iz]     - vz[iy*n2*n1+(ix-1)*n1+iz]) +
+                        c2*(vx[iy*n2*n1+ix*n1+iz+1]   - vx[iy*n2*n1+ix*n1+iz-2] +
+                            vz[iy*n2*n1+(ix+1)*n1+iz] - vz[iy*n2*n1+(ix-2)*n1+iz]) );
+            }
+        }
+	}
+
+    /* calculate Txy for all grid points except on the virtual boundary */
+#pragma omp	for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioTy; iy<mod.ieTy; iy++) {
+        for (ix=mod.ioTx; ix<mod.ieTx; ix++) {
+    #pragma ivdep
+            for (iz=mod.ioTz; iz<mod.ieTz; iz++) {
+                txy[iy*n2*n1+ix*n1+iz] -= mul[iy*n2*n1+ix*n1+iz]*(
+                        c1*(vx[iy*n2*n1+ix*n1+iz]     - vx[(iy-1)*n2*n1+ix*n1+iz] +
+                            vy[iy*n2*n1+ix*n1+iz]     - vy[iy*n2*n1+(ix-1)*n1+iz]) +
+                        c2*(vx[(iy+1)*n2*n1+ix*n1+iz] - vx[(iy-2)*n2*n1+ix*n1+iz] +
+                            vy[iy*n2*n1+(ix+1)*n1+iz] - vy[iy*n2*n1+(ix-2)*n1+iz]) );
+            }
+        }
+	}
+
+    /* calculate Tyz for all grid points except on the virtual boundary */
+#pragma omp	for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioTy; iy<mod.ieTy; iy++) {
+        for (ix=mod.ioTx; ix<mod.ieTx; ix++) {
+    #pragma ivdep
+            for (iz=mod.ioTz; iz<mod.ieTz; iz++) {
+                tyz[iy*n2*n1+ix*n1+iz] -= mul[iy*n2*n1+ix*n1+iz]*(
+                        c1*(vz[iy*n2*n1+ix*n1+iz]     - vz[(iy-1)*n2*n1+ix*n1+iz] +
+                            vy[iy*n2*n1+ix*n1+iz]     - vy[iy*n2*n1+ix*n1+iz-1]) +
+                        c2*(vz[(iy+1)*n2*n1+ix*n1+iz] - vz[(iy-2)*n2*n1+ix*n1+iz] +
+                            vy[iy*n2*n1+ix*n1+iz+1]   - vy[iy*n2*n1+ix*n1+iz-2]) );
+            }
+        }
+	}
+
+	/* Add stress source */
+	if (src.type < 6) {
+		 applySource3D(mod, src, wav, bnd, itime, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, src_nwav, verbose);
+	}
+    
+	/* check if there are sources placed on the boundaries */
+    storeSourceOnSurface3D(mod, src, bnd, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, verbose);
+    
+    /* Free surface: calculate free surface conditions for stresses */
+    boundariesV3D(mod, bnd, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, lam, mul, itime, verbose);
+
+	/* restore source positions on the edge */
+    reStoreSourceOnSurface3D(mod, src, bnd, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, verbose);
+
+    return 0;
+}
\ No newline at end of file
diff --git a/fdelmodc3D/elastic4dc_3D.c b/fdelmodc3D/elastic4dc_3D.c
new file mode 100644
index 0000000000000000000000000000000000000000..4a86c78ea9b55b97fd81c476ad4c1a2923f6b4f2
--- /dev/null
+++ b/fdelmodc3D/elastic4dc_3D.c
@@ -0,0 +1,180 @@
+#include<stdlib.h>
+#include<stdio.h>
+#include<math.h>
+#include<assert.h>
+#include"fdelmodc3D.h"
+
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, 
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float **src_nwav, long verbose);
+
+long storeSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
+
+long reStoreSourceOnSurface3D(modPar mod, srcPar src, bndPar bnd, long ixsrc, long iysrc, long izsrc,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, long verbose);
+
+long boundariesP3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
+
+long boundariesV3D(modPar mod, bndPar bnd, float *vx, float *vy, float *vz,
+    float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz, float *rox, float *roy, float *roz,
+    float *l2m, float *lam, float *mul, long itime, long verbose);
+
+long elastic4dc_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, long ixsrc, long iysrc, long izsrc, float **src_nwav,
+    float *vx, float *vy, float *vz, float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long verbose)
+{
+/*********************************************************************
+       COMPUTATIONAL OVERVIEW OF THE 4th ORDER STAGGERED GRID: 
+
+  The captial symbols T (=Txx,Tzz) Txz,Vx,Vz represent the actual grid
+  The indices ix,iz are related to the T grid, so the capital T 
+  symbols represent the actual modelled grid.
+
+  one cel (iz,ix)
+       |
+       V                              extra column of vx,txz
+                                                      |
+    -------                                           V
+   | txz vz| txz vz  txz vz  txz vz  txz vz  txz vz txz
+   |       |      
+   | vx  t | vx  t   vx  t   vx  t   vx  t   vx  t  vx
+    -------
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz
+
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   | 
+     txz vz  txz Vz--Txz-Vz--Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   |
+     txz vz  txz Vz  Txz-Vz  Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+                 |   |   |   |   |   |   |
+     txz vz  txz Vz  Txz-Vz  Txz-Vz  Txz-Vz  txz vz  txz
+                 |   |   |   |   |   |   |
+     vx  t   vx  T---Vx--T---Vx--T---Vx--T   vx  t   vx
+
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz
+
+     vx  t   vx  t   vx  t   vx  t   vx  t   vx  t  vx
+
+     txz vz  txz vz  txz vz  txz vz  txz vz  txz vz  txz  <--| 
+                                                             |
+                                         extra row of txz/vz |
+
+   AUTHOR:
+           Jan Thorbecke (janth@xs4all.nl)
+           The Netherlands 
+
+***********************************************************************/
+
+	float   c1, c2;
+	float   dvx, dvy, dvz;
+	long    ix, iy, iz;
+	long    n1, n2;
+
+	c1  = 9.0/8.0; 
+	c2  = -1.0/24.0;
+	n1  = mod.naz;
+    n2  = mod.nax;
+
+	/* calculate vx for all grid points except on the virtual boundary*/
+#pragma omp for private (ix, iy, iz) nowait schedule(guided,1)
+    for (iy=mod.ioXy; iy<mod.ieXy; iy++) {
+	    for (ix=mod.ioXx; ix<mod.ieXx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioXz; iz<mod.ieXz; iz++) {
+                vx[iy*n2*n1+ix*n1+iz] -= rox[iy*n2*n1+ix*n1+iz]*(
+                            c1*(txx[iy*n2*n1+ix*n1+iz]     - txx[iy*n2*n1+(ix-1)*n1+iz] +
+                                txy[(iy+1)*n2*n1+ix*n1+iz] - txy[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+ix*n1+iz+1]   - txz[iy*n2*n1+ix*n1+iz])    +
+                            c2*(txx[iy*n2*n1+(ix+1)*n1+iz] - txx[iy*n2*n1+(ix-2)*n1+iz] +
+                                txy[(iy+2)*n2*n1+ix*n1+iz] - txy[(iy-1)*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+ix*n1+iz+2]   - txz[iy*n2*n1+ix*n1+iz-1])  );
+            }
+        }
+	}
+
+    /* calculate vy for all grid points except on the virtual boundary */
+#pragma omp for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioYy; iy<mod.ieYy; iy++) {
+	    for (ix=mod.ioYx; ix<mod.ieYx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioYz; iz<mod.ieYz; iz++) {
+                vy[iy*n2*n1+ix*n1+iz] -= roy[iy*n2*n1+ix*n1+iz]*(
+                            c1*(tyy[iy*n2*n1+ix*n1+iz]     - tyy[(iy-1)*n2*n1+ix*n1+iz] +
+                                tyz[iy*n2*n1+ix*n1+iz+1]   - tyz[iy*n2*n1+ix*n1+iz] +
+                                txy[iy*n2*n1+(ix+1)*n1+iz] - txy[iy*n2*n1+ix*n1+iz])  +
+                            c2*(tyy[(iy+1)*n2*n1+ix*n1+iz] - tyy[(iy-2)*n2*n1+ix*n1+iz] +
+                                tyz[iy*n2*n1+ix*n1+iz+2]   - tyz[iy*n2*n1+ix*n1+iz-1] +
+                                txy[iy*n2*n1+(ix+2)*n1+iz] - txy[iy*n2*n1+(ix-1)*n1+iz])  );
+            }
+        }
+	}
+
+	/* calculate vz for all grid points except on the virtual boundary */
+#pragma omp for private (ix, iy, iz)  schedule(guided,1)
+	for (iy=mod.ioZy; iy<mod.ieZy; iy++) {
+	    for (ix=mod.ioZx; ix<mod.ieZx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioZz; iz<mod.ieZz; iz++) {
+                vz[iy*n2*n1+ix*n1+iz] -= roz[iy*n2*n1+ix*n1+iz]*(
+                            c1*(tzz[iy*n2*n1+ix*n1+iz]     - tzz[iy*n2*n1+ix*n1+iz-1] +
+                                tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+(ix+1)*n1+iz] - txz[iy*n2*n1+ix*n1+iz])  +
+                            c2*(tzz[iy*n2*n1+ix*n1+iz+1]   - tzz[iy*n2*n1+ix*n1+iz-2] +
+                                tyz[(iy+1)*n2*n1+ix*n1+iz] - tyz[iy*n2*n1+ix*n1+iz] +
+                                txz[iy*n2*n1+(ix+2)*n1+iz] - txz[iy*n2*n1+(ix-1)*n1+iz])  );
+            }
+        }
+	}
+
+    /* Add force source */
+	if (src.type > 5) {
+         applySource3D(mod, src, wav, bnd, itime, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, src_nwav, verbose);
+	}
+    
+	/* boundary condition clears velocities on boundaries */
+    boundariesP3D(mod, bnd, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, lam, mul, itime, verbose);
+
+	/* calculate Txx/tzz for all grid points except on the virtual boundary */
+#pragma omp	for private (ix, iy, iz, dvx, dvy, dvz) nowait schedule(guided,1)
+	for (iy=mod.ioPy; iy<mod.iePy; iy++) {
+	    for (ix=mod.ioPx; ix<mod.iePx; ix++) {
+#pragma ivdep
+            for (iz=mod.ioPz; iz<mod.iePz; iz++) {
+                dvx =   c1*(vx[iy*n2*n1+(ix+1)*n1+iz] - vx[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vx[iy*n2*n1+(ix+2)*n1+iz] - vx[iy*n2*n1+(ix-1)*n1+iz]);
+                dvy =   c1*(vy[(iy+1)*n2*n1+ix*n1+iz] - vy[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vy[(iy+2)*n2*n1+ix*n1+iz] - vy[(iy-1)*n2*n1+ix*n1+iz]);
+                dvz =   c1*(vz[iy*n2*n1+ix*n1+iz+1]   - vz[iy*n2*n1+ix*n1+iz]) +
+                        c2*(vz[iy*n2*n1+ix*n1+iz+2]   - vz[iy*n2*n1+ix*n1+iz-1]);
+                txx[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvx + lam[iy*n2*n1+ix*n1+iz]*(dvy + dvz);
+                tyy[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvy + lam[iy*n2*n1+ix*n1+iz]*(dvz + dvx);
+                tzz[iy*n2*n1+ix*n1+iz] -= l2m[iy*n2*n1+ix*n1+iz]*dvz + lam[iy*n2*n1+ix*n1+iz]*(dvx + dvy);
+            }
+        }
+	}
+
+	/* Add stress source */
+	if (src.type < 6) {
+		 applySource3D(mod, src, wav, bnd, itime, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, src_nwav, verbose);
+	}
+    
+	/* check if there are sources placed on the boundaries */
+    storeSourceOnSurface3D(mod, src, bnd, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, verbose);
+    
+    /* Free surface: calculate free surface conditions for stresses */
+    boundariesV3D(mod, bnd, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, lam, mul, itime, verbose);
+
+	/* restore source positions on the edge */
+    reStoreSourceOnSurface3D(mod, src, bnd, ixsrc, iysrc, izsrc, vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, verbose);
+
+    return 0;
+}
\ No newline at end of file
diff --git a/fdelmodc3D/fdelmodc3D b/fdelmodc3D/fdelmodc3D
deleted file mode 100755
index d167a03b98e669688a662a2490e725c3ec7b92ed..0000000000000000000000000000000000000000
Binary files a/fdelmodc3D/fdelmodc3D and /dev/null differ
diff --git a/fdelmodc3D/fdelmodc3D.c b/fdelmodc3D/fdelmodc3D.c
index 5db4c61fd9bc183e21a60b84c116a9464e675006..21b3f5858add01f7eca9c2d5d8597fbbd27926c0 100644
--- a/fdelmodc3D/fdelmodc3D.c
+++ b/fdelmodc3D/fdelmodc3D.c
@@ -48,6 +48,11 @@ long acousticSH4_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime,
 	long ixsrc, long iysrc, long izsrc, float **src_nwav, float *tx, float *ty, float *tz,
 	float *vz, float *rox, float *roy, float *roz, float *mul, long verbose);
 
+long elastic4dc_3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, 
+	long ixsrc, long iysrc, long izsrc, float **src_nwav, float *vx, float *vy, float *vz,
+	float *tzz, float *tyy, float *txx, float *txz, float *txy, float *tyz,
+    float *rox, float *roy, float *roz, float *l2m, float *lam, float *mul, long verbose);
+
 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,
@@ -492,7 +497,6 @@ int main(int argc, char **argv)
 		shot.z[ishot]=iz+src.sinkdepth; 
 	}
 
-
 	/* scan for free surface boundary in case it has a topography */
 	for (iy=0; iy<mod.ny; iy++) {
 		for (ix=0; ix<mod.nx; ix++) {
@@ -642,7 +646,8 @@ shared (shot, bnd, mod, src, wav, rec, ixsrc, iysrc, izsrc, it, src_nwav, verbos
 						vmess("Visco-Elastic order 4 not yet available");
 					break;
 				case 5 : /* Elastic FD kernel with S-velocity set to zero*/
-						vmess("DC-Elastic order 4 not yet available");
+						elastic4dc_3D(mod, src, wav, bnd, it, ixsrc, iysrc, izsrc, src_nwav,
+							vx, vy, vz, tzz, tyy, txx, txz, txy, tyz, rox, roy, roz, l2m, lam, mul, verbose);
 					break;
 			}
 
diff --git a/fdelmodc3D/fdelmodc3D.h b/fdelmodc3D/fdelmodc3D.h
index fff9d9592c7804123079602d86c0e0c795f7e403..ed4ce7b49a22fd040aeb2530f1f925546814677e 100644
--- a/fdelmodc3D/fdelmodc3D.h
+++ b/fdelmodc3D/fdelmodc3D.h
@@ -179,6 +179,7 @@ typedef struct _sourcePar { /* Source Array Parameters */
 	float amplitude;
 	float dip;
 	float strike;
+	float rake;
 	long distribution;
 	long window;
     long injectionrate;
diff --git a/fdelmodc3D/getParameters3D.c b/fdelmodc3D/getParameters3D.c
index fcbfe4a8f0a70be2937b26d9bb1b3a97dde59604..836ce4cf0ed7e9806a9fde628031286f2caf64d6 100644
--- a/fdelmodc3D/getParameters3D.c
+++ b/fdelmodc3D/getParameters3D.c
@@ -551,10 +551,11 @@ criteria we have imposed.*/
 	if (!getparfloat("dyshot",&dyshot)) dyshot=dy;
 	if (!getparfloat("dzshot",&dzshot)) dzshot=0.0;
 	if (!getparfloat("dip",&src->dip)) src->dip=0.0;
-	if (!getparfloat("strike",&src->strike)) src->strike=1.0;
-	if (src->strike>=0) src->strike=0.5*M_PI;
-	else src->strike = -0.5*M_PI;
+	if (!getparfloat("strike",&src->strike)) src->strike=0.0;
+	if (!getparfloat("rake",&src->rake)) src->rake=0.0;
 	src->dip = M_PI*(src->dip/180.0);
+	src->strike = M_PI*(src->strike/180.0);
+	src->rake = M_PI*(src->rake/180.0);
 
 	if (shot->n>1) {
 		idxshot=MAX(0,NINT(dxshot/dx));
@@ -969,6 +970,7 @@ criteria we have imposed.*/
 		vmess("*******************************************");
 		vmess("wav_nt   = %6li   wav_nx      = %li", wav->ns, wav->nx);
 		vmess("src_type = %6li   src_orient  = %li", src->type, src->orient);
+		vmess("number of sources              = %li", shot->n);
 		vmess("fmax     = %8.2f", fmax);
 		fprintf(stderr,"    %s: Source type         : ",xargv[0]);
 		switch ( src->type ) {
diff --git a/fdelmodc3D/getRecTimes3D.c b/fdelmodc3D/getRecTimes3D.c
index fa007f88322b1cb038b7d2d820218d118ffe7835..4c19786a8028eb10c0bc3183fe3c31c72e3603e8 100644
--- a/fdelmodc3D/getRecTimes3D.c
+++ b/fdelmodc3D/getRecTimes3D.c
@@ -402,6 +402,7 @@ long getRecTimes3D(modPar mod, recPar rec, bndPar bnd, long itime, long isam,
 				}
 			}
 			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) {
diff --git a/fdelmodc3D/readModel3D.c b/fdelmodc3D/readModel3D.c
index df93d7185f08428f42294fb63779a08a6e8daf9a..157f7a1790d4bcb1c8539aebf37385b170679e63 100644
--- a/fdelmodc3D/readModel3D.c
+++ b/fdelmodc3D/readModel3D.c
@@ -27,7 +27,7 @@
 
 
 long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
-    float *l2m, float *lam, float *muu, float *tss, float *tes, float *tep)
+    float *l2m, float *lam, float *muxz, float *tss, float *tes, float *tep)
 {
     FILE    *fpcp, *fpcs, *fpro;
 	FILE    *fpqp=NULL, *fpqs=NULL;
@@ -36,7 +36,7 @@ long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
 	long n1, n2, n3, ix, iy, iz, nz, ny, nx;
     long ixo, iyo, izo, ixe, iye, ize;
 	long ioXx, ioXy, ioXz, ioYx, ioYy, ioYz, ioZz, ioZy, ioZx, ioPx, ioPy, ioPz, ioTx, ioTy, ioTz;
-	float cp2, cs2, cs11, cs12, cs21, cs22, mul, mu, lamda2mu, lamda;
+	float cp2, cs2, cs111, cs112, cs121, cs211, cs122, cs212, cs221, mul, mu, lamda2mu, lamda;
 	float cs2c, cs2b, cs2a, cpx, cpy, cpz, bx, by, bz, fac;
 	float *cp, *cs, *ro, *qp, *qs;
 	float a, b;
@@ -69,7 +69,7 @@ long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
 	ioPx=mod.ioPx;
 	ioPy=mod.ioPy;
 	ioPz=mod.ioPz;
-	/* Txz, Txy, Tyz,: muu */
+	/* Txz, Txy, Tyz,: muxz */
 	ioTx=mod.ioTx;
 	ioTy=mod.ioTy;
 	ioTz=mod.ioTz;
@@ -231,23 +231,263 @@ long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
 /* the edges of the model */
 
 	if (mod.ischeme>2) { /* Elastic Scheme */
+        iz = nz-1;
+        for (iy=0;iy<ny-1;iy++) {
+            for (ix=0;ix<nx-1;ix++) {
+                /* for muxz field */
+                /* csxyz */
+                cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                cs112 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                cs212 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                if (cs111 > 0.0) {
+                    mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
+                }
+                else {
+                    mul = 0.0;
+                }
+
+                /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs112 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // cs122 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+
+                /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                // cs2b = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                // cs2c = cs[(iy+1)*nx*nz+(ix+1)*nz+iz]*cs[(iy+1)*nx*nz+(ix+1)*nz+iz];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // cs211 = cs2b*ro[iy*nx*nz+(ix+1)*nz+iz];
+                // cs221 = cs2c*ro[(iy+1)*nx*nz+(ix+1)*nz+iz];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+                
+                mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
+                lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
+                lamda    = lamda2mu - 2*mu;
+
+                bx = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+(ix+1)*nz+iz]);
+                by = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[(iy+1)*nx*nz+ix*nz+iz]);
+                bz = ro[iy*nx*nz+ix*nz+iz];
+                rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
+                roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/by;
+                roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
+                l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
+                lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
+                muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+            }
+        }
+
+        iy = ny-1;
+        for (ix=0;ix<nx-1;ix++) {
+            for (iz=0;iz<nz-1;iz++) {
+                /* for muxz field */
+                /* csxyz */
+                cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                cs2b = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                cs2c = cs[iy*nx*nz+(ix+1)*nz+iz+1]*cs[iy*nx*nz+(ix+1)*nz+iz+1];
+                cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                cs112 = cs2b*ro[iy*nx*nz+ix*nz+iz+1];
+                cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                cs212 = cs2c*ro[iy*nx*nz+(ix+1)*nz+iz+1];
+                if (cs111 > 0.0) {
+                    mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
+                }
+                else {
+                    mul = 0.0;
+                }
+
+                /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                // cs122 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+
+                /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                // cs221 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+                
+                mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
+                lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
+                lamda    = lamda2mu - 2*mu;
+
+                bx = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+(ix+1)*nz+iz]);
+                by = ro[iy*nx*nz+ix*nz+iz];
+                bz = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+ix*nz+iz+1]);
+                rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
+                roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/by;
+                roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
+                l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
+                lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
+                muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+            }
+        }
+
+        ix = nx-1;
+        for (iy=0;iy<ny-1;iy++) {
+            for (iz=0;iz<nz-1;iz++) {
+                /* for muxz field */
+                /* csxyz */
+                cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                cs212 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                if (cs111 > 0.0) {
+                    mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
+                }
+                else {
+                    mul = 0.0;
+                }
+
+                /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                // cs2b = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                // cs2c = cs[(iy+1)*nx*nz+ix*nz+iz+1]*cs[(iy+1)*nx*nz+ix*nz+iz+1];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2b*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                // cs122 = cs2c*ro[(iy+1)*nx*nz+ix*nz+iz+1];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+
+                /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                /* csxyz */
+                // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                // cs2a = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs121 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                // cs221 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+                // if (cs111 > 0.0) {
+                //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+                // }
+                // else {
+                //     mul = 0.0;
+                // }
+                
+                mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
+                lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
+                lamda    = lamda2mu - 2*mu;
+
+                bx = ro[iy*nx*nz+ix*nz+iz];
+                by = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[(iy+1)*nx*nz+ix*nz+iz]);
+                bz = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+ix*nz+iz+1]);
+                rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
+                roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/by;
+                roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
+                l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
+                lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
+                muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+            }
+        }
+
 		iz = nz-1;
         iy = ny-1;
 		for (ix=0;ix<nx-1;ix++) {
+            /* for muxz field */
+            /* csxyz */
 			cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
 			cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
 			cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
-			cs11 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs12 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs21 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
-			cs22 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
-
-			if (cs11 > 0.0) {
-				mul  = 4.0/(1.0/cs11+1.0/cs12+1.0/cs21+1.0/cs22);
+			cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs112 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+			cs212 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+			if (cs111 > 0.0) {
+				mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
 			}
 			else {
 				mul = 0.0;
 			}
+
+            /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs112 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs122 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
+            /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+            // cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+            // cs221 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
 			mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
 			lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
 			lamda    = lamda2mu - 2*mu;
@@ -260,58 +500,124 @@ long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
 			roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
 			l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
 			lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
-			muu[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+			muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
 		}
 
 		ix = nx-1;
         iz = nz-1;
 		for (iy=0;iy<ny-1;iy++) {
+            /* for muxz field */
+            /* csxyz */
 			cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
 			cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
-			cs2b = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
-			cs11 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs12 = cs2b*ro[iy*nx*nz+ix*nz+iz];
-			cs21 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs22 = cs2b*ro[iy*nx*nz+ix*nz+iz];
-
-			if (cs11 > 0.0) {
-				mul  = 4.0/(1.0/cs11+1.0/cs12+1.0/cs21+1.0/cs22);
+			cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs112 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs212 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			if (cs111 > 0.0) {
+				mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
 			}
 			else {
 				mul = 0.0;
 			}
+
+            /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+			// cs2a = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+            // cs112 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs122 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
+            /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+			// cs2a = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+            // cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs221 = cs2a*ro[(iy+1)*nx*nz+ix*nz+iz];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
 			mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
 			lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
 			lamda    = lamda2mu - 2*mu;
 
 			bx = ro[iy*nx*nz+ix*nz+iz];
-			by = ro[iy*nx*nz+ix*nz+iz];
-			bz = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+ix*nz+iz+1]);
+			by = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[(iy+1)*nx*nz+ix*nz+iz]);
+			bz = ro[iy*nx*nz+ix*nz+iz];
 			rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
 			roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/bx;
 			roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
 			l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
 			lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
-			muu[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+			muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
 		}
 
         ix = nx-1;
         iy = ny-1;
 		for (iz=0;iz<nz-1;iz++) {
+            /* for muxz field */
+            /* csxyz */
 			cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
 			cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
-			cs2b = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
-			cs11 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs12 = cs2b*ro[iy*nx*nz+ix*nz+iz+1];
-			cs21 = cs2*ro[iy*nx*nz+ix*nz+iz];
-			cs22 = cs2b*ro[iy*nx*nz+ix*nz+iz+1];
-
-			if (cs11 > 0.0) {
-				mul  = 4.0/(1.0/cs11+1.0/cs12+1.0/cs21+1.0/cs22);
+			cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+			cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+			cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+			cs212 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+			if (cs111 > 0.0) {
+				mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
 			}
 			else {
 				mul = 0.0;
 			}
+            
+            /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+			// cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+            // cs122 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
+            /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+            /* csxyz */
+            // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+            // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+            // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs121 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs211 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // cs221 = cs2*ro[iy*nx*nz+ix*nz+iz];
+            // if (cs111 > 0.0) {
+            //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+            // }
+            // else {
+            //     mul = 0.0;
+            // }
+
 			mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
 			lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
 			lamda    = lamda2mu - 2*mu;
@@ -324,64 +630,100 @@ long readModel3D(modPar mod, bndPar bnd, float *rox, float *roy, float *roz,
 			roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
 			l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
 			lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
-			muu[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+			muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
 		}
 
 		ix=nx-1;
+        iy=ny-1;
 		iz=nz-1;
-		cp2  = cp[ix*nz+iz]*cp[ix*nz+iz];
-		cs2  = cs[ix*nz+iz]*cs[ix*nz+iz];
-		mu   = cs2*ro[ix*nz+iz];
-		lamda2mu = cp2*ro[ix*nz+iz];
+		cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+		cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+		mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
+		lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
 		lamda    = lamda2mu - 2*mu;
-		bx = ro[ix*nz+iz];
-		bz = ro[ix*nz+iz];
-		rox[(ix+ioXx)*n1+iz+ioXz]=fac/bx;
-		roz[(ix+ioZx)*n1+iz+ioZz]=fac/bz;
-		l2m[(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
-		lam[(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
-		muu[(ix+ioTx)*n1+iz+ioTz]=fac*mu;
+		bx = ro[iy*nx*nz+ix*nz+iz];
+		by = ro[iy*nx*nz+ix*nz+iz];
+		bz = ro[iy*nx*nz+ix*nz+iz];
+		rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
+		roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/by;
+		roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
+		l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
+		lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
+		muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mu;
+
+        for (iy=0;iy<ny-1;iy++) {
+            for (ix=0;ix<nx-1;ix++) {
+                for (iz=0;iz<nz-1;iz++) {
+                    /* for muxz field */
+                    /* csxyz */
+                    cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                    cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                    cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                    cs2b = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                    cs2c = cs[iy*nx*nz+(ix+1)*nz+iz+1]*cs[iy*nx*nz+(ix+1)*nz+iz+1];
+                    cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                    cs112 = cs2b*ro[iy*nx*nz+ix*nz+iz+1];
+                    cs211 = cs2a*ro[iy*nx*nz+ix*nz+iz];
+                    cs212 = cs2c*ro[iy*nx*nz+ix*nz+iz+1];
+                    if (cs111 > 0.0) {
+                        mul  = 4.0/(1.0/cs111+1.0/cs112+1.0/cs211+1.0/cs212);
+                    }
+                    else {
+                        mul = 0.0;
+                    }
 
-		for (ix=0;ix<nx-1;ix++) {
-			for (iz=0;iz<nz-1;iz++) {
-				cp2  = cp[ix*nz+iz]*cp[ix*nz+iz];
-				cs2  = cs[ix*nz+iz]*cs[ix*nz+iz];
-				cs2a = cs[(ix+1)*nz+iz]*cs[(ix+1)*nz+iz];
-				cs2b = cs[ix*nz+iz+1]*cs[ix*nz+iz+1];
-				cs2c = cs[(ix+1)*nz+iz+1]*cs[(ix+1)*nz+iz+1];
-
-/*
-Compute harmonic average of mul for accurate and stable fluid-solid interface
-see Finite-difference modeling of wave propagation in a fluid-solid configuration 
-Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
-*/
-
-				cs11 = cs2*ro[ix*nz+iz];
-				cs12 = cs2b*ro[ix*nz+iz+1];
-				cs21 = cs2a*ro[ix*nz+iz];
-				cs22 = cs2c*ro[ix*nz+iz+1];
-//				cpx  = 0.5*(cp[ix*nz+iz]+cp[(ix+1)*nz+iz])
-//				cpz  = 0.5*(cp[ix*nz+iz]+cp[ix*nz+iz+1])
-
-				if (cs11 > 0.0) {
-					mul  = 4.0/(1.0/cs11+1.0/cs12+1.0/cs21+1.0/cs22);
-				}
-				else {
-					mul = 0.0;
-				}
-				mu   = cs2*ro[ix*nz+iz];
-				lamda2mu = cp2*ro[ix*nz+iz];
-				lamda    = lamda2mu - 2*mu; /* could also use mul to calculate lambda, but that might not be correct: question from Chaoshun Hu. Note use mu or mul as well on boundaries */
-	
-				bx = 0.5*(ro[ix*nz+iz]+ro[(ix+1)*nz+iz]);
-				bz = 0.5*(ro[ix*nz+iz]+ro[ix*nz+iz+1]);
-				rox[(ix+ioXx)*n1+iz+ioXz]=fac/bx;
-				roz[(ix+ioZx)*n1+iz+ioZz]=fac/bz;
-				l2m[(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
-				lam[(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
-				muu[(ix+ioTx)*n1+iz+ioTz]=fac*mul;
-			}
-		}
+                    /* for muyz field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                    /* csxyz */
+                    // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                    // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                    // cs2a = cs[iy*nx*nz+ix*nz+iz+1]*cs[iy*nx*nz+ix*nz+iz+1];
+                    // cs2b = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                    // cs2c = cs[(iy+1)*nx*nz+ix*nz+iz+1]*cs[(iy+1)*nx*nz+ix*nz+iz+1];
+                    // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                    // cs121 = cs2b*ro[(iy+1)*nx*nz+ix*nz+iz];
+                    // cs112 = cs2a*ro[iy*nx*nz+ix*nz+iz+1];
+                    // cs122 = cs2c*ro[(iy+1)*nx*nz+ix*nz+iz+1];
+                    // if (cs111 > 0.0) {
+                    //     mul  = 4.0/(1.0/cs111+1.0/cs121+1.0/cs112+1.0/cs122);
+                    // }
+                    // else {
+                    //     mul = 0.0;
+                    // }
+
+                    /* for muxy field IN PROGRESS!!!!!!!!!!!!!!!!! */
+                    /* csxyz */
+                    // cp2  = cp[iy*nx*nz+ix*nz+iz]*cp[iy*nx*nz+ix*nz+iz];
+                    // cs2  = cs[iy*nx*nz+ix*nz+iz]*cs[iy*nx*nz+ix*nz+iz];
+                    // cs2a = cs[iy*nx*nz+(ix+1)*nz+iz]*cs[iy*nx*nz+(ix+1)*nz+iz];
+                    // cs2b = cs[(iy+1)*nx*nz+ix*nz+iz]*cs[(iy+1)*nx*nz+ix*nz+iz];
+                    // cs2c = cs[(iy+1)*nx*nz+(ix+1)*nz+iz]*cs[(iy+1)*nx*nz+(ix+1)*nz+iz];
+                    // cs111 = cs2*ro[iy*nx*nz+ix*nz+iz];
+                    // cs121 = cs2b*ro[(iy+1)*nx*nz+ix*nz+iz];
+                    // cs211 = cs2a*ro[iy*nx*nz+(ix+1)*nz+iz];
+                    // cs221 = cs2c*ro[(iy+1)*nx*nz+(ix+1)*nz+iz];
+                    // if (cs111 > 0.0) {
+                    //     mul  = 4.0/(1.0/cs111+1.0/cs211+1.0/cs121+1.0/cs221);
+                    // }
+                    // else {
+                    //     mul = 0.0;
+                    // }
+
+                    mu   = cs2*ro[iy*nx*nz+ix*nz+iz];
+                    lamda2mu = cp2*ro[iy*nx*nz+ix*nz+iz];
+                    lamda    = lamda2mu - 2*mu;
+        
+                    bx = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+(ix+1)*nz+iz]);
+                    by = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[(iy+1)*nx*nz+ix*nz+iz]);
+                    bz = 0.5*(ro[iy*nx*nz+ix*nz+iz]+ro[iy*nx*nz+ix*nz+iz+1]);
+                    rox[(iy+ioXy)*n2*n1+(ix+ioXx)*n1+iz+ioXz]=fac/bx;
+                    roy[(iy+ioYy)*n2*n1+(ix+ioYx)*n1+iz+ioYz]=fac/by;
+                    roz[(iy+ioZy)*n2*n1+(ix+ioZx)*n1+iz+ioZz]=fac/bz;
+                    l2m[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda2mu;
+                    lam[(iy+ioPy)*n2*n1+(ix+ioPx)*n1+iz+ioPz]=fac*lamda;
+                    muxz[(iy+ioTy)*n2*n1+(ix+ioTx)*n1+iz+ioTz]=fac*mul;
+                }
+            }
+        }
 
 	}
 	else { /* Acoustic Scheme */
@@ -607,7 +949,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                     }
             	}
         	}
-            /* muu field */
+            /* muxz field */
             ixo = mod.ioTx;
             ixe = mod.ioTx+bnd.ntap;
             iyo = mod.ioTy;
@@ -617,7 +959,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[iy*n2*n1+ixe*n1+iz];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[iy*n2*n1+ixe*n1+iz];
                     }
                 }
             }
@@ -738,7 +1080,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                 }
             }
 
-            /* muu field */
+            /* muxz field */
             ixo = mod.ieTx-bnd.ntap;
             ixe = mod.ieTx;
         	iyo = mod.ioTy;
@@ -748,7 +1090,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[iy*n2*n1+(ixo-1)*n1+iz];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[iy*n2*n1+(ixo-1)*n1+iz];
                     }
                 }
             }
@@ -880,7 +1222,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                     }
             	}
         	}
-            /* muu field */
+            /* muxz field */
             ixo = mod.ioTx;
             ixe = mod.ieTx;
 	        if (bnd.lef==4 || bnd.lef==2) ixo -= bnd.ntap;
@@ -892,7 +1234,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[iye*n2*n1+ix*n1+iz];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[iye*n2*n1+ix*n1+iz];
                     }
                 }
             }
@@ -1029,7 +1371,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                 }
             }
 
-            /* muu field */
+            /* muxz field */
             ixo = mod.ioTx;
             ixe = mod.ieTx;
 	        if (bnd.lef==4 || bnd.lef==2) ixo -= bnd.ntap;
@@ -1041,7 +1383,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[(iyo-1)*n2*n1+ix*n1+iz];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[(iyo-1)*n2*n1+ix*n1+iz];
                     }
                 }
             }
@@ -1178,7 +1520,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                 }
             }
 
-            /* muu field */
+            /* muxz field */
             ixo = mod.ioTx;
             ixe = mod.ieTx;
             iyo = mod.ioTy;
@@ -1188,7 +1530,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[iy*n2*n1+ix*n1+ize];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[iy*n2*n1+ix*n1+ize];
                     }
                 }
             }
@@ -1320,7 +1662,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
                 }
             }
 
-            /* muu */
+            /* muxz */
             ixo = mod.ioTx;
             ixe = mod.ieTx;
             iyo = mod.ioTy;
@@ -1330,7 +1672,7 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
             for (iy=iyo; iy<iye; iy++) {
                 for (ix=ixo; ix<ixe; ix++) {
                     for (iz=izo; iz<ize; iz++) {
-                        muu[iy*n2*n1+ix*n1+iz] = muu[iy*n2*n1+ix*n1+izo-1];
+                        muxz[iy*n2*n1+ix*n1+iz] = muxz[iy*n2*n1+ix*n1+izo-1];
                     }
                 }
             }
@@ -1371,16 +1713,6 @@ Robbert van Vossen, Johan O. A. Robertsson, and Chris H. Chapman
 
     }
 
-
-    FILE *fptest;
-    fptest = fopen("cp-test.bin","w");
-    fwrite(cp, nz*ny*nx, sizeof(float), fptest);
-    fclose(fptest);
-
-    fptest = fopen("ro-test.bin","w");
-    fwrite(ro, nz*ny*nx, sizeof(float), fptest);
-    fclose(fptest);
-
 	free(cp);
 	free(ro);
    	free(cs);