diff --git a/build/Makefile b/build/Makefile
index 0d51ddcaeaf31997632a26220971af274a5a8a34..897e5790bd29867593daa8e92580dc693f9edcc1 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -214,6 +214,7 @@ IFOS_FILES := absorb.cpp \
               exchange_s_acoustic.cpp \
               exchange_v.cpp \
               filt_seis.cpp \
+	      float3DTensorT.cpp \
               freemem.cpp \
               freemem_seis.cpp \
               fsource.cpp \
@@ -345,6 +346,7 @@ help:
 	@echo "   CXX: $(CXX)"
 	@echo "   CPPFLAGS: $(CPPFLAGS) [$(EXTRA_CPPFLAGS)]"
 	@echo "   CFLAGS: $(CFLAGS)"
+	@echo "   CXXFLAGS: $(CXXFLAGS)"
 	@echo "   LD: $(LD)"
 	@echo "   LDFLAGS: $(LDFLAGS) [$(EXTRA_LDFLAGS)]"
 	@echo 
@@ -444,7 +446,7 @@ quiet_cmd_compile_cxx = \e[32m[CC]\e[0m    $@
       cmd_compile_cxx = $(CXX) -o$@ $(CDEPEND) $(CXXFLAGS.$@) $(CPPFLAGS) -I$(SRCTREE) $(CXXFLAGS) -c $<
 
 quiet_cmd_link = \e[94m[LD]\e[0m    $@
-      cmd_link = $(LD) $(CFLAGS) -o$@ $^ $(LDFLAGS.$@) $(LDFLAGS)
+      cmd_link = $(LD) $(CXXFLAGS) -o$@ $^ $(LDFLAGS.$@) $(LDFLAGS)
 
 quiet_cmd_ar = \e[32m[AR]\e[0m    $@
       cmd_ar = $(AR) $(ARFLAGS) $@ $^ && ranlib $@
diff --git a/genmod/hh.cpp b/genmod/hh.cpp
index b729a90650b44c4a308a11b28f788351fceb847f..8c294d1bb1e72fda314efe1b0966190ed470b3b6 100644
--- a/genmod/hh.cpp
+++ b/genmod/hh.cpp
@@ -24,7 +24,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float muv, piv, ws;
@@ -47,7 +47,7 @@ void model(st_model *mod, GlobVar *gv)
         pts = vector(1, gv->L);
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
         ts = gv->TAU;
         tp = gv->TAU;
@@ -77,12 +77,12 @@ void model(st_model *mod, GlobVar *gv)
                     jj = j - gv->POS[2] * gv->NY;
                     kk = k - gv->POS[3] * gv->NZ;
                     if (gv->L) {
-                        mod->taus[jj][ii][kk] = ts;
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taus[jj, ii, kk] = ts;
+                        mod.taup[jj, ii, kk] = tp;
                     }
-                    mod->u[jj][ii][kk] = muv;
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.u[jj, ii, kk] = muv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
@@ -111,12 +111,12 @@ void model(st_model *mod, GlobVar *gv)
                     jj = j - gv->POS[2] * gv->NY;
                     kk = k - gv->POS[3] * gv->NZ;
                     if (gv->L) {
-                        mod->taus[jj][ii][kk] = ts;
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taus[jj, ii, kk] = ts;
+                        mod.taup[jj, ii, kk] = tp;
                     }
-                    mod->u[jj][ii][kk] = muv;
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.u[jj, ii, kk] = muv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
diff --git a/genmod/hh_3DSchach.cpp b/genmod/hh_3DSchach.cpp
index ff7288a0b4615fb4d11da8bb1260542750e91785..c82ab1c7dfad35e3d345d208f282b36cd4f01111 100644
--- a/genmod/hh_3DSchach.cpp
+++ b/genmod/hh_3DSchach.cpp
@@ -6,7 +6,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float muv, piv, ws;
@@ -29,7 +29,7 @@ void model(st_model *mod, GlobVar *gv)
         pts = vector(1, gv->L);
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
         ts = gv->TAU;
         tp = gv->TAU;
@@ -68,13 +68,13 @@ void model(st_model *mod, GlobVar *gv)
                                 jj = j - gv->POS[2] * gv->NY;
                                 kk = k - gv->POS[3] * gv->NZ;
                                 if (gv->L) {
-                                    mod->taus[jj][ii][kk] = ts;
-                                    mod->taup[jj][ii][kk] = tp;
+                                    mod.taus[jj, ii, kk] = ts;
+                                    mod.taup[jj, ii, kk] = tp;
                                 }
 
-                                mod->u[jj][ii][kk] = muv;
-                                mod->rho[jj][ii][kk] = Rho;
-                                mod->pi[jj][ii][kk] = piv;
+                                mod.u[jj, ii, kk] = muv;
+                                mod.rho[jj, ii, kk] = Rho;
+                                mod.pi[jj, ii, kk] = piv;
                             }
                         }
                     }
diff --git a/genmod/hh_toy_ac_start.cpp b/genmod/hh_toy_ac_start.cpp
index 425e149fa4221ee372dc03db3d9fb31e3286a08b..8419106f012a108533ba0e27331b20eb21720484 100644
--- a/genmod/hh_toy_ac_start.cpp
+++ b/genmod/hh_toy_ac_start.cpp
@@ -6,7 +6,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float piv, ws;
@@ -29,7 +29,7 @@ void model(st_model *mod, GlobVar *gv)
 
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
 
         tp = gv->TAU;
@@ -58,11 +58,11 @@ void model(st_model *mod, GlobVar *gv)
                     kk = k - gv->POS[3] * gv->NZ;
 
                     if (gv->L) {
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taup[jj, ii, kk] = tp;
                     }
 
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
diff --git a/genmod/hh_toy_ac_true.cpp b/genmod/hh_toy_ac_true.cpp
index 7ba1762166853e646db2cdd323769ae0e7d8ce0c..e2fe560b0ffa706c3ef43e20daa670d8f8ce4f95 100644
--- a/genmod/hh_toy_ac_true.cpp
+++ b/genmod/hh_toy_ac_true.cpp
@@ -6,7 +6,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float piv, ws;
@@ -30,7 +30,7 @@ void model(st_model *mod, GlobVar *gv)
 
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
 
         tp = gv->TAU;
@@ -59,11 +59,11 @@ void model(st_model *mod, GlobVar *gv)
                     kk = k - gv->POS[3] * gv->NZ;
 
                     if (gv->L) {
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taup[jj, ii, kk] = tp;
                     }
 
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
@@ -89,11 +89,11 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -118,11 +118,11 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -147,11 +147,11 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -176,11 +176,11 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
diff --git a/genmod/hh_toy_start.cpp b/genmod/hh_toy_start.cpp
index 29be6dc57455a29aab1f9182a96562629f4ff2d1..faef39a4e4f16f96257e9e577342efe50f2d151e 100644
--- a/genmod/hh_toy_start.cpp
+++ b/genmod/hh_toy_start.cpp
@@ -6,7 +6,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float muv, piv, ws;
@@ -30,7 +30,7 @@ void model(st_model *mod, GlobVar *gv)
 
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
 
         ts = gv->TAU;
@@ -63,13 +63,13 @@ void model(st_model *mod, GlobVar *gv)
                     kk = k - gv->POS[3] * gv->NZ;
 
                     if (gv->L) {
-                        mod->taus[jj][ii][kk] = ts;
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taus[jj, ii, kk] = ts;
+                        mod.taup[jj, ii, kk] = tp;
                     }
 
-                    mod->u[jj][ii][kk] = muv;
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.u[jj, ii, kk] = muv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
diff --git a/genmod/hh_toy_true.cpp b/genmod/hh_toy_true.cpp
index 0c900c4d6fa81b61208aa9931b5696383d0fedc8..1d51b9eb51d2907834c0f4e3cc036e901fd4d998 100644
--- a/genmod/hh_toy_true.cpp
+++ b/genmod/hh_toy_true.cpp
@@ -6,7 +6,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float muv, piv, ws;
@@ -31,7 +31,7 @@ void model(st_model *mod, GlobVar *gv)
 
         for (l = 1; l <= gv->L; l++) {
             pts[l] = 1.0 / (2.0 * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
 
         ts = gv->TAU;
@@ -64,13 +64,13 @@ void model(st_model *mod, GlobVar *gv)
                     kk = k - gv->POS[3] * gv->NZ;
 
                     if (gv->L) {
-                        mod->taus[jj][ii][kk] = ts;
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taus[jj, ii, kk] = ts;
+                        mod.taup[jj, ii, kk] = tp;
                     }
 
-                    mod->u[jj][ii][kk] = muv;
-                    mod->rho[jj][ii][kk] = Rho;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.u[jj, ii, kk] = muv;
+                    mod.rho[jj, ii, kk] = Rho;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
@@ -99,13 +99,13 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taus[jj][ii][kk] = ts;
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taus[jj, ii, kk] = ts;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->u[jj][ii][kk] = muv;
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.u[jj, ii, kk] = muv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -133,13 +133,13 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taus[jj][ii][kk] = ts;
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taus[jj, ii, kk] = ts;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->u[jj][ii][kk] = muv;
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.u[jj, ii, kk] = muv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -167,13 +167,13 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taus[jj][ii][kk] = ts;
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taus[jj, ii, kk] = ts;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->u[jj][ii][kk] = muv;
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.u[jj, ii, kk] = muv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
@@ -201,13 +201,13 @@ void model(st_model *mod, GlobVar *gv)
                         kk = k - gv->POS[3] * gv->NZ;
 
                         if (gv->L) {
-                            mod->taus[jj][ii][kk] = ts;
-                            mod->taup[jj][ii][kk] = tp;
+                            mod.taus[jj, ii, kk] = ts;
+                            mod.taup[jj, ii, kk] = tp;
                         }
 
-                        mod->u[jj][ii][kk] = muv;
-                        mod->rho[jj][ii][kk] = Rho;
-                        mod->pi[jj][ii][kk] = piv;
+                        mod.u[jj, ii, kk] = muv;
+                        mod.rho[jj, ii, kk] = Rho;
+                        mod.pi[jj, ii, kk] = piv;
                     }
                 }
             }
diff --git a/genmod/rheinstetten_elastic.cpp b/genmod/rheinstetten_elastic.cpp
index dfc6375d976a6f9ba645368b3761d9c0c60d5826..ef2275435ee62640247ba8ca2a1e52a290867aac 100644
--- a/genmod/rheinstetten_elastic.cpp
+++ b/genmod/rheinstetten_elastic.cpp
@@ -7,7 +7,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void model(st_model *mod, GlobVar *gv)
+void model(st_model &mod, GlobVar *gv)
 {
     /* local variables */
     float muv, piv, vp, vs, rhov;
@@ -92,9 +92,9 @@ void model(st_model *mod, GlobVar *gv)
                             jj = j - gv->POS[2] * gv->NY;
                             kk = k - gv->POS[3] * gv->NZ;
 
-                            mod->u[jj][ii][kk] = muv;
-                            mod->rho[jj][ii][kk] = rhov;
-                            mod->pi[jj][ii][kk] = piv;
+                            mod.u[jj, ii, kk] = muv;
+                            mod.rho[jj, ii, kk] = rhov;
+                            mod.pi[jj, ii, kk] = piv;
                         }
                     }
                 }
@@ -119,9 +119,9 @@ void model(st_model *mod, GlobVar *gv)
                     jj = j - gv->POS[2] * gv->NY;
                     kk = k - gv->POS[3] * gv->NZ;
 
-                    mod->u[jj][ii][kk] = muv;
-                    mod->rho[jj][ii][kk] = rhov;
-                    mod->pi[jj][ii][kk] = piv;
+                    mod.u[jj, ii, kk] = muv;
+                    mod.rho[jj, ii, kk] = rhov;
+                    mod.pi[jj, ii, kk] = piv;
                 }
             }
         }
diff --git a/src/absorb.cpp b/src/absorb.cpp
index fda56bb57c53d016a467beaee25856b4cd43738c..40cd3eda78ba5cb62811144b8e7374113a2673c4 100644
--- a/src/absorb.cpp
+++ b/src/absorb.cpp
@@ -34,7 +34,7 @@
 #include "util.hpp"
 #include "logging.hpp"
 
-void absorb(float ***absorb_coeff, GlobVar *gv)
+void absorb(float3DTensorT &absorb_coeff, GlobVar *gv)
 {
     int ifw, xb, yb, zb, xe, ye, ze;
     float amp, a, *coeff;
@@ -71,7 +71,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
     for (int k = 1; k <= gv->NZ; k++)
         for (int j = 1; j <= gv->NY; j++)
             for (int i = 1; i <= gv->NX; i++)
-                absorb_coeff[j][i][k] = 1.0;
+                absorb_coeff[j, i, k] = 1.0;
 
     /* compute coefficients for left and right grid boundaries (x-direction) */
     if ((!gv->BOUNDARY) && (gv->POS[1] == 0)) {
@@ -90,7 +90,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ye = gv->NY - i + 1;
             for (int k = zb; k <= ze; k++)
                 for (int j = yb; j <= ye; j++)
-                    absorb_coeff[j][i][k] = coeff[i];
+                    absorb_coeff[j, i, k] = coeff[i];
         }
     }
 
@@ -111,7 +111,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ye = gv->NY - i + 1;
             for (int k = zb; k <= ze; k++)
                 for (int j = yb; j <= ye; j++)
-                    absorb_coeff[j][ii][k] = coeff[i];
+                    absorb_coeff[j, ii, k] = coeff[i];
         }
     }
 
@@ -133,7 +133,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ye = gv->NY - k + 1;
             for (int i = xb; i <= xe; i++)
                 for (int j = yb; j <= ye; j++)
-                    absorb_coeff[j][i][k] = coeff[k];
+                    absorb_coeff[j, i, k] = coeff[k];
         }
     }
 
@@ -154,7 +154,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ye = gv->NY - k + 1;
             for (int i = xb; i <= xe; i++)
                 for (int j = yb; j <= ye; j++)
-                    absorb_coeff[j][i][kk] = coeff[k];
+                    absorb_coeff[j, i, kk] = coeff[k];
         }
     }
 
@@ -176,7 +176,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ze = gv->NZ - j + 1;
             for (int i = xb; i <= xe; i++)
                 for (int k = zb; k <= ze; k++)
-                    absorb_coeff[j][i][k] = coeff[j];
+                    absorb_coeff[j, i, k] = coeff[j];
         }
     }
 
@@ -197,7 +197,7 @@ void absorb(float ***absorb_coeff, GlobVar *gv)
                 ze = gv->NZ - j + 1;
             for (int i = xb; i <= xe; i++)
                 for (int k = zb; k <= ze; k++)
-                    absorb_coeff[jj][i][k] = coeff[j];
+                    absorb_coeff[jj, i, k] = coeff[j];
         }
     }
 
diff --git a/src/av_mat.cpp b/src/av_mat.cpp
index 2220b8508a835554c18abc528ddbe7899c1b9256..82937db4e42ad436eac778af803d0dee8cf2013a 100644
--- a/src/av_mat.cpp
+++ b/src/av_mat.cpp
@@ -25,15 +25,15 @@
 
 #include "fd.hpp"
 
-void av_mat(st_model *mod, st_model_av *mod_av, const GlobVar *gv)
+void av_mat(st_model &mod, st_model_av &mod_av, const GlobVar *gv)
 {
     for (int j = 1; j <= gv->NY; j++) {
         for (int i = 1; i <= gv->NX; i++) {
             #pragma omp simd
             for (int k = 1; k <= gv->NZ; k++) {
-                mod_av->rjp[j][i][k] = 0.5f * (mod->rho[j][i][k] + mod->rho[j + 1][i][k]);
-                mod_av->rkp[j][i][k] = 0.5f * (mod->rho[j][i][k] + mod->rho[j][i][k + 1]);
-                mod_av->rip[j][i][k] = 0.5f * (mod->rho[j][i][k] + mod->rho[j][i + 1][k]);
+                mod_av.rjp[j, i, k] = 0.5f * (mod.rho[j, i, k] + mod.rho[j + 1, i, k]);
+                mod_av.rkp[j, i, k] = 0.5f * (mod.rho[j, i, k] + mod.rho[j, i, k + 1]);
+                mod_av.rip[j, i, k] = 0.5f * (mod.rho[j, i, k] + mod.rho[j, i + 1, k]);
             }
         }
     }
@@ -42,30 +42,30 @@ void av_mat(st_model *mod, st_model_av *mod_av, const GlobVar *gv)
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->NZ; k++) {
                     /* harmonic averaging of shear modulus */
-                    mod_av->uipjp[j][i][k] =
+                    mod_av.uipjp[j, i, k] =
                         4.0f /
-                        ((1.0f / mod->u[j][i][k]) + (1.0f / mod->u[j][i + 1][k]) + (1.0f / mod->u[j + 1][i + 1][k]) +
-                         (1.0f / mod->u[j + 1][i][k]));
-                    mod_av->ujpkp[j][i][k] =
+                        ((1.0f / mod.u[j, i, k]) + (1.0f / mod.u[j, i + 1, k]) + (1.0f / mod.u[j + 1, i + 1, k]) +
+                         (1.0f / mod.u[j + 1, i, k]));
+                    mod_av.ujpkp[j, i, k] =
                         4.0f /
-                        ((1.0f / mod->u[j][i][k]) + (1.0f / mod->u[j][i][k + 1]) + (1.0f / mod->u[j + 1][i][k + 1]) +
-                         (1.0f / mod->u[j + 1][i][k]));
-                    mod_av->uipkp[j][i][k] =
+                        ((1.0f / mod.u[j, i, k]) + (1.0f / mod.u[j, i, k + 1]) + (1.0f / mod.u[j + 1, i, k + 1]) +
+                         (1.0f / mod.u[j + 1, i, k]));
+                    mod_av.uipkp[j, i, k] =
                         4.0f /
-                        ((1.0f / mod->u[j][i][k]) + (1.0f / mod->u[j][i][k + 1]) + (1.0f / mod->u[j][i + 1][k + 1]) +
-                         (1.0f / mod->u[j][i + 1][k]));
+                        ((1.0f / mod.u[j, i, k]) + (1.0f / mod.u[j, i, k + 1]) + (1.0f / mod.u[j, i + 1, k + 1]) +
+                         (1.0f / mod.u[j, i + 1, k]));
 
                     /* arithmetic averaging of TAU for S-waves and density */
                     if (gv->L) {
-                        mod_av->tausipjp[j][i][k] =
-                            0.25f * (mod->taus[j][i][k] + mod->taus[j][i + 1][k] + mod->taus[j + 1][i + 1][k] +
-                                     mod->taus[j + 1][i][k]);
-                        mod_av->tausjpkp[j][i][k] =
-                            0.25f * (mod->taus[j][i][k] + mod->taus[j + 1][i][k] + mod->taus[j + 1][i][k + 1] +
-                                     mod->taus[j][i][k + 1]);
-                        mod_av->tausipkp[j][i][k] =
-                            0.25f * (mod->taus[j][i][k] + mod->taus[j][i + 1][k] + mod->taus[j][i + 1][k + 1] +
-                                     mod->taus[j][i][k + 1]);
+                        mod_av.tausipjp[j, i, k] =
+                            0.25f * (mod.taus[j, i, k] + mod.taus[j, i + 1, k] + mod.taus[j + 1, i + 1, k] +
+                                     mod.taus[j + 1, i, k]);
+                        mod_av.tausjpkp[j, i, k] =
+                            0.25f * (mod.taus[j, i, k] + mod.taus[j + 1, i, k] + mod.taus[j + 1, i, k + 1] +
+                                     mod.taus[j, i, k + 1]);
+                        mod_av.tausipkp[j, i, k] =
+                            0.25f * (mod.taus[j, i, k] + mod.taus[j, i + 1, k] + mod.taus[j, i + 1, k + 1] +
+                                     mod.taus[j, i, k + 1]);
                     }
                 }
             }
diff --git a/src/checkfd_ssg.cpp b/src/checkfd_ssg.cpp
index 3043dca146ba50d298533ae603db3dea46278ab8..8b36069ea4726870a4cd5043088867968a1c540c 100644
--- a/src/checkfd_ssg.cpp
+++ b/src/checkfd_ssg.cpp
@@ -34,7 +34,7 @@
 #include "fd.hpp"
 #include "logging.hpp"
 
-void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv)
+void checkfd(st_model &mod, st_acquisition *acq, GlobVar *gv)
 {
     float c = 0.0, cmax_p = 0.0, cmin_p = 1e9, cmax_s = 0.0, cmin_s = 1e9, fmax;
     float dhmax, dhmin;
@@ -56,13 +56,13 @@ void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv)
         for (int k = 1 + nfw; k <= (nz - nfw); k++) {
             for (int i = 1 + nfw; i <= (nx - nfw); i++) {
                 for (int j = ny1; j <= (ny - nfw); j++) {
-                    if (mod->rho[j][i][k] == 0.0)
+                    if (mod.rho[j, i, k] == 0.0)
                         log_warn("rho=0 detected by MYID=%d at i=%d,j=%d,k=%d\n", gv->MYID, i, j, k);
                     else {
                         if (gv->L) {
-                            c = sqrt(mod->u[j][i][k] * (1.0 + gv->L * mod->taus[j][i][k]) / mod->rho[j][i][k]);
+                            c = sqrt(mod.u[j, i, k] * (1.0 + gv->L * mod.taus[j, i, k]) / mod.rho[j, i, k]);
                         } else
-                            c = sqrt(mod->u[j][i][k] / mod->rho[j][i][k]);
+                            c = sqrt(mod.u[j, i, k] / mod.rho[j, i, k]);
                     }
                     if (cmax_s < c)
                         cmax_s = c;
@@ -70,13 +70,13 @@ void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv)
                      * frequency of the source */
                     sum = 0.0;
                     for (int l = 1; l <= gv->L; l++) {
-                        ts = gv->DT / mod->eta[l];
-                        sum = sum + ((w * w * mod->taus[j][i][k] * ts * ts) / (1.0 + w * w * ts * ts));
+                        ts = gv->DT / mod.eta[l];
+                        sum = sum + ((w * w * mod.taus[j, i, k] * ts * ts) / (1.0 + w * w * ts * ts));
                     }
-                    if (mod->rho[j][i][k] == 0.0)
+                    if (mod.rho[j, i, k] == 0.0)
                         log_warn("rho=0 detected by MYID=%d at i=%d,j=%d,k=%d\n", gv->MYID, i, j, k);
                     else
-                        c = sqrt(mod->u[j][i][k] * (1.0 + sum) / mod->rho[j][i][k]);
+                        c = sqrt(mod.u[j, i, k] * (1.0 + sum) / mod.rho[j, i, k]);
                     if ((c > cwater) && (cmin_s > c))
                         cmin_s = c;
                 }
@@ -89,13 +89,13 @@ void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv)
     for (int k = 1 + nfw; k <= (nz - nfw); k++) {
         for (int i = 1 + nfw; i <= (nx - nfw); i++) {
             for (int j = ny1; j <= (ny - nfw); j++) {
-                if (mod->rho[j][i][k] == 0.0)
+                if (mod.rho[j, i, k] == 0.0)
                     log_warn("rho=0 detected by MYID=%d at i=%d,j=%d,k=%d\n", gv->MYID, i, j, k);
                 else {
                     if (gv->L)
-                        c = sqrt(mod->pi[j][i][k] * (1.0 + gv->L * mod->taup[j][i][k]) / mod->rho[j][i][k]);
+                        c = sqrt(mod.pi[j, i, k] * (1.0 + gv->L * mod.taup[j, i, k]) / mod.rho[j, i, k]);
                     else
-                        c = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
+                        c = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
                 }
                 if (cmax_p < c)
                     cmax_p = c;
@@ -103,13 +103,13 @@ void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv)
                  * frequency of the source */
                 sum = 0.0;
                 for (int l = 1; l <= gv->L; l++) {
-                    ts = gv->DT / mod->eta[l];
-                    sum = sum + ((w * w * mod->taup[j][i][k] * ts * ts) / (1.0 + w * w * ts * ts));
+                    ts = gv->DT / mod.eta[l];
+                    sum = sum + ((w * w * mod.taup[j, i, k] * ts * ts) / (1.0 + w * w * ts * ts));
                 }
-                if (mod->rho[j][i][k] == 0.0)
+                if (mod.rho[j, i, k] == 0.0)
                     log_warn("rho=0 detected by MYID=%d at i=%d,j=%d,k=%d\n", gv->MYID, i, j, k);
                 else
-                    c = sqrt(mod->pi[j][i][k] * (1.0 + sum) / mod->rho[j][i][k]);
+                    c = sqrt(mod.pi[j, i, k] * (1.0 + sum) / mod.rho[j, i, k]);
                 if (cmin_p > c)
                     cmin_p = c;
             }
diff --git a/src/constant_boundary.cpp b/src/constant_boundary.cpp
index 6095c0180f73a27b09861695c1a503d7e6b86590..0ebe82dc5337243fca2063e04eef52de78025228 100644
--- a/src/constant_boundary.cpp
+++ b/src/constant_boundary.cpp
@@ -23,7 +23,7 @@
 
 #include "fd.hpp"
 
-void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
+void constant_boundary(const st_boundary *nb, st_model &mod, const GlobVar *gv)
 {
     int dist = 4;
     int dum1 = 1;
@@ -34,9 +34,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum1 = 2;
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[1][i][k] = mod->u[1][gv->FW + 1 + dist][k];
-                    mod->pi[1][i][k] = mod->pi[1][gv->FW + 1 + dist][k];
-                    mod->rho[1][i][k] = mod->rho[1][gv->FW + 1 + dist][k];
+                    mod.u[1, i, k] = mod.u[1, gv->FW + 1 + dist, k];
+                    mod.pi[1, i, k] = mod.pi[1, gv->FW + 1 + dist, k];
+                    mod.rho[1, i, k] = mod.rho[1, gv->FW + 1 + dist, k];
                 }
             }
         }
@@ -44,38 +44,31 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[gv->NY][i][k] = mod->u[gv->NY][gv->FW + 1 + dist][k];
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][gv->FW + 1 + dist][k];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][gv->FW + 1 + dist][k];
+                    mod.u[gv->NY, i, k] = mod.u[gv->NY, gv->FW + 1 + dist, k];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, gv->FW + 1 + dist, k];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, gv->FW + 1 + dist, k];
                 }
             }
         }
         for (int j = dum1; j <= dum2; j++) {
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[j][i][k] =
-                        (3.0 * mod->u[j][gv->FW + 1 + dist][k] + mod->u[j - 1][gv->FW + 1 + dist][k] +
-                         mod->u[j + 1][gv->FW + 1 + dist][k] + mod->u[j][gv->FW + 1 + dist][k - 1] +
-                         mod->u[j][gv->FW + 1 +
-                                   dist][k +
-                                         1] +
-                         mod->u[j][gv->FW + 2 + dist][k]) / 8.0f;
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][gv->FW + 1 + dist][k] + mod->pi[j - 1][gv->FW + 1 + dist][k] +
-                         mod->pi[j + 1][gv->FW + 1 + dist][k] + mod->pi[j][gv->FW + 1 + dist][k - 1] +
-                         mod->pi[j][gv->FW + 1 +
-                                    dist][
-                             k + 1] +
-                         mod->pi[j][gv->FW + 2 + dist][k]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][gv->FW + 1 + dist][k] + mod->rho[j - 1][gv->FW + 1 + dist][k] +
-                         mod->rho[j + 1][gv->FW + 1 + dist][k] + mod->rho[j][gv->FW + 1 + dist][k - 1] +
-                         mod->rho[j][gv->FW + 1 +
-                                     dist]
-                         [k +
-                          1]
+                    mod.u[j, i, k] =
+                        (3.0 * mod.u[j, gv->FW + 1 + dist, k] + mod.u[j - 1, gv->FW + 1 + dist, k] +
+                         mod.u[j + 1, gv->FW + 1 + dist, k] + mod.u[j, gv->FW + 1 + dist, k - 1] +
+                         mod.u[j, gv->FW + 1 + dist, k + 1] +
+                         mod.u[j, gv->FW + 2 + dist, k]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, gv->FW + 1 + dist, k] + mod.pi[j - 1, gv->FW + 1 + dist, k] +
+                         mod.pi[j + 1, gv->FW + 1 + dist, k] + mod.pi[j, gv->FW + 1 + dist, k - 1] +
+                         mod.pi[j, gv->FW + 1 + dist, k + 1] +
+                         mod.pi[j, gv->FW + 2 + dist, k]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, gv->FW + 1 + dist, k] + mod.rho[j - 1, gv->FW + 1 + dist, k] +
+                         mod.rho[j + 1, gv->FW + 1 + dist, k] + mod.rho[j, gv->FW + 1 + dist, k - 1] +
+                         mod.rho[j, gv->FW + 1 + dist, k + 1]
                          +
-                         mod->rho[j][gv->FW + 2 + dist][k]) / 8.0f;
+                         mod.rho[j, gv->FW + 2 + dist, k]) / 8.0f;
                 }
             }
         }
@@ -86,9 +79,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum1 = 2;
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[1][i][k] = mod->u[1][nb->nx2 - dist][k];
-                    mod->pi[1][i][k] = mod->pi[1][nb->nx2 - dist][k];
-                    mod->rho[1][i][k] = mod->rho[1][nb->nx2 - dist][k];
+                    mod.u[1, i, k] = mod.u[1, nb->nx2 - dist, k];
+                    mod.pi[1, i, k] = mod.pi[1, nb->nx2 - dist, k];
+                    mod.rho[1, i, k] = mod.rho[1, nb->nx2 - dist, k];
                 }
             }
         }
@@ -96,33 +89,32 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum2 = gv->NY - 1;
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[gv->NY][i][k] = mod->u[gv->NY][nb->nx2 - dist][k];
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][nb->nx2 - dist][k];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][nb->nx2 - dist][k];
+                    mod.u[gv->NY, i, k] = mod.u[gv->NY, nb->nx2 - dist, k];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, nb->nx2 - dist, k];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, nb->nx2 - dist, k];
                 }
             }
         }
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->u[j][i][k] =
-                        (3.0 * mod->u[j][nb->nx2 - dist][k] + mod->u[j - 1][nb->nx2 - dist][k] +
-                         mod->u[j + 1][nb->nx2 - dist][k] +
-                         mod->u[j][nb->nx2 - dist][k - 1] + mod->u[j][nb->nx2 - dist][k + 1] + mod->u[j][nb->nx2 - 1 -
-                                                                                                         dist][k]) /
+                    mod.u[j, i, k] =
+                        (3.0 * mod.u[j, nb->nx2 - dist, k] + mod.u[j - 1, nb->nx2 - dist, k] +
+                         mod.u[j + 1, nb->nx2 - dist, k] +
+                         mod.u[j, nb->nx2 - dist, k - 1] + mod.u[j, nb->nx2 - dist,
+                                                                 k + 1] + mod.u[j, nb->nx2 - 1 - dist, k]) /
                         8.0f;
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][nb->nx2 - dist][k] + mod->pi[j - 1][nb->nx2 - dist][k] +
-                         mod->pi[j + 1][nb->nx2 - dist][k] + mod->pi[j][nb->nx2 - dist][k - 1] +
-                         mod->pi[j][nb->nx2 - dist][k + 1] +
-                         mod->pi[j][nb->nx2 - 1 - dist][k]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][nb->nx2 - dist][k] + mod->rho[j - 1][nb->nx2 - dist][k] +
-                         mod->rho[j + 1][nb->nx2 - dist][k] + mod->rho[j][nb->nx2 - dist][k - 1] +
-                         mod->rho[j][nb->nx2 - dist][k +
-                                                     1]
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, nb->nx2 - dist, k] + mod.pi[j - 1, nb->nx2 - dist, k] +
+                         mod.pi[j + 1, nb->nx2 - dist, k] + mod.pi[j, nb->nx2 - dist, k - 1] +
+                         mod.pi[j, nb->nx2 - dist, k + 1] +
+                         mod.pi[j, nb->nx2 - 1 - dist, k]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, nb->nx2 - dist, k] + mod.rho[j - 1, nb->nx2 - dist, k] +
+                         mod.rho[j + 1, nb->nx2 - dist, k] + mod.rho[j, nb->nx2 - dist, k - 1] +
+                         mod.rho[j, nb->nx2 - dist, k + 1]
                          +
-                         mod->rho[j][nb->nx2 - 1 - dist][k]) / 8.0f;
+                         mod.rho[j, nb->nx2 - 1 - dist, k]) / 8.0f;
                 }
             }
         }
@@ -133,9 +125,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum1 = 2;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->u[1][i][k] = mod->u[1][i][gv->FW + 1 + dist];
-                    mod->pi[1][i][k] = mod->pi[1][i][gv->FW + 1 + dist];
-                    mod->rho[1][i][k] = mod->rho[1][i][gv->FW + 1 + dist];
+                    mod.u[1, i, k] = mod.u[1, i, gv->FW + 1 + dist];
+                    mod.pi[1, i, k] = mod.pi[1, i, gv->FW + 1 + dist];
+                    mod.rho[1, i, k] = mod.rho[1, i, gv->FW + 1 + dist];
                 }
             }
         }
@@ -143,9 +135,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->u[gv->NY][i][k] = mod->u[gv->NY][i][gv->FW + 1 + dist];
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][i][gv->FW + 1 + dist];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][i][gv->FW + 1 + dist];
+                    mod.u[gv->NY, i, k] = mod.u[gv->NY, i, gv->FW + 1 + dist];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, i, gv->FW + 1 + dist];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, i, gv->FW + 1 + dist];
                 }
             }
         }
@@ -153,9 +145,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = 1; i <= gv->FW + dist; i++) {
                     for (int k = 1; k <= gv->FW + dist; k++) {
-                        mod->u[j][i][k] = mod->u[j][i][gv->FW + 1 + dist];
-                        mod->pi[j][i][k] = mod->pi[j][i][gv->FW + 1 + dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][gv->FW + 1 + dist];
+                        mod.u[j, i, k] = mod.u[j, i, gv->FW + 1 + dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, gv->FW + 1 + dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, gv->FW + 1 + dist];
                     }
                 }
             }
@@ -164,9 +156,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                     for (int k = 1; k <= gv->FW + dist; k++) {
-                        mod->u[j][i][k] = mod->u[j][i][gv->FW + 1 + dist];
-                        mod->pi[j][i][k] = mod->pi[j][i][gv->FW + 1 + dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][gv->FW + 1 + dist];
+                        mod.u[j, i, k] = mod.u[j, i, gv->FW + 1 + dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, gv->FW + 1 + dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, gv->FW + 1 + dist];
                     }
                 }
             }
@@ -174,30 +166,22 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->u[j][i][k] =
-                        (3.0 * mod->u[j][i][gv->FW + 1 + dist] + mod->u[j - 1][i][gv->FW + 1 + dist] +
-                         mod->u[j + 1][i][gv->FW + 1 + dist] + mod->u[j][i - 1][gv->FW + 1 + dist] +
-                         mod->u[j][i + 1][gv->FW + 1 +
-                                          dist]
+                    mod.u[j, i, k] =
+                        (3.0 * mod.u[j, i, gv->FW + 1 + dist] + mod.u[j - 1, i, gv->FW + 1 + dist] +
+                         mod.u[j + 1, i, gv->FW + 1 + dist] + mod.u[j, i - 1, gv->FW + 1 + dist] +
+                         mod.u[j, i + 1, gv->FW + 1 + dist]
                          +
-                         mod->u[j][i][gv->FW + 2 + dist]) / 8.0f;
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][i][gv->FW + 1 + dist] + mod->pi[j - 1][i][gv->FW + 1 + dist] +
-                         mod->pi[j + 1][i][gv->FW + 1 + dist] + mod->pi[j][i - 1][gv->FW + 1 + dist] +
-                         mod->pi[j][i + 1][gv->FW +
-                                           1
-                                           +
-                                           dist]
-                         +
-                         mod->pi[j][i][gv->FW + 2 + dist]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][i][gv->FW + 1 + dist] + mod->rho[j - 1][i][gv->FW + 1 + dist] +
-                         mod->rho[j + 1][i][gv->FW + 1 + dist] + mod->rho[j][i - 1][gv->FW + 1 + dist] +
-                         mod->rho[j][i + 1][gv->FW +
-                                            1
-                                            +
-                                            dist]
-                         + mod->rho[j][i][gv->FW + 2 + dist]) / 8.0f;
+                         mod.u[j, i, gv->FW + 2 + dist]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, i, gv->FW + 1 + dist] + mod.pi[j - 1, i, gv->FW + 1 + dist] +
+                         mod.pi[j + 1, i, gv->FW + 1 + dist] + mod.pi[j, i - 1, gv->FW + 1 + dist] +
+                         mod.pi[j, i + 1, gv->FW + 1 + dist] +
+                         mod.pi[j, i, gv->FW + 2 + dist]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, i, gv->FW + 1 + dist] + mod.rho[j - 1, i, gv->FW + 1 + dist] +
+                         mod.rho[j + 1, i, gv->FW + 1 + dist] + mod.rho[j, i - 1, gv->FW + 1 + dist] +
+                         mod.rho[j, i + 1, gv->FW + 1 + dist]
+                         + mod.rho[j, i, gv->FW + 2 + dist]) / 8.0f;
                 }
             }
         }
@@ -208,9 +192,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum1 = 2;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->u[1][i][k] = mod->u[1][i][nb->nz2 - dist];
-                    mod->pi[1][i][k] = mod->pi[1][i][nb->nz2 - dist];
-                    mod->rho[1][i][k] = mod->rho[1][i][nb->nz2 - dist];
+                    mod.u[1, i, k] = mod.u[1, i, nb->nz2 - dist];
+                    mod.pi[1, i, k] = mod.pi[1, i, nb->nz2 - dist];
+                    mod.rho[1, i, k] = mod.rho[1, i, nb->nz2 - dist];
                 }
             }
         }
@@ -218,9 +202,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->u[gv->NY][i][k] = mod->u[gv->NY][i][nb->nz2 - dist];
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][i][nb->nz2 - dist];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][i][nb->nz2 - dist];
+                    mod.u[gv->NY, i, k] = mod.u[gv->NY, i, nb->nz2 - dist];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, i, nb->nz2 - dist];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, i, nb->nz2 - dist];
                 }
             }
         }
@@ -228,9 +212,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = 1; i <= gv->FW + dist; i++) {
                     for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                        mod->u[j][i][k] = mod->u[j][i][nb->nz2 - dist];
-                        mod->pi[j][i][k] = mod->pi[j][i][nb->nz2 - dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][nb->nz2 - dist];
+                        mod.u[j, i, k] = mod.u[j, i, nb->nz2 - dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, nb->nz2 - dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, nb->nz2 - dist];
                     }
                 }
             }
@@ -239,9 +223,9 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                     for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                        mod->u[j][i][k] = mod->u[j][i][nb->nz2 - dist];
-                        mod->pi[j][i][k] = mod->pi[j][i][nb->nz2 - dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][nb->nz2 - dist];
+                        mod.u[j, i, k] = mod.u[j, i, nb->nz2 - dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, nb->nz2 - dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, nb->nz2 - dist];
                     }
                 }
             }
@@ -249,25 +233,22 @@ void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv)
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->u[j][i][k] =
-                        (3.0 * mod->u[j][i][nb->nz2 - dist] + mod->u[j - 1][i][nb->nz2 - dist] +
-                         mod->u[j + 1][i][nb->nz2 - dist] +
-                         mod->u[j][i - 1][nb->nz2 - dist] + mod->u[j][i + 1][nb->nz2 - dist] +
-                         mod->u[j][i][nb->nz2 - 1 -
-                                      dist]) /
+                    mod.u[j, i, k] =
+                        (3.0 * mod.u[j, i, nb->nz2 - dist] + mod.u[j - 1, i, nb->nz2 - dist] +
+                         mod.u[j + 1, i, nb->nz2 - dist] +
+                         mod.u[j, i - 1, nb->nz2 - dist] + mod.u[j, i + 1, nb->nz2 - dist] +
+                         mod.u[j, i, nb->nz2 - 1 - dist]) /
                         8.0f;
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][i][nb->nz2 - dist] + mod->pi[j - 1][i][nb->nz2 - dist] +
-                         mod->pi[j + 1][i][nb->nz2 - dist] + mod->pi[j][i - 1][nb->nz2 - dist] +
-                         mod->pi[j][i + 1][nb->nz2 - dist] +
-                         mod->pi[j][i][nb->nz2 - dist - 1]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][i][nb->nz2 - dist] + mod->rho[j - 1][i][nb->nz2 - dist] +
-                         mod->rho[j + 1][i][nb->nz2 - dist] + mod->rho[j][i - 1][nb->nz2 - dist] +
-                         mod->rho[j][i + 1][nb->nz2 -
-                                            dist]
-                         +
-                         mod->rho[j][i][nb->nz2 - dist - 1]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, i, nb->nz2 - dist] + mod.pi[j - 1, i, nb->nz2 - dist] +
+                         mod.pi[j + 1, i, nb->nz2 - dist] + mod.pi[j, i - 1, nb->nz2 - dist] +
+                         mod.pi[j, i + 1, nb->nz2 - dist] +
+                         mod.pi[j, i, nb->nz2 - dist - 1]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, i, nb->nz2 - dist] + mod.rho[j - 1, i, nb->nz2 - dist] +
+                         mod.rho[j + 1, i, nb->nz2 - dist] + mod.rho[j, i - 1, nb->nz2 - dist] +
+                         mod.rho[j, i + 1, nb->nz2 - dist] +
+                         mod.rho[j, i, nb->nz2 - dist - 1]) / 8.0f;
                 }
             }
         }
diff --git a/src/constant_boundary_acoustic.cpp b/src/constant_boundary_acoustic.cpp
index f8221df51c79eff5e7a2fb5d7bd9ec217b126640..63f2f5e43a672aa8cfefdb734dc3644e73fad4cb 100644
--- a/src/constant_boundary_acoustic.cpp
+++ b/src/constant_boundary_acoustic.cpp
@@ -23,7 +23,7 @@
 
 #include "fd.hpp"
 
-void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const GlobVar *gv)
+void constant_boundary_acoustic(const st_boundary *nb, st_model &mod, const GlobVar *gv)
 {
     int dum1, dum2;
     int dist = 4;
@@ -36,8 +36,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum1 = 2;
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[1][i][k] = mod->pi[1][gv->FW + 1 + dist][k];
-                    mod->rho[1][i][k] = mod->rho[1][gv->FW + 1 + dist][k];
+                    mod.pi[1, i, k] = mod.pi[1, gv->FW + 1 + dist, k];
+                    mod.rho[1, i, k] = mod.rho[1, gv->FW + 1 + dist, k];
                 }
             }
         }
@@ -45,22 +45,22 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][gv->FW + 1 + dist][k];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][gv->FW + 1 + dist][k];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, gv->FW + 1 + dist, k];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, gv->FW + 1 + dist, k];
                 }
             }
         }
         for (int j = dum1; j <= dum2; j++) {
             for (int i = 1; i <= gv->FW + dist; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][gv->FW + 1 + dist][k] + mod->pi[j - 1][gv->FW + 1 + dist][k] +
-                         mod->pi[j + 1][gv->FW + 1 + dist][k] + mod->pi[j][gv->FW + 1 + dist][k - 1] +
-                         mod->pi[j][gv->FW + 1 + dist][k + 1] + mod->pi[j][gv->FW + 2 + dist][k]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][gv->FW + 1 + dist][k] + mod->rho[j - 1][gv->FW + 1 + dist][k] +
-                         mod->rho[j + 1][gv->FW + 1 + dist][k] + mod->rho[j][gv->FW + 1 + dist][k - 1] +
-                         mod->rho[j][gv->FW + 1 + dist][k + 1] + mod->rho[j][gv->FW + 2 + dist][k]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, gv->FW + 1 + dist, k] + mod.pi[j - 1, gv->FW + 1 + dist, k] +
+                         mod.pi[j + 1, gv->FW + 1 + dist, k] + mod.pi[j, gv->FW + 1 + dist, k - 1] +
+                         mod.pi[j, gv->FW + 1 + dist, k + 1] + mod.pi[j, gv->FW + 2 + dist, k]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, gv->FW + 1 + dist, k] + mod.rho[j - 1, gv->FW + 1 + dist, k] +
+                         mod.rho[j + 1, gv->FW + 1 + dist, k] + mod.rho[j, gv->FW + 1 + dist, k - 1] +
+                         mod.rho[j, gv->FW + 1 + dist, k + 1] + mod.rho[j, gv->FW + 2 + dist, k]) / 8.0f;
                 }
             }
         }
@@ -71,8 +71,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum1 = 2;
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[1][i][k] = mod->pi[1][nb->nx2 - dist][k];
-                    mod->rho[1][i][k] = mod->rho[1][nb->nx2 - dist][k];
+                    mod.pi[1, i, k] = mod.pi[1, nb->nx2 - dist, k];
+                    mod.rho[1, i, k] = mod.rho[1, nb->nx2 - dist, k];
                 }
             }
         }
@@ -80,23 +80,23 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum2 = gv->NY - 1;
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][nb->nx2 - dist][k];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][nb->nx2 - dist][k];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, nb->nx2 - dist, k];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, nb->nx2 - dist, k];
                 }
             }
         }
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][nb->nx2 - dist][k] + mod->pi[j - 1][nb->nx2 - dist][k] +
-                         mod->pi[j + 1][nb->nx2 - dist][k] + mod->pi[j][nb->nx2 - dist][k - 1] +
-                         mod->pi[j][nb->nx2 - dist][k + 1] +
-                         mod->pi[j][nb->nx2 - 1 - dist][k]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][nb->nx2 - dist][k] + mod->rho[j - 1][nb->nx2 - dist][k] +
-                         mod->rho[j + 1][nb->nx2 - dist][k] + mod->rho[j][nb->nx2 - dist][k - 1] +
-                         mod->rho[j][nb->nx2 - dist][k + 1] + mod->rho[j][nb->nx2 - 1 - dist][k]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, nb->nx2 - dist, k] + mod.pi[j - 1, nb->nx2 - dist, k] +
+                         mod.pi[j + 1, nb->nx2 - dist, k] + mod.pi[j, nb->nx2 - dist, k - 1] +
+                         mod.pi[j, nb->nx2 - dist, k + 1] +
+                         mod.pi[j, nb->nx2 - 1 - dist, k]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, nb->nx2 - dist, k] + mod.rho[j - 1, nb->nx2 - dist, k] +
+                         mod.rho[j + 1, nb->nx2 - dist, k] + mod.rho[j, nb->nx2 - dist, k - 1] +
+                         mod.rho[j, nb->nx2 - dist, k + 1] + mod.rho[j, nb->nx2 - 1 - dist, k]) / 8.0f;
                 }
             }
         }
@@ -107,8 +107,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum1 = 2;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->pi[1][i][k] = mod->pi[1][i][gv->FW + 1 + dist];
-                    mod->rho[1][i][k] = mod->rho[1][i][gv->FW + 1 + dist];
+                    mod.pi[1, i, k] = mod.pi[1, i, gv->FW + 1 + dist];
+                    mod.rho[1, i, k] = mod.rho[1, i, gv->FW + 1 + dist];
                 }
             }
         }
@@ -116,8 +116,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][i][gv->FW + 1 + dist];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][i][gv->FW + 1 + dist];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, i, gv->FW + 1 + dist];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, i, gv->FW + 1 + dist];
                 }
             }
         }
@@ -125,8 +125,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = 1; i <= gv->FW + dist; i++) {
                     for (int k = 1; k <= gv->FW + dist; k++) {
-                        mod->pi[j][i][k] = mod->pi[j][i][gv->FW + 1 + dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][gv->FW + 1 + dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, gv->FW + 1 + dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, gv->FW + 1 + dist];
                     }
                 }
             }
@@ -135,8 +135,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                     for (int k = 1; k <= gv->FW + dist; k++) {
-                        mod->pi[j][i][k] = mod->pi[j][i][gv->FW + 1 + dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][gv->FW + 1 + dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, gv->FW + 1 + dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, gv->FW + 1 + dist];
                     }
                 }
             }
@@ -144,14 +144,14 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = 1; k <= gv->FW + dist; k++) {
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][i][gv->FW + 1 + dist] + mod->pi[j - 1][i][gv->FW + 1 + dist] +
-                         mod->pi[j + 1][i][gv->FW + 1 + dist] + mod->pi[j][i - 1][gv->FW + 1 + dist] +
-                         mod->pi[j][i + 1][gv->FW + 1 + dist] + mod->pi[j][i][gv->FW + 2 + dist]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][i][gv->FW + 1 + dist] + mod->rho[j - 1][i][gv->FW + 1 + dist] +
-                         mod->rho[j + 1][i][gv->FW + 1 + dist] + mod->rho[j][i - 1][gv->FW + 1 + dist] +
-                         mod->rho[j][i + 1][gv->FW + 1 + dist] + mod->rho[j][i][gv->FW + 2 + dist]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, i, gv->FW + 1 + dist] + mod.pi[j - 1, i, gv->FW + 1 + dist] +
+                         mod.pi[j + 1, i, gv->FW + 1 + dist] + mod.pi[j, i - 1, gv->FW + 1 + dist] +
+                         mod.pi[j, i + 1, gv->FW + 1 + dist] + mod.pi[j, i, gv->FW + 2 + dist]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, i, gv->FW + 1 + dist] + mod.rho[j - 1, i, gv->FW + 1 + dist] +
+                         mod.rho[j + 1, i, gv->FW + 1 + dist] + mod.rho[j, i - 1, gv->FW + 1 + dist] +
+                         mod.rho[j, i + 1, gv->FW + 1 + dist] + mod.rho[j, i, gv->FW + 2 + dist]) / 8.0f;
                 }
             }
         }
@@ -162,8 +162,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum1 = 2;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->pi[1][i][k] = mod->pi[1][i][nb->nz2 - dist];
-                    mod->rho[1][i][k] = mod->rho[1][i][nb->nz2 - dist];
+                    mod.pi[1, i, k] = mod.pi[1, i, nb->nz2 - dist];
+                    mod.rho[1, i, k] = mod.rho[1, i, nb->nz2 - dist];
                 }
             }
         }
@@ -171,8 +171,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             dum2 = gv->NY - 1;
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->pi[gv->NY][i][k] = mod->pi[gv->NY][i][nb->nz2 - dist];
-                    mod->rho[gv->NY][i][k] = mod->rho[gv->NY][i][nb->nz2 - dist];
+                    mod.pi[gv->NY, i, k] = mod.pi[gv->NY, i, nb->nz2 - dist];
+                    mod.rho[gv->NY, i, k] = mod.rho[gv->NY, i, nb->nz2 - dist];
                 }
             }
         }
@@ -180,8 +180,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = 1; i <= gv->FW + dist; i++) {
                     for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                        mod->pi[j][i][k] = mod->pi[j][i][nb->nz2 - dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][nb->nz2 - dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, nb->nz2 - dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, nb->nz2 - dist];
                     }
                 }
             }
@@ -190,8 +190,8 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
             for (int j = dum1; j <= dum2; j++) {
                 for (int i = nb->nx2 + 1 - dist; i <= nb->nx2 + gv->FW; i++) {
                     for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                        mod->pi[j][i][k] = mod->pi[j][i][nb->nz2 - dist];
-                        mod->rho[j][i][k] = mod->rho[j][i][nb->nz2 - dist];
+                        mod.pi[j, i, k] = mod.pi[j, i, nb->nz2 - dist];
+                        mod.rho[j, i, k] = mod.rho[j, i, nb->nz2 - dist];
                     }
                 }
             }
@@ -199,14 +199,14 @@ void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const Glob
         for (int j = dum1; j <= dum2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = nb->nz2 + 1 - dist; k <= nb->nz2 + gv->FW; k++) {
-                    mod->pi[j][i][k] =
-                        (3.0 * mod->pi[j][i][nb->nz2 - dist] + mod->pi[j - 1][i][nb->nz2 - dist] +
-                         mod->pi[j + 1][i][nb->nz2 - dist] + mod->pi[j][i - 1][nb->nz2 - dist] +
-                         mod->pi[j][i + 1][nb->nz2 - dist] + mod->pi[j][i][nb->nz2 - dist - 1]) / 8.0f;
-                    mod->rho[j][i][k] =
-                        (3.0 * mod->rho[j][i][nb->nz2 - dist] + mod->rho[j - 1][i][nb->nz2 - dist] +
-                         mod->rho[j + 1][i][nb->nz2 - dist] + mod->rho[j][i - 1][nb->nz2 - dist] +
-                         mod->rho[j][i + 1][nb->nz2 - dist] + mod->rho[j][i][nb->nz2 - dist - 1]) / 8.0f;
+                    mod.pi[j, i, k] =
+                        (3.0 * mod.pi[j, i, nb->nz2 - dist] + mod.pi[j - 1, i, nb->nz2 - dist] +
+                         mod.pi[j + 1, i, nb->nz2 - dist] + mod.pi[j, i - 1, nb->nz2 - dist] +
+                         mod.pi[j, i + 1, nb->nz2 - dist] + mod.pi[j, i, nb->nz2 - dist - 1]) / 8.0f;
+                    mod.rho[j, i, k] =
+                        (3.0 * mod.rho[j, i, nb->nz2 - dist] + mod.rho[j - 1, i, nb->nz2 - dist] +
+                         mod.rho[j + 1, i, nb->nz2 - dist] + mod.rho[j, i - 1, nb->nz2 - dist] +
+                         mod.rho[j, i + 1, nb->nz2 - dist] + mod.rho[j, i, nb->nz2 - dist - 1]) / 8.0f;
                 }
             }
         }
diff --git a/src/cpmodel.cpp b/src/cpmodel.cpp
index 30871119c7dc07dab85c7dd6fecda9da0aa0aa1c..49370c41d2d6bef2210932e5a03b8ca9e32d35bc 100644
--- a/src/cpmodel.cpp
+++ b/src/cpmodel.cpp
@@ -24,20 +24,20 @@
 
 #include "fd.hpp"
 
-void cpmodel(st_model *mod, st_model *testmod, const GlobVar *gv)
+void cpmodel(st_model &mod, st_model &testmod, const GlobVar *gv)
 {
     for (int j = 1; j <= gv->NY; j++) {
         for (int i = 1; i <= gv->NX; i++) {
             for (int k = 1; k <= gv->NZ; k++) {
-                testmod->rho[j][i][k] = 0.0;
-                testmod->rho[j][i][k] = mod->rho[j][i][k];
+                testmod.rho[j, i, k] = 0.0;
+                testmod.rho[j, i, k] = mod.rho[j, i, k];
 
-                testmod->pi[j][i][k] = 0.0;
-                testmod->pi[j][i][k] = mod->pi[j][i][k];
+                testmod.pi[j, i, k] = 0.0;
+                testmod.pi[j, i, k] = mod.pi[j, i, k];
 
                 if (gv->L) {
-                    testmod->taup[j][i][k] = 0.0;
-                    testmod->taup[j][i][k] = mod->taup[j][i][k];
+                    testmod.taup[j, i, k] = 0.0;
+                    testmod.taup[j, i, k] = mod.taup[j, i, k];
                 }
             }
         }
@@ -46,12 +46,12 @@ void cpmodel(st_model *mod, st_model *testmod, const GlobVar *gv)
         for (int j = 1; j <= gv->NY; j++) {
             for (int i = 1; i <= gv->NX; i++) {
                 for (int k = 1; k <= gv->NZ; k++) {
-                    testmod->u[j][i][k] = 0.0;
-                    testmod->u[j][i][k] = mod->u[j][i][k];
+                    testmod.u[j, i, k] = 0.0;
+                    testmod.u[j, i, k] = mod.u[j, i, k];
 
                     if (gv->L) {
-                        testmod->taus[j][i][k] = 0.0;
-                        testmod->taus[j][i][k] = mod->taus[j][i][k];
+                        testmod.taus[j, i, k] = 0.0;
+                        testmod.taus[j, i, k] = mod.taus[j, i, k];
                     }
                 }
             }
@@ -60,8 +60,8 @@ void cpmodel(st_model *mod, st_model *testmod, const GlobVar *gv)
 
     if (gv->L) {
         for (int l = 1; l <= gv->L; l++) {
-            testmod->eta[l] = 0.0;
-            testmod->eta[l] = mod->eta[l];
+            testmod.eta[l] = 0.0;
+            testmod.eta[l] = mod.eta[l];
         }
     }
 }
diff --git a/src/disc_fourier.cpp b/src/disc_fourier.cpp
index d1a7c9dfdfdb30f3939f7c0422980d4970b5c197..ad7c93f6ca70a8d920c20ff62b325555038ff3fe 100644
--- a/src/disc_fourier.cpp
+++ b/src/disc_fourier.cpp
@@ -25,7 +25,7 @@
 
 #include "fd.hpp"
 
-void discfourier(const st_boundary *nb, int nt, st_velocity *vel,
+void discfourier(const st_boundary *nb, int nt, st_velocity &vel,
                  st_freq_velocity *fourier_vel, const float *finv,
                  int nf, int ntast, int pshot1, int back, const GlobVar *gv)
 {
@@ -43,12 +43,12 @@ void discfourier(const st_boundary *nb, int nt, st_velocity *vel,
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    fourier_vel->Fvx_re[m][j][i][k] += vel->vx[j][i][k] * trig1;
-                    fourier_vel->Fvy_re[m][j][i][k] += vel->vy[j][i][k] * trig1;
-                    fourier_vel->Fvz_re[m][j][i][k] += vel->vz[j][i][k] * trig1;
-                    fourier_vel->Fvx_im[m][j][i][k] += vel->vx[j][i][k] * trig2;
-                    fourier_vel->Fvy_im[m][j][i][k] += vel->vy[j][i][k] * trig2;
-                    fourier_vel->Fvz_im[m][j][i][k] += vel->vz[j][i][k] * trig2;
+                    fourier_vel->Fvx_re[m][j][i][k] += vel.vx[j, i, k] * trig1;
+                    fourier_vel->Fvy_re[m][j][i][k] += vel.vy[j, i, k] * trig1;
+                    fourier_vel->Fvz_re[m][j][i][k] += vel.vz[j, i, k] * trig1;
+                    fourier_vel->Fvx_im[m][j][i][k] += vel.vx[j, i, k] * trig2;
+                    fourier_vel->Fvy_im[m][j][i][k] += vel.vy[j, i, k] * trig2;
+                    fourier_vel->Fvz_im[m][j][i][k] += vel.vz[j, i, k] * trig2;
                 }
             }
         }
diff --git a/src/exchange_buffer.cpp b/src/exchange_buffer.cpp
index bf65d28f0b5a6009db35a5054deb95ce286e4437..e6eeccd263ae70d3e86413678454a49568bc415e 100644
--- a/src/exchange_buffer.cpp
+++ b/src/exchange_buffer.cpp
@@ -1,5 +1,7 @@
-#include <stddef.h>
+#include "float3DTensorT.hpp"
 #include <cstring>
+#include <stddef.h>
+#include <utility> // swap
 
 // Choose default method to push and pop data to the buffer
 // available methods: OPENMP, MEMCPY
@@ -10,32 +12,20 @@
 
 #ifdef BUFFER_EXCHANGE_USE_METHOD_OPENMP
 int buffer_push(
-    float *__restrict__ buffer, float ***__restrict__ src,
+    float *__restrict__ buffer, float3DTensorT &src,
     int i1_start, int i1_end,
     int i2_start, int i2_end,
     int i3_start, int i3_end,
     int buffer_counter)
 {
-    if (i1_end < i1_start) {
-        int swap = i1_start;
-        i1_start = i1_end;
-        i1_end = swap;
-    }
-    if (i2_end < i2_start) {
-        int swap = i2_start;
-        i2_start = i2_end;
-        i2_end = swap;
-    }
-    if (i3_end < i3_start) {
-        int swap = i3_start;
-        i3_start = i3_end;
-        i3_end = swap;
-    }
+    if (i1_end < i1_start) std::swap(i1_start, i1_end);
+    if (i2_end < i2_start) std::swap(i2_start, i2_end);
+    if (i3_end < i3_start) std::swap(i3_start, i3_end);
     for (int i1 = i1_start; i1 <= i1_end; i1++) {
         for (int i2 = i2_start; i2 <= i2_end; i2++) {
             #pragma omp simd
             for (int i3 = i3_start; i3 <= i3_end; i3++) {
-                buffer[buffer_counter++] = src[i1][i2][i3];
+                buffer[buffer_counter++] = src[i1, i2, i3];
             }
         }
     }
@@ -43,32 +33,20 @@ int buffer_push(
 }
 
 int buffer_pop(
-    float ***__restrict__ dest, float *__restrict__ buffer,
+    float3DTensorT &dest, float *__restrict__ buffer,
     int i1_start, int i1_end,
     int i2_start, int i2_end,
     int i3_start, int i3_end,
     int buffer_counter)
 {
-    if (i1_end < i1_start) {
-        int swap = i1_start;
-        i1_start = i1_end;
-        i1_end = swap;
-    }
-    if (i2_end < i2_start) {
-        int swap = i2_start;
-        i2_start = i2_end;
-        i2_end = swap;
-    }
-    if (i3_end < i3_start) {
-        int swap = i3_start;
-        i3_start = i3_end;
-        i3_end = swap;
-    }
+    if (i1_end < i1_start) std::swap(i1_start, i1_end);
+    if (i2_end < i2_start) std::swap(i2_start, i2_end);
+    if (i3_end < i3_start) std::swap(i3_start, i3_end);
     for (int i1 = i1_start; i1 <= i1_end; i1++) {
         for (int i2 = i2_start; i2 <= i2_end; i2++) {
             #pragma omp simd
             for (int i3 = i3_start; i3 <= i3_end; i3++) {
-                dest[i1][i2][i3] = buffer[buffer_counter++];
+                dest[i1, i2, i3] = buffer[buffer_counter++];
             }
         }
     }
@@ -78,31 +56,19 @@ int buffer_pop(
 
 #ifdef BUFFER_EXCHANGE_USE_METHOD_MEMCPY
 int buffer_push(
-    float *__restrict__ buffer, float ***__restrict__ src,
+    float *__restrict__ buffer, float3DTensorT &src,
     int i1_start, int i1_end,
     int i2_start, int i2_end,
     int i3_start, int i3_end,
     int buffer_counter)
 {
-    if (i1_end < i1_start) {
-        int swap = i1_start;
-        i1_start = i1_end;
-        i1_end = swap;
-    }
-    if (i2_end < i2_start) {
-        int swap = i2_start;
-        i2_start = i2_end;
-        i2_end = swap;
-    }
-    if (i3_end < i3_start) {
-        int swap = i3_start;
-        i3_start = i3_end;
-        i3_end = swap;
-    }
+    if (i1_end < i1_start) std::swap(i1_start, i1_end);
+    if (i2_end < i2_start) std::swap(i2_start, i2_end);
+    if (i3_end < i3_start) std::swap(i3_start, i3_end);
     const size_t vec_len = i3_end - i3_start + 1;
     for (int i1 = i1_start; i1 <= i1_end; i1++) {
         for (int i2 = i2_start; i2 <= i2_end; i2++) {
-            memcpy(buffer + buffer_counter, src[i1][i2] + i3_start, vec_len * sizeof(float));
+            memcpy(buffer + buffer_counter, &src[i1, i2, i3_start], vec_len * sizeof(float));
             buffer_counter += vec_len;
         }
     }
@@ -110,31 +76,19 @@ int buffer_push(
 }
 
 int buffer_pop(
-    float ***__restrict__ dest, float *__restrict__ buffer,
+    float3DTensorT &dest, float *__restrict__ buffer,
     int i1_start, int i1_end,
     int i2_start, int i2_end,
     int i3_start, int i3_end,
     int buffer_counter)
 {
-    if (i1_end < i1_start) {
-        int swap = i1_start;
-        i1_start = i1_end;
-        i1_end = swap;
-    }
-    if (i2_end < i2_start) {
-        int swap = i2_start;
-        i2_start = i2_end;
-        i2_end = swap;
-    }
-    if (i3_end < i3_start) {
-        int swap = i3_start;
-        i3_start = i3_end;
-        i3_end = swap;
-    }
+    if (i1_end < i1_start) std::swap(i1_start, i1_end);
+    if (i2_end < i2_start) std::swap(i2_start, i2_end);
+    if (i3_end < i3_start) std::swap(i3_start, i3_end);
     const size_t vec_len = i3_end - i3_start + 1;
     for (int i1 = i1_start; i1 <= i1_end; i1++) {
         for (int i2 = i2_start; i2 <= i2_end; i2++) {
-            memcpy(dest[i1][i2] + i3_start, buffer + buffer_counter, vec_len * sizeof(float));
+            memcpy(&dest[i1, i2, i3_start], buffer + buffer_counter, vec_len * sizeof(float));
             buffer_counter += vec_len;
         }
     }
diff --git a/src/exchange_buffer.hpp b/src/exchange_buffer.hpp
index f2fba4ba007ce2f25b7159472b265e0601d0d2d4..9c1f2aebfc12cc5b920ecfdd53f4a5ec649494fa 100644
--- a/src/exchange_buffer.hpp
+++ b/src/exchange_buffer.hpp
@@ -1,13 +1,14 @@
 #ifndef _EXCHANGE_BUFFER_H_INCLUDED_
 #define _EXCHANGE_BUFFER_H_INCLUDED_
 
-int buffer_push(float *__restrict__ buffer, float ***__restrict__ src,
+#include "float3DTensorT.hpp"
+int buffer_push(float *__restrict__ buffer, float3DTensorT &src,
                 int i1_start, int i1_end,
                 int i2_start, int i2_end,
                 int i3_start, int i3_end,
                 int buffer_counter);
 
-int buffer_pop(float ***__restrict__ dest, float *__restrict__ buffer,
+int buffer_pop(float3DTensorT &dest, float *__restrict__ buffer,
                int i1_start, int i1_end,
                int i2_start, int i2_end,
                int i3_start, int i3_end,
diff --git a/src/exchange_s.cpp b/src/exchange_s.cpp
index 626539dc9fcfb1ac4b1f4f6c81881946d5cd5c72..1cd820c2ea201b1ffed8f337870f296a9694fe70 100644
--- a/src/exchange_s.cpp
+++ b/src/exchange_s.cpp
@@ -26,7 +26,7 @@
 #include "fd.hpp"
 
 #ifdef MPI_SENDRECV_REPLACE
-double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Status status;
     int n, nf1, nf2;
@@ -79,17 +79,17 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
     /* top-bottom ----------------------------------------------------------- */
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, stress->syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->top_to_bot, stress->sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->top_to_bot, stress->syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, stress.syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, stress.sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, stress.syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, stress->sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, stress.sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->bot_to_top, stress->syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, stress.syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->bot_to_top, stress->syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->bot_to_top, stress.syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, n);
     }
 
@@ -101,33 +101,33 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_top_to_bot) {
-        n = buffer_pop(stress->syy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_pop(stress->sxy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
+        n = buffer_pop(stress.syy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sxy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
                        n);
-        n = buffer_pop(stress->syz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
+        n = buffer_pop(stress.syz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
                        n);
     }
 
     if (recv_bot_to_top) {
-        n = buffer_pop(stress->sxy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_pop(stress->syz, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_pop(stress->syy, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(stress.sxy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(stress.syz, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(stress.syy, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
     }
 
     /* left-right ----------------------------------------------------------- */
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, stress->sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->lef_to_rig, stress->sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
-        n = buffer_push(buffer->lef_to_rig, stress->sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, stress.sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, stress.sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, stress.sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, stress->sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
+        n = buffer_push(buffer->rig_to_lef, stress.sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->rig_to_lef, stress->sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
+        n = buffer_push(buffer->rig_to_lef, stress.sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->rig_to_lef, stress->sxx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->rig_to_lef, stress.sxx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, n);
     }
 
@@ -139,33 +139,33 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_lef_to_rig) {
-        n = buffer_pop(stress->sxx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_pop(stress->sxy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
+        n = buffer_pop(stress.sxx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sxy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
                        n);
-        n = buffer_pop(stress->sxz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
+        n = buffer_pop(stress.sxz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
                        n);
     }
 
     if (recv_rig_to_lef) {
-        n = buffer_pop(stress->sxy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_pop(stress->sxz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
-        n = buffer_pop(stress->sxx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+        n = buffer_pop(stress.sxy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sxz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
+        n = buffer_pop(stress.sxx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
     }
 
     /* front-back ----------------------------------------------------------- */
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, stress->szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->fro_to_bac, stress->syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
-        n = buffer_push(buffer->fro_to_bac, stress->sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, stress.szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, stress.syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, stress.sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, stress->syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->bac_to_fro, stress->sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, n);
-        n = buffer_push(buffer->bac_to_fro, stress->szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
     }
 
@@ -177,17 +177,17 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_fro_to_bac) {
-        n = buffer_pop(stress->szz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
-        n = buffer_pop(stress->syz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
+        n = buffer_pop(stress.szz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
+        n = buffer_pop(stress.syz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
                        n);
-        n = buffer_pop(stress->sxz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
+        n = buffer_pop(stress.sxz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
                        n);
     }
 
     if (recv_bac_to_fro) {
-        n = buffer_pop(stress->syz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-        n = buffer_pop(stress->sxz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
-        n = buffer_pop(stress->szz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+        n = buffer_pop(stress.syz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+        n = buffer_pop(stress.sxz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
+        n = buffer_pop(stress.szz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
     }
 
     return time;
@@ -196,7 +196,7 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
 
 #ifdef MPI_ISENDRECV_REPLACE
 // requires OpenMPI version >= 5.0
-double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                MPI_REQUEST_NULL };
@@ -250,20 +250,20 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
     const bool send_bac_to_fro = gv->BOUNDARY || gv->POS[3] != gv->NPROCZ - 1;
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, stress->syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->top_to_bot, stress->sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->top_to_bot, stress->syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, stress.syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, stress.sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, stress.syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->top_to_bot, gv->NX * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot,
                           gv->INDEX[lower], tag_top_to_bot,
                           gv->COMM_SHOT, request_top_to_bot);
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, stress->sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, stress.sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->bot_to_top, stress->syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, stress.syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->bot_to_top, stress->syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->bot_to_top, stress.syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->bot_to_top, gv->NX * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top,
@@ -271,20 +271,20 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
                           gv->COMM_SHOT, request_bot_to_top);
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, stress->sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->lef_to_rig, stress->sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
-        n = buffer_push(buffer->lef_to_rig, stress->sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, stress.sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, stress.sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, stress.sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->lef_to_rig, gv->NY * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig,
                           gv->INDEX[right], tag_lef_to_rig,
                           gv->COMM_SHOT, request_lef_to_rig);
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, stress->sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
+        n = buffer_push(buffer->rig_to_lef, stress.sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->rig_to_lef, stress->sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
+        n = buffer_push(buffer->rig_to_lef, stress.sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->rig_to_lef, stress->sxx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->rig_to_lef, stress.sxx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->rig_to_lef, gv->NY * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef,
@@ -292,20 +292,20 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
                           gv->COMM_SHOT, request_rig_to_lef);
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, stress->szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->fro_to_bac, stress->syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
-        n = buffer_push(buffer->fro_to_bac, stress->sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, stress.szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, stress.syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, stress.sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
     }
     MPI_Isendrecv_replace(buffer->fro_to_bac, gv->NX * gv->NY * nf2, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac,
                           gv->INDEX[back], tag_fro_to_bac,
                           gv->COMM_SHOT, request_fro_to_bac);
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, stress->syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->bac_to_fro, stress->sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, n);
-        n = buffer_push(buffer->bac_to_fro, stress->szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
     }
     MPI_Isendrecv_replace(buffer->bac_to_fro, gv->NX * gv->NY * nf1, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro,
@@ -321,43 +321,43 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(stress->syy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(stress.syy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                            0);
-            n = buffer_pop(stress->sxy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
+            n = buffer_pop(stress.sxy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
                            gv->NZ, n);
-            n = buffer_pop(stress->syz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
+            n = buffer_pop(stress.syz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
                            gv->NZ, n);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(stress->sxy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-            n = buffer_pop(stress->syz, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-            n = buffer_pop(stress->syy, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(stress.sxy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(stress.syz, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(stress.syy, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(stress->sxx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
+            n = buffer_pop(stress.sxx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
                            0);
-            n = buffer_pop(stress->sxy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
+            n = buffer_pop(stress.sxy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
                            gv->NZ, n);
-            n = buffer_pop(stress->sxz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
+            n = buffer_pop(stress.sxz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
                            gv->NZ, n);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(stress->sxy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-            n = buffer_pop(stress->sxz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
-            n = buffer_pop(stress->sxx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+            n = buffer_pop(stress.sxy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+            n = buffer_pop(stress.sxz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
+            n = buffer_pop(stress.sxx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(stress->szz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
+            n = buffer_pop(stress.szz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
                            0);
-            n = buffer_pop(stress->syz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.syz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2 - 1, n);
-            n = buffer_pop(stress->sxz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.sxz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2 - 1, n);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(stress->syz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-            n = buffer_pop(stress->sxz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
-            n = buffer_pop(stress->szz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+            n = buffer_pop(stress.syz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+            n = buffer_pop(stress.sxz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
+            n = buffer_pop(stress.szz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
             break;
         }
     }
@@ -367,7 +367,7 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
 #endif
 
 #ifdef MPI_ISEND_IRECV
-double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request send_requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                     MPI_REQUEST_NULL, MPI_REQUEST_NULL };
@@ -463,57 +463,57 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
 
     // Send in background
     if (send_top_to_bot) {
-        n = buffer_push(buffer->send_top_to_bot, stress->syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->send_top_to_bot, stress->sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->send_top_to_bot, stress->syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_top_to_bot, stress.syy, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_top_to_bot, stress.sxy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_top_to_bot, stress.syz, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
         MPI_Isend(buffer->send_top_to_bot, n, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot, gv->COMM_SHOT,
                   request_send_top_to_bot);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->send_bot_to_top, stress->sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX,
+        n = buffer_push(buffer->send_bot_to_top, stress.sxy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX,
                         1, gv->NZ, 0);
-        n = buffer_push(buffer->send_bot_to_top, stress->syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX,
+        n = buffer_push(buffer->send_bot_to_top, stress.syz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2), 1, gv->NX,
                         1, gv->NZ, n);
-        n = buffer_push(buffer->send_bot_to_top, stress->syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->send_bot_to_top, stress.syy, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NX, 1, gv->NZ, n);
         MPI_Isend(buffer->send_bot_to_top, n, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top, gv->COMM_SHOT,
                   request_send_bot_to_top);
     }
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->send_lef_to_rig, stress->sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->send_lef_to_rig, stress->sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
-        n = buffer_push(buffer->send_lef_to_rig, stress->sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_lef_to_rig, stress.sxx, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_lef_to_rig, stress.sxy, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_lef_to_rig, stress.sxz, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
         MPI_Isend(buffer->send_lef_to_rig, n, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig, gv->COMM_SHOT,
                   request_send_lef_to_rig);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->send_rig_to_lef, stress->sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2,
+        n = buffer_push(buffer->send_rig_to_lef, stress.sxy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2,
                         1, gv->NZ, 0);
-        n = buffer_push(buffer->send_rig_to_lef, stress->sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2,
+        n = buffer_push(buffer->send_rig_to_lef, stress.sxz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2,
                         1, gv->NZ, n);
-        n = buffer_push(buffer->send_rig_to_lef, stress->sxx, 1, gv->NY, gv->NX + 1 - 1,
+        n = buffer_push(buffer->send_rig_to_lef, stress.sxx, 1, gv->NY, gv->NX + 1 - 1,
                         gv->NX + 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
         MPI_Isend(buffer->send_rig_to_lef, n, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef, gv->COMM_SHOT,
                   request_send_rig_to_lef);
     }
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->send_fro_to_bac, stress->szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->send_fro_to_bac, stress->syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
-        n = buffer_push(buffer->send_fro_to_bac, stress->sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->send_fro_to_bac, stress.szz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->send_fro_to_bac, stress.syz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->send_fro_to_bac, stress.sxz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
         MPI_Isend(buffer->send_fro_to_bac, n, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac, gv->COMM_SHOT,
                   request_send_fro_to_bac);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->send_bac_to_fro, stress->syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, stress.syz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->send_bac_to_fro, stress->sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, stress.sxz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, n);
-        n = buffer_push(buffer->send_bac_to_fro, stress->szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, stress.szz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
         MPI_Isend(buffer->send_bac_to_fro, n, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro, gv->COMM_SHOT,
                   request_send_bac_to_fro);
@@ -528,45 +528,45 @@ double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(stress->syy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1,
+            n = buffer_pop(stress.syy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1,
                            gv->NZ, 0);
-            n = buffer_pop(stress->sxy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
+            n = buffer_pop(stress.sxy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
                            gv->NZ, n);
-            n = buffer_pop(stress->syz, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
+            n = buffer_pop(stress.syz, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
                            gv->NZ, n);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(stress->sxy, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-            n = buffer_pop(stress->syz, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-            n = buffer_pop(stress->syy, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(stress.sxy, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(stress.syz, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(stress.syy, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ,
                            n);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(stress->sxx, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1,
+            n = buffer_pop(stress.sxx, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1,
                            gv->NZ, 0);
-            n = buffer_pop(stress->sxy, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
+            n = buffer_pop(stress.sxy, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
                            gv->NZ, n);
-            n = buffer_pop(stress->sxz, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
+            n = buffer_pop(stress.sxz, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
                            gv->NZ, n);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(stress->sxy, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-            n = buffer_pop(stress->sxz, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
-            n = buffer_pop(stress->sxx, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ,
+            n = buffer_pop(stress.sxy, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+            n = buffer_pop(stress.sxz, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, n);
+            n = buffer_pop(stress.sxx, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ,
                            n);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(stress->szz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.szz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2, 0);
-            n = buffer_pop(stress->syz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.syz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2 - 1, n);
-            n = buffer_pop(stress->sxz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.sxz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2 - 1, n);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(stress->syz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-            n = buffer_pop(stress->sxz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
-            n = buffer_pop(stress->szz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1),
+            n = buffer_pop(stress.syz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+            n = buffer_pop(stress.sxz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, n);
+            n = buffer_pop(stress.szz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1),
                            n);
             break;
         }
diff --git a/src/exchange_s_acoustic.cpp b/src/exchange_s_acoustic.cpp
index de9092ba43dea01daa7bd51048ba1db2fee99260..552f5bd87f19e62b13bfc085ef047998a5db45ba 100644
--- a/src/exchange_s_acoustic.cpp
+++ b/src/exchange_s_acoustic.cpp
@@ -26,7 +26,7 @@
 #include "fd.hpp"
 
 #ifdef MPI_SENDRECV_REPLACE
-double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s_acoustic(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Status status;
     int n;
@@ -79,11 +79,11 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
     /* top-bottom ----------------------------------------------------------- */
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, stress->sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, stress.sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, stress->sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->bot_to_top, stress.sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, 0);
     }
 
@@ -95,21 +95,21 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
                          gv->COMM_SHOT, &status);
 
     if (recv_top_to_bot) {
-        n = buffer_pop(stress->sp, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sp, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
     }
 
     if (recv_bot_to_top) {
-        n = buffer_pop(stress->sp, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sp, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, 0);
     }
 
     /* left-right ----------------------------------------------------------- */
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, stress->sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, stress.sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, stress->sp, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->rig_to_lef, stress.sp, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, 0);
     }
 
@@ -121,21 +121,21 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
                          gv->COMM_SHOT, &status);
 
     if (recv_lef_to_rig) {
-        n = buffer_pop(stress->sp, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_pop(stress.sp, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
     }
 
     if (recv_rig_to_lef) {
-        n = buffer_pop(stress->sp, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, 0);
+        n = buffer_pop(stress.sp, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, 0);
     }
 
     /* front-back ----------------------------------------------------------- */
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, stress->sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, stress.sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, stress->sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), 0);
     }
 
@@ -147,11 +147,11 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
                          gv->COMM_SHOT, &status);
 
     if (recv_fro_to_bac) {
-        n = buffer_pop(stress->sp, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
+        n = buffer_pop(stress.sp, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
     }
 
     if (recv_bac_to_fro) {
-        n = buffer_pop(stress->sp, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 0);
+        n = buffer_pop(stress.sp, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 0);
     }
 
     return time;
@@ -160,7 +160,7 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
 
 #ifdef MPI_ISENDRECV_REPLACE
 // requires OpenMPI version >= 5.0
-double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s_acoustic(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                MPI_REQUEST_NULL };
@@ -214,14 +214,14 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
     const bool send_bac_to_fro = gv->BOUNDARY || gv->POS[3] != gv->NPROCZ - 1;
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, stress->sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, stress.sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
     }
     MPI_Isendrecv_replace(buffer->top_to_bot, gv->NX * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot,
                           gv->INDEX[lower], tag_top_to_bot,
                           gv->COMM_SHOT, request_top_to_bot);
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, stress->sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->bot_to_top, stress.sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, 0);
     }
     MPI_Isendrecv_replace(buffer->bot_to_top, gv->NX * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top,
@@ -229,14 +229,14 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
                           gv->COMM_SHOT, request_bot_to_top);
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, stress->sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, stress.sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
     }
     MPI_Isendrecv_replace(buffer->lef_to_rig, gv->NY * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig,
                           gv->INDEX[right], tag_lef_to_rig,
                           gv->COMM_SHOT, request_lef_to_rig);
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, stress->sp, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->rig_to_lef, stress.sp, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, 0);
     }
     MPI_Isendrecv_replace(buffer->rig_to_lef, gv->NY * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef,
@@ -244,14 +244,14 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
                           gv->COMM_SHOT, request_rig_to_lef);
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, stress->sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, stress.sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
     }
     MPI_Isendrecv_replace(buffer->fro_to_bac, gv->NX * gv->NY * nf2, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac,
                           gv->INDEX[back], tag_fro_to_bac,
                           gv->COMM_SHOT, request_fro_to_bac);
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, stress->sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, stress.sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), 0);
     }
     MPI_Isendrecv_replace(buffer->bac_to_fro, gv->NX * gv->NY * nf1, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro,
@@ -267,25 +267,25 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(stress->sp, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(stress.sp, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                            0);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(stress->sp, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(stress.sp, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, 0);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(stress->sp, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
+            n = buffer_pop(stress.sp, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
                            0);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(stress->sp, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, 0);
+            n = buffer_pop(stress.sp, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, 0);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(stress->sp, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
+            n = buffer_pop(stress.sp, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
                            0);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(stress->sp, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 0);
+            n = buffer_pop(stress.sp, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 0);
             break;
         }
     }
@@ -295,7 +295,7 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
 #endif
 
 #ifdef MPI_ISEND_IRECV
-double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_s_acoustic(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request send_requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                     MPI_REQUEST_NULL, MPI_REQUEST_NULL };
@@ -391,39 +391,39 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
 
     // Send in background
     if (send_top_to_bot) {
-        n = buffer_push(buffer->send_top_to_bot, stress->sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_top_to_bot, stress.sp, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
         MPI_Isend(buffer->send_top_to_bot, n, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot, gv->COMM_SHOT,
                   request_send_top_to_bot);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->send_bot_to_top, stress->sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->send_bot_to_top, stress.sp, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NX, 1, gv->NZ, 0);
         MPI_Isend(buffer->send_bot_to_top, n, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top, gv->COMM_SHOT,
                   request_send_bot_to_top);
     }
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->send_lef_to_rig, stress->sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_lef_to_rig, stress.sp, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
         MPI_Isend(buffer->send_lef_to_rig, n, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig, gv->COMM_SHOT,
                   request_send_lef_to_rig);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->send_rig_to_lef, stress->sp, 1, gv->NY, gv->NX + 1 - 1,
+        n = buffer_push(buffer->send_rig_to_lef, stress.sp, 1, gv->NY, gv->NX + 1 - 1,
                         gv->NX + 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, 0);
         MPI_Isend(buffer->send_rig_to_lef, n, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef, gv->COMM_SHOT,
                   request_send_rig_to_lef);
     }
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->send_fro_to_bac, stress->sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->send_fro_to_bac, stress.sp, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
         MPI_Isend(buffer->send_fro_to_bac, n, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac, gv->COMM_SHOT,
                   request_send_fro_to_bac);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->send_bac_to_fro, stress->sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, stress.sp, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), 0);
         MPI_Isend(buffer->send_bac_to_fro, n, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro, gv->COMM_SHOT,
                   request_send_bac_to_fro);
@@ -438,27 +438,27 @@ double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *g
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(stress->sp, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1,
+            n = buffer_pop(stress.sp, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1,
                            gv->NZ, 0);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(stress->sp, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(stress.sp, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ,
                            0);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(stress->sp, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1,
+            n = buffer_pop(stress.sp, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1,
                            gv->NZ, 0);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(stress->sp, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ,
+            n = buffer_pop(stress.sp, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ,
                            0);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(stress->sp, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(stress.sp, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2, 0);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(stress->sp, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1),
+            n = buffer_pop(stress.sp, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1),
                            0);
             break;
         }
diff --git a/src/exchange_v.cpp b/src/exchange_v.cpp
index 0163e5fd6caf4fee0a36ba83ddf8ddb3d6efd70f..456df838163137b72ad7a2c59a01eb3f01c02d59 100644
--- a/src/exchange_v.cpp
+++ b/src/exchange_v.cpp
@@ -9,7 +9,7 @@
 #include "fd.hpp"
 
 #ifdef MPI_SENDRECV_REPLACE
-double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_v(st_velocity &vel, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Status status;
     int n;
@@ -62,17 +62,17 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
     /* top-bottom ----------------------------------------------------------- */
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, vel->vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->top_to_bot, vel->vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->top_to_bot, vel->vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, vel.vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, vel.vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, vel.vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, vel->vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+        n = buffer_push(buffer->bot_to_top, vel.vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                         0);
-        n = buffer_push(buffer->bot_to_top, vel->vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, vel.vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->bot_to_top, vel->vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, vel.vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
                         gv->NZ, n);
     }
 
@@ -84,31 +84,31 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_top_to_bot) {
-        n = buffer_pop(vel->vx, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_pop(vel->vz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_pop(vel->vy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(vel.vx, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(vel.vz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(vel.vy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
     }
 
     if (recv_bot_to_top) {
-        n = buffer_pop(vel->vy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_pop(vel->vx, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_pop(vel->vz, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(vel.vy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_pop(vel.vx, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_pop(vel.vz, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
     }
 
     /* left-right ----------------------------------------------------------- */
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, vel->vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->lef_to_rig, vel->vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
-        n = buffer_push(buffer->lef_to_rig, vel->vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, vel.vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, vel.vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, vel.vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, vel->vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1, gv->NZ,
+        n = buffer_push(buffer->rig_to_lef, vel.vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1, gv->NZ,
                         0);
-        n = buffer_push(buffer->rig_to_lef, vel->vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->rig_to_lef, vel.vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->rig_to_lef, vel->vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->rig_to_lef, vel.vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NZ, n);
     }
 
@@ -120,31 +120,31 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_lef_to_rig) {
-        n = buffer_pop(vel->vy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_pop(vel->vz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, n);
-        n = buffer_pop(vel->vx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_pop(vel.vy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_pop(vel.vz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, n);
+        n = buffer_pop(vel.vx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ, n);
     }
 
     if (recv_rig_to_lef) {
-        n = buffer_pop(vel->vx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_pop(vel->vy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
-        n = buffer_pop(vel->vz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+        n = buffer_pop(vel.vx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_pop(vel.vy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+        n = buffer_pop(vel.vz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
     }
 
     /* front-back ----------------------------------------------------------- */
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, vel->vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->fro_to_bac, vel->vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
-        n = buffer_push(buffer->fro_to_bac, vel->vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, vel.vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, vel.vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
+        n = buffer_push(buffer->fro_to_bac, vel.vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, vel->vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1, gv->NZ + 1 - gv->FDORDER / 2,
+        n = buffer_push(buffer->bac_to_fro, vel.vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1, gv->NZ + 1 - gv->FDORDER / 2,
                         0);
-        n = buffer_push(buffer->bac_to_fro, vel->vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, vel.vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
-        n = buffer_push(buffer->bac_to_fro, vel->vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, vel.vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
     }
 
@@ -156,15 +156,15 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
                          gv->COMM_SHOT, &status);
 
     if (recv_fro_to_bac) {
-        n = buffer_pop(vel->vx, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
-        n = buffer_pop(vel->vy, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, n);
-        n = buffer_pop(vel->vz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1, n);
+        n = buffer_pop(vel.vx, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
+        n = buffer_pop(vel.vy, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, n);
+        n = buffer_pop(vel.vz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1, n);
     }
 
     if (recv_bac_to_fro) {
-        n = buffer_pop(vel->vz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-        n = buffer_pop(vel->vx, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
-        n = buffer_pop(vel->vy, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+        n = buffer_pop(vel.vz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+        n = buffer_pop(vel.vx, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+        n = buffer_pop(vel.vy, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
     }
 
     return time;
@@ -173,7 +173,7 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
 
 #ifdef MPI_ISENDRECV_REPLACE
 // requires OpenMPI version >= 5.0
-double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_v(st_velocity &vel, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                MPI_REQUEST_NULL };
@@ -227,20 +227,20 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
     const bool send_bac_to_fro = gv->BOUNDARY || gv->POS[3] != gv->NPROCZ - 1;
 
     if (send_top_to_bot) {
-        n = buffer_push(buffer->top_to_bot, vel->vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->top_to_bot, vel->vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->top_to_bot, vel->vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, vel.vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->top_to_bot, vel.vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->top_to_bot, vel.vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->top_to_bot, gv->NX * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot,
                           gv->INDEX[lower], tag_top_to_bot,
                           gv->COMM_SHOT, request_top_to_bot);
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->bot_to_top, vel->vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+        n = buffer_push(buffer->bot_to_top, vel.vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                         0);
-        n = buffer_push(buffer->bot_to_top, vel->vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, vel.vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->bot_to_top, vel->vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
+        n = buffer_push(buffer->bot_to_top, vel.vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1,
                         gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->bot_to_top, gv->NX * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top,
@@ -248,20 +248,20 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
                           gv->COMM_SHOT, request_bot_to_top);
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->lef_to_rig, vel->vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->lef_to_rig, vel->vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
-        n = buffer_push(buffer->lef_to_rig, vel->vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, vel.vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->lef_to_rig, vel.vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
+        n = buffer_push(buffer->lef_to_rig, vel.vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->lef_to_rig, gv->NY * gv->NZ * nf1, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig,
                           gv->INDEX[right], tag_lef_to_rig,
                           gv->COMM_SHOT, request_lef_to_rig);
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->rig_to_lef, vel->vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1, gv->NZ,
+        n = buffer_push(buffer->rig_to_lef, vel.vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1, gv->NZ,
                         0);
-        n = buffer_push(buffer->rig_to_lef, vel->vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->rig_to_lef, vel.vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NZ, n);
-        n = buffer_push(buffer->rig_to_lef, vel->vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
+        n = buffer_push(buffer->rig_to_lef, vel.vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1), 1,
                         gv->NZ, n);
     }
     MPI_Isendrecv_replace(buffer->rig_to_lef, gv->NY * gv->NZ * nf2, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef,
@@ -269,20 +269,20 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
                           gv->COMM_SHOT, request_rig_to_lef);
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->fro_to_bac, vel->vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->fro_to_bac, vel->vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
-        n = buffer_push(buffer->fro_to_bac, vel->vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->fro_to_bac, vel.vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->fro_to_bac, vel.vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
+        n = buffer_push(buffer->fro_to_bac, vel.vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
     }
     MPI_Isendrecv_replace(buffer->fro_to_bac, gv->NX * gv->NY * nf1, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac,
                           gv->INDEX[back], tag_fro_to_bac,
                           gv->COMM_SHOT, request_fro_to_bac);
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->bac_to_fro, vel->vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1, gv->NZ + 1 - gv->FDORDER / 2,
+        n = buffer_push(buffer->bac_to_fro, vel.vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1, gv->NZ + 1 - gv->FDORDER / 2,
                         0);
-        n = buffer_push(buffer->bac_to_fro, vel->vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, vel.vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
-        n = buffer_push(buffer->bac_to_fro, vel->vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->bac_to_fro, vel.vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
     }
     MPI_Isendrecv_replace(buffer->bac_to_fro, gv->NX * gv->NY * nf2, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro,
@@ -298,37 +298,37 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(vel->vx, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-            n = buffer_pop(vel->vy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(vel.vx, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vz, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(vel.vy, buffer->top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ,
                            n);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(vel->vy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vx, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
-            n = buffer_pop(vel->vz, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(vel.vy, buffer->bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vx, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(vel.vz, buffer->bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(vel->vy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, n);
-            n = buffer_pop(vel->vx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
+            n = buffer_pop(vel.vy, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vz, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ, n);
+            n = buffer_pop(vel.vx, buffer->lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1, gv->NZ,
                            n);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(vel->vx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
-            n = buffer_pop(vel->vz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+            n = buffer_pop(vel.vx, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vy, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+            n = buffer_pop(vel.vz, buffer->rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(vel->vx, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
-            n = buffer_pop(vel->vy, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, n);
-            n = buffer_pop(vel->vz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
+            n = buffer_pop(vel.vx, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, 0);
+            n = buffer_pop(vel.vy, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2, n);
+            n = buffer_pop(vel.vz, buffer->fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2 - 1,
                            n);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(vel->vz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-            n = buffer_pop(vel->vx, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
-            n = buffer_pop(vel->vy, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+            n = buffer_pop(vel.vz, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+            n = buffer_pop(vel.vx, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+            n = buffer_pop(vel.vy, buffer->bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
             break;
         }
     }
@@ -338,7 +338,7 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
 #endif
 
 #ifdef MPI_ISEND_IRECV
-double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
+double exchange_v(st_velocity &vel, st_buffer_flat *buffer, GlobVar *gv)
 {
     MPI_Request send_requests[] = { MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL, MPI_REQUEST_NULL,
                                     MPI_REQUEST_NULL, MPI_REQUEST_NULL };
@@ -434,57 +434,57 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
 
     // Send in background
     if (send_top_to_bot) {
-        n = buffer_push(buffer->send_top_to_bot, vel->vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-        n = buffer_push(buffer->send_top_to_bot, vel->vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
-        n = buffer_push(buffer->send_top_to_bot, vel->vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_top_to_bot, vel.vx, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_top_to_bot, vel.vz, 1, gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_top_to_bot, vel.vy, 1, gv->FDORDER / 2 - 1, 1, gv->NX, 1, gv->NZ, n);
         MPI_Isend(buffer->send_top_to_bot, n, MPI_FLOAT, gv->INDEX[upper], tag_top_to_bot, gv->COMM_SHOT,
                   request_send_top_to_bot);
     }
 
     if (send_bot_to_top) {
-        n = buffer_push(buffer->send_bot_to_top, vel->vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1,
+        n = buffer_push(buffer->send_bot_to_top, vel.vy, gv->NY + 1 - 1, gv->NY + 1 - gv->FDORDER / 2, 1, gv->NX, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->send_bot_to_top, vel->vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->send_bot_to_top, vel.vx, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, n);
-        n = buffer_push(buffer->send_bot_to_top, vel->vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
+        n = buffer_push(buffer->send_bot_to_top, vel.vz, gv->NY + 1 - 1, gv->NY + 1 - (gv->FDORDER / 2 - 1), 1, gv->NX,
                         1, gv->NZ, n);
         MPI_Isend(buffer->send_bot_to_top, n, MPI_FLOAT, gv->INDEX[lower], tag_bot_to_top, gv->COMM_SHOT,
                   request_send_bot_to_top);
     }
 
     if (send_lef_to_rig) {
-        n = buffer_push(buffer->send_lef_to_rig, vel->vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
-        n = buffer_push(buffer->send_lef_to_rig, vel->vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
-        n = buffer_push(buffer->send_lef_to_rig, vel->vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_lef_to_rig, vel.vy, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, 0);
+        n = buffer_push(buffer->send_lef_to_rig, vel.vz, 1, gv->NY, 1, gv->FDORDER / 2, 1, gv->NZ, n);
+        n = buffer_push(buffer->send_lef_to_rig, vel.vx, 1, gv->NY, 1, gv->FDORDER / 2 - 1, 1, gv->NZ, n);
         MPI_Isend(buffer->send_lef_to_rig, n, MPI_FLOAT, gv->INDEX[left], tag_lef_to_rig, gv->COMM_SHOT,
                   request_send_lef_to_rig);
     }
 
     if (send_rig_to_lef) {
-        n = buffer_push(buffer->send_rig_to_lef, vel->vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
+        n = buffer_push(buffer->send_rig_to_lef, vel.vx, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - gv->FDORDER / 2, 1,
                         gv->NZ, 0);
-        n = buffer_push(buffer->send_rig_to_lef, vel->vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->send_rig_to_lef, vel.vy, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, n);
-        n = buffer_push(buffer->send_rig_to_lef, vel->vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
+        n = buffer_push(buffer->send_rig_to_lef, vel.vz, 1, gv->NY, gv->NX + 1 - 1, gv->NX + 1 - (gv->FDORDER / 2 - 1),
                         1, gv->NZ, n);
         MPI_Isend(buffer->send_rig_to_lef, n, MPI_FLOAT, gv->INDEX[right], tag_rig_to_lef, gv->COMM_SHOT,
                   request_send_rig_to_lef);
     }
 
     if (send_fro_to_bac) {
-        n = buffer_push(buffer->send_fro_to_bac, vel->vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->send_fro_to_bac, vel->vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
-        n = buffer_push(buffer->send_fro_to_bac, vel->vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
+        n = buffer_push(buffer->send_fro_to_bac, vel.vx, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, 0);
+        n = buffer_push(buffer->send_fro_to_bac, vel.vy, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2, n);
+        n = buffer_push(buffer->send_fro_to_bac, vel.vz, 1, gv->NY, 1, gv->NX, 1, gv->FDORDER / 2 - 1, n);
         MPI_Isend(buffer->send_fro_to_bac, n, MPI_FLOAT, gv->INDEX[front], tag_fro_to_bac, gv->COMM_SHOT,
                   request_send_fro_to_bac);
     }
 
     if (send_bac_to_fro) {
-        n = buffer_push(buffer->send_bac_to_fro, vel->vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, vel.vz, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - gv->FDORDER / 2, 0);
-        n = buffer_push(buffer->send_bac_to_fro, vel->vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, vel.vx, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
-        n = buffer_push(buffer->send_bac_to_fro, vel->vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
+        n = buffer_push(buffer->send_bac_to_fro, vel.vy, 1, gv->NY, 1, gv->NX, gv->NZ + 1 - 1,
                         gv->NZ + 1 - (gv->FDORDER / 2 - 1), n);
         MPI_Isend(buffer->send_bac_to_fro, n, MPI_FLOAT, gv->INDEX[back], tag_bac_to_fro, gv->COMM_SHOT,
                   request_send_bac_to_fro);
@@ -499,43 +499,43 @@ double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv)
 
         switch (status.MPI_TAG) {
         case tag_top_to_bot:
-            n = buffer_pop(vel->vx, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(vel.vx, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                            0);
-            n = buffer_pop(vel->vz, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
+            n = buffer_pop(vel.vz, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ,
                            n);
-            n = buffer_pop(vel->vy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
+            n = buffer_pop(vel.vy, buffer->recv_top_to_bot, gv->NY + 1, gv->NY + gv->FDORDER / 2 - 1, 1, gv->NX, 1,
                            gv->NZ, n);
             break;
         case tag_bot_to_top:
-            n = buffer_pop(vel->vy, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vx, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
-            n = buffer_pop(vel->vz, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(vel.vy, buffer->recv_bot_to_top, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NX, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vx, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
+            n = buffer_pop(vel.vz, buffer->recv_bot_to_top, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NX, 1, gv->NZ, n);
             break;
         case tag_lef_to_rig:
-            n = buffer_pop(vel->vy, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
+            n = buffer_pop(vel.vy, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
                            0);
-            n = buffer_pop(vel->vz, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
+            n = buffer_pop(vel.vz, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2, 1, gv->NZ,
                            n);
-            n = buffer_pop(vel->vx, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
+            n = buffer_pop(vel.vx, buffer->recv_lef_to_rig, 1, gv->NY, gv->NX + 1, gv->NX + gv->FDORDER / 2 - 1, 1,
                            gv->NZ, n);
             break;
         case tag_rig_to_lef:
-            n = buffer_pop(vel->vx, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
-            n = buffer_pop(vel->vy, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
-            n = buffer_pop(vel->vz, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+            n = buffer_pop(vel.vx, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - gv->FDORDER / 2, 1, gv->NZ, 0);
+            n = buffer_pop(vel.vy, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
+            n = buffer_pop(vel.vz, buffer->recv_rig_to_lef, 1, gv->NY, 1 - 1, 1 - (gv->FDORDER / 2 - 1), 1, gv->NZ, n);
             break;
         case tag_fro_to_bac:
-            n = buffer_pop(vel->vx, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
+            n = buffer_pop(vel.vx, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
                            0);
-            n = buffer_pop(vel->vy, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
+            n = buffer_pop(vel.vy, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1, gv->NZ + gv->FDORDER / 2,
                            n);
-            n = buffer_pop(vel->vz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
+            n = buffer_pop(vel.vz, buffer->recv_fro_to_bac, 1, gv->NY, 1, gv->NX, gv->NZ + 1,
                            gv->NZ + gv->FDORDER / 2 - 1, n);
             break;
         case tag_bac_to_fro:
-            n = buffer_pop(vel->vz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
-            n = buffer_pop(vel->vx, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
-            n = buffer_pop(vel->vy, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+            n = buffer_pop(vel.vz, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - gv->FDORDER / 2, 0);
+            n = buffer_pop(vel.vx, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
+            n = buffer_pop(vel.vy, buffer->recv_bac_to_fro, 1, gv->NY, 1, gv->NX, 1 - 1, 1 - (gv->FDORDER / 2 - 1), n);
             break;
         }
     }
diff --git a/src/fd.hpp b/src/fd.hpp
index 7967b037bc684fed72cd7599efaca1ce05bfad04..efa255ba486fa263305a8bc7a5337d3bbe91b0f9 100644
--- a/src/fd.hpp
+++ b/src/fd.hpp
@@ -36,32 +36,34 @@
 #include "globvar_struct.hpp"
 #include "macros.hpp"
 #include "kiss_fftr.h"
+#include "float3DTensorT.hpp"
 
-typedef struct Model {
-    float ***rho, ***pi, ***u;
+typedef struct {
+    float3DTensorT rho, pi, u;
     /* Variables for viscoelastic modeling */
-    float ***taus, ***taup, *eta;
-    float ***absorb_coeff;
+    float3DTensorT taus, taup;
+    float *eta;
+    float3DTensorT absorb_coeff;
 } st_model;
 
-typedef struct Model_AV {
-    float ***uipjp, ***ujpkp, ***uipkp, ***rjp, ***rkp, ***rip;
+typedef struct {
+    float3DTensorT uipjp, ujpkp, uipkp, rjp, rkp, rip;
     /* Variables for viscoelastic modeling */
-    float ***tausipjp, ***tausjpkp, ***tausipkp;
+    float3DTensorT tausipjp, tausjpkp, tausipkp;
 } st_model_av;
 
 typedef struct Stress {
     // pressure
-    float ***         sp;
+    float3DTensorT         sp;
     // stress tensor
-    float ***__restrict__ sxx, ***__restrict__ syy, ***__restrict__ szz;
-    float ***__restrict__ sxy, ***__restrict__ syz, ***__restrict__ sxz;
+    float3DTensorT sxx, syy, szz;
+    float3DTensorT sxy, syz, sxz;
 } st_stress;
 
 typedef struct Particle_velocity {
     // particle velocity
     // Pointer for dynamic wavefields:
-    float ***__restrict__ vx, ***__restrict__ vy, ***__restrict__ vz;
+    float3DTensorT vx, vy, vz;
 } st_velocity;
 
 typedef struct Freq_Particle_velocity {
@@ -83,13 +85,13 @@ typedef struct PML_Coefficients {
     float *alpha_prime_x, *alpha_prime_x_half, *alpha_prime_y, *alpha_prime_y_half, *alpha_prime_z, *alpha_prime_z_half;
 } st_pml_coeff;
 
-typedef struct PML_Wavefield {
-    float ***psi_sp_x, ***psi_sp_y, ***psi_sp_z;
+typedef struct {
+    float3DTensorT psi_sp_x, psi_sp_y, psi_sp_z;
     //Pml Damping Wavefields for pml damping boundaries
-    float ***psi_sxx_x, ***psi_syy_y, ***psi_szz_z;
-    float ***psi_sxy_y, ***psi_sxy_x, ***psi_sxz_x, ***psi_sxz_z, ***psi_syz_y, ***psi_syz_z;
-    float ***psi_vxx, ***psi_vyy, ***psi_vzz;
-    float ***psi_vxy, ***psi_vxz, ***psi_vyx, ***psi_vyz, ***psi_vzx, ***psi_vzy;
+    float3DTensorT psi_sxx_x, psi_syy_y, psi_szz_z;
+    float3DTensorT psi_sxy_y, psi_sxy_x, psi_sxz_x, psi_sxz_z, psi_syz_y, psi_syz_z;
+    float3DTensorT psi_vxx, psi_vyy, psi_vzz;
+    float3DTensorT psi_vxy, psi_vxz, psi_vyx, psi_vyz, psi_vzx, psi_vzy;
 } st_pml_wfd;
 
 typedef struct Visco_memory {
@@ -155,13 +157,13 @@ typedef struct Acquisition {
 
 /* declaration of functions */
 
-void absorb(float ***absorb_coeff, GlobVar *gv);
+void absorb(float3DTensorT &absorb_coeff, GlobVar *gv);
 
 void absorb_PML(float ***absorb_coeffx, float ***absorb_coeffy, float ***absorb_coeffz);
 
 void CPML_coeff(st_pml_coeff *pml_coeff, const GlobVar *gv);
 
-void av_mat(st_model *mod, st_model_av *mod_av, const GlobVar *gv);
+void av_mat(st_model &mod, st_model_av &mod_av, const GlobVar *gv);
 
 void calc_res(int ishot, int shot_id, st_seismogram *section, st_seismogram *section_obs, st_signals *signals,
               int ntr_loc, const float *finv, int nf, double *L2, int res_switch, int groupnum,
@@ -169,9 +171,9 @@ void calc_res(int ishot, int shot_id, st_seismogram *section, st_seismogram *sec
 
 void catseis(float **data, float **fulldata, const int *recswitch, int ntr_glob, int ns, const GlobVar *gv);
 
-void checkfd(st_model *mod, st_acquisition *acq, GlobVar *gv);
+void checkfd(st_model &mod, st_acquisition *acq, GlobVar *gv);
 
-void checkfd_rsg(FILE *fp, st_model *mod);
+void checkfd_rsg(FILE *fp, st_model &mod);
 
 void check_recfile(const st_acquisition *acq, const GlobVar *gv);
 
@@ -181,39 +183,39 @@ void comm_ini(st_buffer *buffer, MPI_Request *req_send, MPI_Request *req_rec);
 
 void comm_ini_s(st_buffer *buffer, MPI_Request *req_send, MPI_Request *req_rec);
 
-void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod,
-             st_model *testmod, st_model_av *mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff,
-             st_pml_wfd *pml_wfd, st_signals *signals,
+void freemem(int nsrc_loc, st_acquisition *acq, st_model &mod,
+             st_model &testmod, st_model_av &mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff,
+             st_pml_wfd &pml_wfd, st_signals *signals,
              st_gradient *grad, st_gradient *grad_prior1, st_gradient *grad_prior2, st_gradient *grad_halo,
              st_hessian *hessian,
-             st_stress *stress, st_buffer_flat *stressbuff, st_freq_velocity *fourier_vel_back,
-             st_freq_velocity *fourier_vel_fw, st_velocity *vel, st_buffer_flat *velbuff, const GlobVar *gv);
+             st_stress &stress, st_buffer_flat *stressbuff, st_freq_velocity *fourier_vel_back,
+             st_freq_velocity *fourier_vel_fw, st_velocity &vel, st_buffer_flat *velbuff, const GlobVar *gv);
 
 void freemem_seis(int ntr_loc, st_seismogram *section, st_seismogram *section_obs, st_signals *signals,
                   st_acquisition *acq, const GlobVar *gv);
 
 void globvar_change(GlobVar *gv);
 
-int initmem(st_model *mod, st_model *testmod, st_model_av *mod_av, st_visc_mem *visco_mem,
-            st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, st_gradient *grad, st_gradient *grad_prior1,
-            st_gradient *grad_prior2, st_gradient *grad_halo, st_hessian *hessian, st_stress *stress,
+int initmem(st_model &mod, st_model &testmod, st_model_av &mod_av, st_visc_mem *visco_mem,
+            st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, st_gradient *grad, st_gradient *grad_prior1,
+            st_gradient *grad_prior2, st_gradient *grad_halo, st_hessian *hessian, st_stress &stress,
             st_buffer_flat *stressbuff,
-            st_freq_velocity *fourier_vel_back, st_freq_velocity *fourier_vel_fw, st_velocity *vel,
+            st_freq_velocity *fourier_vel_back, st_freq_velocity *fourier_vel_fw, st_velocity &vel,
             st_buffer_flat *velbuff, GlobVar *gv);
 
 void initproc(GlobVar *gv);
 
 void initseis(int *ntr_loc, st_seismogram *section, st_seismogram *section_obs, st_signals *signals, GlobVar *gv);
 
-void matcopy(st_model *mod, GlobVar *gv);
+void matcopy(st_model &mod, GlobVar *gv);
 
 void merge(int nsnap, int type, const GlobVar *gv);
 
 void mergemod(const char *modfile, int format, GlobVar *gv);
 
-void readmod(st_model *mod, GlobVar *gv);
+void readmod(st_model &mod, GlobVar *gv);
 
-void model(st_model *mod, GlobVar *gv);
+void model(st_model &mod, GlobVar *gv);
 
 float normalize_trace(float **section, int i, int ns, const GlobVar *gv);
 
@@ -230,23 +232,23 @@ int plane_wave(float ***force_points);
 
 void CPML_ini_elastic(st_boundary *nb, const GlobVar *gv);
 
-void psource(int nt, st_stress *stress, float **srcpos_loc, float **signals, int nsrc, const GlobVar *gv, int sw);
+void psource(int nt, st_stress &stress, float **srcpos_loc, float **signals, int nsrc, const GlobVar *gv, int sw);
 
-void psource_rsg(st_stress *stress, float **srcpos_loc, float **signals, int nsrc);
+void psource_rsg(st_stress &stress, float **srcpos_loc, float **signals, int nsrc);
 
-void readbufs(st_stress *stress, st_buffer *buffer);
+void readbufs(st_stress &stress, st_buffer *buffer);
 
 void exchange_par(GlobVar *gv);
 
-void exchange_s_rsg(st_stress *stress, st_buffer *buffer);
+void exchange_s_rsg(st_stress &stress, st_buffer *buffer);
 
-double exchange_s(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv);
+double exchange_s(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv);
 
-void readbufv(st_velocity *vel, st_buffer *buffer);
+void readbufv(st_velocity &vel, st_buffer *buffer);
 
-void exchange_v_rsg(st_velocity *vel, st_buffer *buffer);
+void exchange_v_rsg(st_velocity &vel, st_buffer *buffer);
 
-double exchange_v(st_velocity *vel, st_buffer_flat *buffer, GlobVar *gv);
+double exchange_v(st_velocity &vel, st_buffer_flat *buffer, GlobVar *gv);
 
 double exchange_Fv(float ****vx, float ****vy, float ****vz, int nf, st_buffer_flat *buffer, GlobVar *gv);
 
@@ -268,28 +270,28 @@ void savesig(float **signals, st_acquisition *acq, int nsrc_loc, int ishot, int
 
 int **scan_topo(GlobVar *gv);
 
-void seismo(int lsamp, int ntr, int **recpos, st_seismogram *section, st_velocity *vel, st_stress *stress,
-            st_model *mod, const GlobVar *gv);
+void seismo(int lsamp, int ntr, int **recpos, st_seismogram *section, st_velocity &vel, st_stress &stress,
+            st_model &mod, const GlobVar *gv);
 
 void seismo_rsg(int lsamp, int ntr, int **recpos, float **sectionvx, float **sectionvy,
                 float **sectionvz, float **sectiondiv, float **sectioncurl, float **sectionp,
-                st_velocity *vel, st_stress *stress, st_model *mod);
+                st_velocity &vel, st_stress &stress, st_model &mod);
 
-void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model *mod,
+void snap(int nt, int nsnap, st_velocity &vel, st_stress &stress, const st_model &mod,
           const st_boundary *nb, GlobVar *gv);
 
 void snap_rsg(FILE *fp, int nt, int nsnap, int format, int type,
-              st_velocity *vel, st_stress *stress, st_model *mod,
+              st_velocity &vel, st_stress &stress, st_model &mod,
               int idx, int idy, int idz, int nx1, int ny1, int nz1, int nx2, int ny2, int nz2);
 
 void snapmerge(int nsnap, GlobVar *gv);
 
 void sources(FILE *fpsrc, int *nsrc, float **srcpos, GlobVar *gv, int **topo);
 
-void stfi(st_acquisition *acq, st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_stress *stress,
-          st_model *mod, st_model_av *mod_av, st_visc_mem *visco_mem, st_seismogram *section,
+void stfi(st_acquisition *acq, st_boundary *nb, const st_boundary *nb_fix, st_velocity &vel, st_stress &stress,
+          st_model &mod, st_model_av &mod_av, st_visc_mem *visco_mem, st_seismogram *section,
           st_seismogram *section_obs, st_signals *signals, int nsrc_loc, int ntr_loc, st_pml_coeff *pml_coeff,
-          st_pml_wfd *pml_wfd, st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel,
+          st_pml_wfd &pml_wfd, st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel,
           const float *finv, double *L2, int nf, int ntast, int lsnap, int nsnap, int ishot, int shot_id, int cdf,
           int iteration, int groupnum, int it_group, int ncplx, GlobVar *gv);
 
@@ -308,27 +310,27 @@ void splitrec(int *ntr_loc, st_acquisition *acq, const GlobVar *gv);
 
 float **splitsrc(float **srcpos, int *nsrc_loc, int nsrc, int *srcswitch, GlobVar *gv);
 
-void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, st_visc_mem *mem,
-             st_stress *stress, st_velocity *vel);
+void surface(int ndepth, st_model &mod, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, st_visc_mem *mem,
+             st_stress &stress, st_velocity &vel);
 
-void update_s_rsg(st_boundary *nb, st_velocity *vel, st_stress *stress,
-                  st_visc_mem *mem, st_model *mod, float ***taus, float ***taup, float *eta);
+void update_s_rsg(st_boundary *nb, st_velocity &vel, st_stress &stress,
+                  st_visc_mem *mem, st_model &mod, float ***taus, float ***taup, float *eta);
 
-void update_v(const st_boundary *nb, st_velocity *vel, st_stress *stress, st_model_av *mod_av,
-              float ***absorb_coeff, const GlobVar *gv);
+void update_v(const st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+    float3DTensorT &absorb_coeff, const GlobVar *gv);
 
-void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_model_av *mod_av,
-                   st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, const GlobVar *gv);
+void update_v_CPML(st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+                   st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, const GlobVar *gv);
 
-void update_v_rsg(st_boundary *nb, int nt, st_velocity *vel, st_stress *stress,
-                  float ***rho, float **srcpos_loc, float **signals, int nsrc, float ***absorb_coeff);
+void update_v_rsg(st_boundary *nb, int nt, st_velocity &vel, st_stress &stress,
+                  float ***rho, float **srcpos_loc, float **signals, int nsrc, float3DTensorT &absorb_coeff);
 
 void wavelet(float **srcpos_loc, int nsrc, int sourceshape, float **signals, float **sig_raw, float freq,
              const GlobVar *gv);
 
-void writebufs(st_stress *stress, st_buffer *buffer);
+void writebufs(st_stress &stress, st_buffer *buffer);
 
-void writebufv(st_velocity *vel, st_buffer *buffer);
+void writebufv(st_velocity &vel, st_buffer *buffer);
 
 void writedsk(FILE *fp_out, float amp, int format);
 
@@ -365,17 +367,17 @@ void readseis(int shot_id, float **section, const st_acquisition *acq, int ntr,
 void residual(float **sectiondata, float **section, float **sectiondiff, int ntr, int ns,
               double *L2, const float *finv, int nf, const GlobVar *gv);
 
-void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pml_wfd *pml_wfd, const GlobVar *gv);
+void zero_wavefield(st_velocity &vel, st_stress &stress, st_visc_mem *mem, st_pml_wfd &pml_wfd, const GlobVar *gv);
 
 void gradient_F(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *back, st_gradient *grad,
                 st_hessian *hessian,
-                st_model *mod, const float *finv, int nf, const GlobVar *gv);
+                st_model &mod, const float *finv, int nf, const GlobVar *gv);
 
 void gradient_smoothing(st_gradient *grad, const GlobVar *gv);
 
 void readgrad(st_gradient *grad, st_gradient *grad_halo, float finv, int iteration, int **topo, int gtop, GlobVar *gv);
 
-void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, GlobVar *gv);
+void modelupdate(st_gradient *grad, st_model &mod, float step, int it_group, GlobVar *gv);
 
 void zero_invers(st_freq_velocity *fourier_fw, st_freq_velocity *fourier_back, int nfmax, const GlobVar *gv);
 
@@ -385,7 +387,7 @@ void outgrad(st_gradient *grad, float finv, int iteration, const char *outfile,
 
 void outhess(st_hessian *hessian, float finv, int iteration, const char *outfile, GlobVar *gv);
 
-void outmod(const st_model *mod, int iteration, GlobVar *gv);
+void outmod(const st_model &mod, int iteration, GlobVar *gv);
 
 void steplength(int iteration, double *L2, float *step, int it_group, GlobVar *gv);
 
@@ -393,32 +395,32 @@ void zero_grad(st_gradient *grad, const GlobVar *gv);
 
 void zero_hess(st_hessian *hessian, const GlobVar *gv);
 
-void cpmodel(st_model *mod, st_model *testmod, const GlobVar *gv);
+void cpmodel(st_model &mod, st_model &testmod, const GlobVar *gv);
 
 void conjugate(st_gradient *grad, st_gradient *grad_prior1, st_gradient *grad_prior2,
                float *beta, int cdf, GlobVar *gv);
 
-double update_s_elastic(st_boundary *nb, st_velocity *vel, st_stress *stress,
-                        st_model *mod, st_model_av *mod_av, const GlobVar *gv);
+double update_s_elastic(st_boundary *nb, st_velocity &vel, st_stress &stress,
+                        st_model &mod, st_model_av &mod_av, const GlobVar *gv);
 
-double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
-                             st_stress *stress, st_model *mod, st_model_av *mod_av, st_pml_coeff *pml_coeff,
-                             st_pml_wfd *pml_wfd, const GlobVar *gv);
+double update_s_CPML_elastic(st_boundary *nb, st_velocity &vel,
+                             st_stress &stress, st_model &mod, st_model_av &mod_av, st_pml_coeff *pml_coeff,
+                             st_pml_wfd &pml_wfd, const GlobVar *gv);
 
-void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, st_stress *stress,
-                     st_velocity *vel, const GlobVar *gv);
+void surface_elastic(int ndepth, st_model &mod, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, st_stress &stress,
+                     st_velocity &vel, const GlobVar *gv);
 
 void readinv(float *finv, int *nf, int *groupnum, int *itpergroup, int nfmax, GlobVar *gv);
 
-void discfourier(const st_boundary *nb, int nt, st_velocity *vel,
+void discfourier(const st_boundary *nb, int nt, st_velocity &vel,
                  st_freq_velocity *fourier_vel, const float *finv,
                  int nf, int ntast, int pshot1, int back, const GlobVar *gv);
 
 void filt_seis(float **data, int ntr, int ns, float finv, const GlobVar *gv);
 
-void model_gauss(st_model *mod);
+void model_gauss(st_model &mod);
 
-void model2_5(st_model *mod);
+void model2_5(st_model &mod);
 
 void hess_apply(const st_boundary *nb, st_gradient *grad, st_hessian *hessian, const GlobVar *gv);
 
@@ -428,48 +430,48 @@ void lbfgs(st_gradient *grad, int iteration, GlobVar *gv);
 
 void lbfgs_savegrad(st_gradient *grad, const GlobVar *gv);
 
-void constant_boundary(const st_boundary *nb, st_model *mod, const GlobVar *gv);
+void constant_boundary(const st_boundary *nb, st_model &mod, const GlobVar *gv);
 
-void constant_boundary_acoustic(const st_boundary *nb, st_model *mod, const GlobVar *gv);
+void constant_boundary_acoustic(const st_boundary *nb, st_model &mod, const GlobVar *gv);
 
-double exchange_s_acoustic(st_stress *stress, st_buffer_flat *buffer, GlobVar *gv);
+double exchange_s_acoustic(st_stress &stress, st_buffer_flat *buffer, GlobVar *gv);
 
 void gradient_F_acoustic(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *back, st_gradient *grad,
                          st_hessian *hessian,
-                         st_model *mod, const float *finv, int nf, const GlobVar *gv);
+                         st_model &mod, const float *finv, int nf, const GlobVar *gv);
 
-void matcopy_acoustic(st_model *mod, GlobVar *gv);
+void matcopy_acoustic(st_model &mod, GlobVar *gv);
 
-void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_group, GlobVar *gv);
+void modelupdate_acoustic(st_gradient *grad, st_model &mod, float step, int it_group, GlobVar *gv);
 
 void precon_grad_acoustic(int ishot, st_gradient *grad, st_acquisition *acq, GlobVar *gv);
 
-void surface_acoustic(int ndepth, st_stress *stress, const GlobVar *gv);
+void surface_acoustic(int ndepth, st_stress &stress, const GlobVar *gv);
 
-double update_s_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress, st_model *mod, const GlobVar *gv);
+double update_s_acoustic(st_boundary *nb, st_velocity &vel, st_stress &stress, st_model &mod, const GlobVar *gv);
 
-double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
-                              st_stress *stress, st_model *mod, st_pml_coeff *pml_coeff,
-                              st_pml_wfd *pml_wfd, const GlobVar *gv);
+double update_s_CPML_acoustic(st_boundary *nb, st_velocity &vel,
+                              st_stress &stress, st_model &mod, st_pml_coeff *pml_coeff,
+                              st_pml_wfd &pml_wfd, const GlobVar *gv);
 
-void update_v_acoustic(const st_boundary *nb, st_velocity *vel, st_stress *stress,
-                       st_model_av *mod_av, float ***absorb_coeff, const GlobVar *gv);
+void update_v_acoustic(const st_boundary *nb, st_velocity &vel, st_stress &stress,
+                       st_model_av &mod_av, float3DTensorT &absorb_coeff, const GlobVar *gv);
 
-void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress, st_model_av *mod_av,
-                            st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, const GlobVar *gv);
+void update_v_CPML_acoustic(st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+                            st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, const GlobVar *gv);
 
-void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pml_wfd *pml_wfd,
+void zero_wavefield_acoustic(st_velocity &vel, st_stress &stress, st_visc_mem *mem, st_pml_wfd &pml_wfd,
                              const GlobVar *gv);
 
-void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_stress *stress,
-              st_model *mod, st_model_av *mod_av, st_seismogram *section,
+void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity &vel, st_stress &stress,
+              st_model &mod, st_model_av &mod_av, st_seismogram *section,
               float **srcpos_loc, int **recpos_loc, st_signals *signals, int nsrc_loc,
-              float ***absorb_coeff, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd,
+              float3DTensorT &absorb_coeff, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd,
               st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel,
               const float *finv, int nf, int ntast, int ntr, int lsnap, int nsnap, int pshot, int shot_id, int proptype,
               GlobVar *gv);
 
-void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
+void fsource(int nt, st_velocity &vel, st_model_av &mod_av, float **srcpos_loc,
              st_signals *signals, int nsrc, int back, const GlobVar *gv);
 
 void time_window(float **sectiondata1, float **sectiondata2, int **recpos_loc, int ntr, int ntr_loc, int ishot,
diff --git a/src/float3DTensorT.cpp b/src/float3DTensorT.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3d797cdd41c35de534805aef71f867468232ab50
--- /dev/null
+++ b/src/float3DTensorT.cpp
@@ -0,0 +1,160 @@
+#include "float3DTensorT.hpp"
+#include <cassert>
+#include <cstddef>
+#include <cstdlib>
+#include <iostream>
+#include <memory> // assume_aligned
+
+#ifdef FLOAT3D_TENSOR_USE_ARRAY
+void float3DTensorT::init()
+{
+    for (int i = 0; i < rank(); i++) {
+        _lb[i] = 0;
+        _ub[i] = 0;
+        _extent[i] = 0;
+        _stride[i] = 0;
+    }
+
+    _size = 0;
+    offset = 0;
+
+    data = NULL;
+}
+
+float3DTensorT::float3DTensorT()
+{
+    init();
+};
+
+float3DTensorT::float3DTensorT(
+    const int &lb_i, const int &ub_i,
+    const int &lb_j, const int &ub_j,
+    const int &lb_k, const int &ub_k)
+{
+    malloc(lb_i, ub_i, lb_j, ub_j, lb_k, ub_k);
+};
+
+float3DTensorT::~float3DTensorT()
+{
+    assert(_size == 0);
+}
+
+void float3DTensorT::malloc(
+    const int &lb_i, const int &ub_i,
+    const int &lb_j, const int &ub_j,
+    const int &lb_k, const int &ub_k)
+{
+    assert(lb_i <= ub_i);
+    _lb[0] = lb_i;
+    _ub[0] = ub_i;
+    assert(lb_j <= ub_j);
+    _lb[1] = lb_j;
+    _ub[1] = ub_j;
+    assert(lb_k <= ub_k);
+    _lb[2] = lb_k;
+    _ub[2] = ub_k;
+
+    _extent[0] = ub_i - lb_i + 1;
+    _extent[1] = ub_j - lb_j + 1;
+    _extent[2] = ub_k - lb_k + 1;
+    _size = _extent[0] * _extent[1] * _extent[2];
+    data = (float *)aligned_alloc(64, _size * sizeof(float));
+    if (data == NULL) {
+        std::cerr << "Failed to allocate memory" << std::endl;
+        exit(EXIT_FAILURE);
+    }
+    #if __cpp_lib_assume_aligned
+    data = std::assume_aligned<64>(data);
+    #else
+        #warning "std::assume_aligned not supported"
+    #endif
+    #pragma omp simd
+    for (size_t i = 0; i < _size; i++) {
+        data[i] = 0.0f;
+    }
+    _stride[0] = _extent[1] * _extent[2];
+    _stride[1] = _extent[2];
+    _stride[2] = 1;
+    offset = lb_i * _stride[0] + lb_j * _stride[1] + lb_k * _stride[2];
+};
+
+void float3DTensorT::free()
+{
+    std::free(data);
+    init();
+}
+#endif
+
+#ifdef FLOAT3D_TENSOR_USE_MDSPAN
+void float3DTensorT::init()
+{
+    _lb[0] = 0;
+    _ub[0] = 0;
+    _lb[1] = 0;
+    _ub[1] = 0;
+    _lb[2] = 0;
+    _ub[2] = 0;
+
+    ms = std::mdspan<float, std::dextents<size_t, 3> >{};
+}
+
+float3DTensorT::float3DTensorT()
+{
+    init();
+};
+
+float3DTensorT::float3DTensorT(
+    const int &lb_i, const int &ub_i,
+    const int &lb_j, const int &ub_j,
+    const int &lb_k, const int &ub_k)
+{
+    malloc(lb_i, ub_i, lb_j, ub_j, lb_k, ub_k);
+};
+
+float3DTensorT::~float3DTensorT()
+{
+    assert(ms.size() == 0);
+}
+
+void float3DTensorT::malloc(
+    const int &lb_i, const int &ub_i,
+    const int &lb_j, const int &ub_j,
+    const int &lb_k, const int &ub_k)
+{
+    assert(lb_i <= ub_i);
+    _lb[0] = lb_i;
+    _ub[0] = ub_i;
+    assert(lb_j <= ub_j);
+    _lb[1] = lb_j;
+    _ub[1] = ub_j;
+    assert(lb_k <= ub_k);
+    _lb[2] = lb_k;
+    _ub[2] = ub_k;
+
+    const size_t dim_i = ub_i - lb_i + 1;
+    const size_t dim_j = ub_j - lb_j + 1;
+    const size_t dim_k = ub_k - lb_k + 1;
+    const size_t size = dim_i * dim_j * dim_k;
+    float *data = (float *)aligned_alloc(64, size * sizeof(float));
+    if (data == NULL) {
+        std::cerr << "Failed to allocate memory" << std::endl;
+        exit(EXIT_FAILURE);
+    }
+    #if __cpp_lib_assume_aligned
+    data = std::assume_aligned<64>(data);
+    #else
+        #warning "std::assume_aligned not supported"
+    #endif
+    #pragma omp simd
+    for (size_t i = 0; i < size; i++) {
+        data[i] = 0.0f;
+    }
+    ms = std::mdspan(data, dim_i, dim_j, dim_k);
+};
+
+void float3DTensorT::free()
+{
+    std::free(ms.data_handle());
+    init();
+}
+#endif
diff --git a/src/float3DTensorT.hpp b/src/float3DTensorT.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..028f1e5ad052311d9236adf87f24c1cc6ff63244
--- /dev/null
+++ b/src/float3DTensorT.hpp
@@ -0,0 +1,171 @@
+#ifndef _FLOAT_3D_TENSOR_INCLUDED_
+#define _FLOAT_3D_TENSOR_INCLUDED_
+
+#include <cassert>
+#include <cstddef>
+
+#if !defined(FLOAT3D_TENSOR_USE_ARRAY) && !defined(FLOAT3D_TENSOR_USE_MDSPAN)
+    #define FLOAT3D_TENSOR_USE_ARRAY
+#endif
+
+#ifdef FLOAT3D_TENSOR_USE_ARRAY
+struct float3DTensorT {
+private:
+    int    _lb[3], _ub[3];
+    size_t _extent[3], _stride[3], _size, offset;
+    float *data;
+    void init();
+
+public:
+    float3DTensorT();
+    float3DTensorT(const int &lb_i, const int &ub_i,
+                   const int &lb_j, const int &ub_j,
+                   const int &lb_k, const int &ub_k);
+
+    ~float3DTensorT();
+    void malloc(const int &lb_i, const int &ub_i,
+                const int &lb_j, const int &ub_j,
+                const int &lb_k, const int &ub_k);
+    void free();
+
+    // https://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator
+    constexpr float &operator[](const int &i, const int &j, const int &k) noexcept
+    {
+        assert(_lb[0] <= i and i <= _ub[0]);
+        assert(_lb[1] <= j and j <= _ub[1]);
+        assert(_lb[2] <= k and k <= _ub[2]);
+        const size_t index = i * _stride[0] + j * _stride[1] + k - offset;
+        assert(index < _size);
+        return data[index];
+    }
+
+    // https://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator
+    constexpr const float &operator[](const int &i, const int &j, const int &k) const noexcept
+    {
+        assert(_lb[0] <= i and i <= _ub[0]);
+        assert(_lb[1] <= j and j <= _ub[1]);
+        assert(_lb[2] <= k and k <= _ub[2]);
+        const size_t index = i * _stride[0] + j * _stride[1] + k - offset;
+        assert(index < _size);
+        return data[index];
+    }
+
+    constexpr int rank() noexcept
+    {
+        return 3;
+    };
+
+    // lower bound for extend in i-th dimension
+    constexpr int lower_bound(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _lb[i];
+    };
+
+    // upper bound for extend in i-th dimension
+    constexpr int uper_bound(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _ub[i];
+    };
+
+    // size of extend in i-th dimension
+    constexpr size_t extent(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _extent[i];
+    };
+
+    // size of stride in i-th dimension
+    constexpr size_t stride(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _stride[i];
+    };
+
+    constexpr size_t size() noexcept
+    {
+        return _size;
+    }
+};
+#endif
+
+#ifdef FLOAT3D_TENSOR_USE_MDSPAN
+    #include <mdspan>
+
+struct float3DTensorT {
+private:
+    int                                           _lb[3], _ub[3];
+    std::mdspan<float, std::dextents<size_t, 3> > ms;
+    void init();
+
+public:
+    float3DTensorT();
+    float3DTensorT(const int &lb_i, const int &ub_i,
+                   const int &lb_j, const int &ub_j,
+                   const int &lb_k, const int &ub_k);
+
+    ~float3DTensorT();
+    void malloc(const int &lb_i, const int &ub_i,
+                const int &lb_j, const int &ub_j,
+                const int &lb_k, const int &ub_k);
+    void free();
+
+    // https://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator
+    constexpr float &operator[](const int &i, const int &j, const int &k) noexcept
+    {
+        assert(_lb[0] <= i and i <= _ub[0]);
+        assert(_lb[1] <= j and j <= _ub[1]);
+        assert(_lb[2] <= k and k <= _ub[2]);
+        return ms[i - _lb[0], j - _lb[1], k - _lb[2]];
+    }
+
+    // https://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator
+    constexpr const float &operator[](const int &i, const int &j, const int &k) const noexcept
+    {
+        assert(_lb[0] <= i and i <= _ub[0]);
+        assert(_lb[1] <= j and j <= _ub[1]);
+        assert(_lb[2] <= k and k <= _ub[2]);
+        return ms[i - _lb[0], j - _lb[1], k - _lb[2]];
+    }
+    constexpr int rank() noexcept
+    {
+        return ms.rank();
+    };
+
+    // lower bound for extend in i-th dimension
+    constexpr int lower_bound(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _lb[i];
+    };
+
+    // upper bound for extend in i-th dimension
+    constexpr int uper_bound(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return _ub[i];
+    };
+
+    // size of extend in i-th dimension
+    constexpr int extent(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return ms.extent(i);
+    }
+
+    // size of stride in i-th dimension
+    constexpr size_t stride(const int i) noexcept
+    {
+        assert(0 <= i and i < rank());
+        return ms.stride(i);
+    };
+
+    constexpr size_t size() noexcept
+    {
+        return ms.size();
+    };
+};
+#endif
+
+#endif
diff --git a/src/freemem.cpp b/src/freemem.cpp
index 219ceb2029f003896e6b3fee77d0092f011a2e59..23f96df32227564a0a4e60957f0f41f13d12f9b7 100644
--- a/src/freemem.cpp
+++ b/src/freemem.cpp
@@ -24,12 +24,12 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod,
-             st_model_av *mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd,
+void freemem(int nsrc_loc, st_acquisition *acq, st_model &mod, st_model &testmod,
+             st_model_av &mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd,
              st_signals *signals, st_gradient *grad, st_gradient *grad_prior1, st_gradient *grad_prior2,
              st_gradient *grad_halo,
-             st_hessian *hessian, st_stress *stress, st_buffer_flat *stressbuff, st_freq_velocity *fourier_vel_back,
-             st_freq_velocity *fourier_vel_fw, st_velocity *vel, st_buffer_flat *velbuff, const GlobVar *gv)
+             st_hessian *hessian, st_stress &stress, st_buffer_flat *stressbuff, st_freq_velocity *fourier_vel_back,
+             st_freq_velocity *fourier_vel_fw, st_velocity &vel, st_buffer_flat *velbuff, const GlobVar *gv)
 {
     int l;
 
@@ -39,22 +39,12 @@ void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod
     }
 
     if (gv->POS[2] == 0) {
-        free_f3tensor(vel->vx, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(vel->vy, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(vel->vz, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vx.free();
+        vel.vy.free();
+        vel.vz.free();
         if (gv->WEQ != 2) {
-            free_f3tensor(stress->sxy, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                          gv->NX + l * gv->FDORDER / 2,
-                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-            free_f3tensor(stress->syz, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                          gv->NX + l * gv->FDORDER / 2,
-                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.sxy.free();
+            stress.syz.free();
         }
         if (gv->METHOD) {
             free_f4tensor(fourier_vel_fw->Fvx_re, 1, gv->NFMAX, 0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
@@ -97,22 +87,12 @@ void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod
     }
 
     if (gv->POS[2] > 0) {
-        free_f3tensor(vel->vx, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(vel->vy, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(vel->vz, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vx.free();
+        vel.vy.free();
+        vel.vz.free();
         if (gv->WEQ != 2) {
-            free_f3tensor(stress->sxy, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                          gv->NX + l * gv->FDORDER / 2,
-                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-            free_f3tensor(stress->syz, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                          gv->NX + l * gv->FDORDER / 2,
-                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.sxy.free();
+            stress.syz.free();
         }
         /*free_f4tensor(fvx,1,gv->NT,1-l*gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
          * free_f4tensor(fvy,1,gv->NT,1-l*gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
@@ -164,22 +144,12 @@ void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod
     }
 
     if (gv->WEQ != 2) {
-        free_f3tensor(stress->sxz, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(stress->sxx, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(stress->syy, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        free_f3tensor(stress->szz, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.sxz.free();
+        stress.sxx.free();
+        stress.syy.free();
+        stress.szz.free();
     } else {
-        free_f3tensor(stress->sp, 1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                      gv->NX + l * gv->FDORDER / 2,
-                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.sp.free();
     }
 
     if (gv->METHOD) {
@@ -254,31 +224,31 @@ void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod
         free_vector(pml_coeff->b_z_half, 1, 2 * gv->FW);
 
         if (gv->WEQ != 2) {
-            free_f3tensor(pml_wfd->psi_sxx_x, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_syy_y, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_szz_z, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            free_f3tensor(pml_wfd->psi_sxy_x, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_sxy_y, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_sxz_x, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_sxz_z, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            free_f3tensor(pml_wfd->psi_syz_y, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_syz_z, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_sxx_x.free();
+            pml_wfd.psi_syy_y.free();
+            pml_wfd.psi_szz_z.free();
+            pml_wfd.psi_sxy_x.free();
+            pml_wfd.psi_sxy_y.free();
+            pml_wfd.psi_sxz_x.free();
+            pml_wfd.psi_sxz_z.free();
+            pml_wfd.psi_syz_y.free();
+            pml_wfd.psi_syz_z.free();
 
-            free_f3tensor(pml_wfd->psi_vxy, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_vyx, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_vxz, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            free_f3tensor(pml_wfd->psi_vzx, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_vyz, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            free_f3tensor(pml_wfd->psi_vzy, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_vxy.free();
+            pml_wfd.psi_vyx.free();
+            pml_wfd.psi_vxz.free();
+            pml_wfd.psi_vzx.free();
+            pml_wfd.psi_vyz.free();
+            pml_wfd.psi_vzy.free();
         } else {
-            free_f3tensor(pml_wfd->psi_sp_x, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_sp_y, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(pml_wfd->psi_sp_z, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_sp_x.free();
+            pml_wfd.psi_sp_y.free();
+            pml_wfd.psi_sp_z.free();
         }
 
-        free_f3tensor(pml_wfd->psi_vxx, 1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-        free_f3tensor(pml_wfd->psi_vyy, 1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-        free_f3tensor(pml_wfd->psi_vzz, 1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+        pml_wfd.psi_vxx.free();
+        pml_wfd.psi_vyy.free();
+        pml_wfd.psi_vzz.free();
     }
 
     if (gv->L) {
@@ -290,41 +260,41 @@ void freemem(int nsrc_loc, st_acquisition *acq, st_model *mod, st_model *testmod
             free_f3tensor(visco_mem->ryz, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
             free_f3tensor(visco_mem->rxz, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
 
-            free_f3tensor(mod->taus, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+            mod.taus.free();
 
-            free_f3tensor(testmod->taus, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+            testmod.taus.free();
 
-            free_f3tensor(mod_av->tausipjp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(mod_av->tausjpkp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-            free_f3tensor(mod_av->tausipkp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
+            mod_av.tausipjp.free();
+            mod_av.tausjpkp.free();
+            mod_av.tausipkp.free();
         } else {
             free_f3tensor(visco_mem->rp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
         }
-        free_f3tensor(mod->taup, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        mod.taup.free();
 
-        free_f3tensor(testmod->taup, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        testmod.taup.free();
 
-        free_vector(mod->eta, 1, gv->L);
+        free_vector(mod.eta, 1, gv->L);
     }
 
-    free_f3tensor(mod->rho, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    free_f3tensor(mod->pi, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    free_f3tensor(mod->absorb_coeff, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    free_f3tensor(testmod->rho, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    free_f3tensor(testmod->pi, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+    mod.rho.free();
+    mod.pi.free();
+    mod.absorb_coeff.free();
+    testmod.rho.free();
+    testmod.pi.free();
 
     /* averaged material parameters */
-    free_f3tensor(mod_av->rjp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    free_f3tensor(mod_av->rkp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    free_f3tensor(mod_av->rip, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
+    mod_av.rjp.free();
+    mod_av.rkp.free();
+    mod_av.rip.free();
 
     if (gv->WEQ != 2) {
-        free_f3tensor(mod->u, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-        free_f3tensor(testmod->u, 0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        mod.u.free();
+        testmod.u.free();
 
-        free_f3tensor(mod_av->uipjp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-        free_f3tensor(mod_av->ujpkp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
-        free_f3tensor(mod_av->uipkp, 1, gv->NY, 1, gv->NX, 1, gv->NZ);
+        mod_av.uipjp.free();
+        mod_av.ujpkp.free();
+        mod_av.uipkp.free();
     }
 
     free(velbuff->lef_to_rig);
diff --git a/src/fsource.cpp b/src/fsource.cpp
index 016f1cf1814de263e7d63677f70cdf7392bc09a8..f12e2bcc9e63495124cddb0f524cb5e4a1f914e1 100644
--- a/src/fsource.cpp
+++ b/src/fsource.cpp
@@ -23,7 +23,7 @@
 
 #include "fd.hpp"
 
-void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
+void fsource(int nt, st_velocity &vel, st_model_av &mod_av, float **srcpos_loc,
              st_signals *signals, int nsrc, int back, const GlobVar *gv)
 {
     /* Adding body force components to corresponding particle velocities */
@@ -46,20 +46,20 @@ void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
             float alpha_rad, beta_rad;
             switch ((int)srcpos_loc[7][l]) {
             case 2:
-                vel->vx[j][i][k] += amp * mod_av->rip[j][i][k];
+                vel.vx[j, i, k] += amp * mod_av.rip[j, i, k];
                 break;
             case 3:
-                vel->vy[j][i][k] += amp * mod_av->rkp[j][i][k]; /* single force in y, vertical direction */
+                vel.vy[j, i, k] += amp * mod_av.rkp[j, i, k]; /* single force in y, vertical direction */
                 break;
             case 4:
-                vel->vz[j][i][k] += amp * mod_av->rjp[j][i][k]; /* single force in z  */
+                vel.vz[j, i, k] += amp * mod_av.rjp[j, i, k]; /* single force in z  */
                 break;
             case 5:
-                alpha_rad = gv->ALPHA * PI / 180;               /* custom force */
+                alpha_rad = gv->ALPHA * PI / 180;              /* custom force */
                 beta_rad = gv->BETA * PI / 180;
-                vel->vx[j][i][k] += cos(beta_rad) * cos(alpha_rad) * amp;
-                vel->vy[j][i][k] += sin(alpha_rad) * amp;
-                vel->vz[j][i][k] += sin(beta_rad) * cos(alpha_rad) * amp;
+                vel.vx[j, i, k] += cos(beta_rad) * cos(alpha_rad) * amp;
+                vel.vy[j, i, k] += sin(alpha_rad) * amp;
+                vel.vz[j, i, k] += sin(beta_rad) * cos(alpha_rad) * amp;
                 break;
             }
         }
@@ -73,7 +73,7 @@ void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
                 i = (int)srcpos_loc[1][l];
                 j = (int)srcpos_loc[2][l];
                 k = (int)srcpos_loc[3][l];
-                vel->vx[j][i][k] += signals->sectionvxdiff[l][nt];
+                vel.vx[j, i, k] += signals->sectionvxdiff[l][nt];
             }
             break;
         case 2:                /* vy only */
@@ -81,7 +81,7 @@ void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
                 i = (int)srcpos_loc[1][l];
                 j = (int)srcpos_loc[2][l];
                 k = (int)srcpos_loc[3][l];
-                vel->vy[j][i][k] += signals->sectionvydiff[l][nt];
+                vel.vy[j, i, k] += signals->sectionvydiff[l][nt];
             }
             break;
         case 3:                /* vz only */
@@ -89,7 +89,7 @@ void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
                 i = (int)srcpos_loc[1][l];
                 j = (int)srcpos_loc[2][l];
                 k = (int)srcpos_loc[3][l];
-                vel->vz[j][i][k] += signals->sectionvzdiff[l][nt];
+                vel.vz[j, i, k] += signals->sectionvzdiff[l][nt];
             }
             break;
         case 4:                /* particle velocities (vx + vy + vz) */
@@ -97,9 +97,9 @@ void fsource(int nt, st_velocity *vel, st_model_av *mod_av, float **srcpos_loc,
                 i = (int)srcpos_loc[1][l];
                 j = (int)srcpos_loc[2][l];
                 k = (int)srcpos_loc[3][l];
-                vel->vx[j][i][k] += signals->sectionvxdiff[l][nt];
-                vel->vz[j][i][k] += signals->sectionvzdiff[l][nt];
-                vel->vy[j][i][k] += signals->sectionvydiff[l][nt];
+                vel.vx[j, i, k] += signals->sectionvxdiff[l][nt];
+                vel.vz[j, i, k] += signals->sectionvzdiff[l][nt];
+                vel.vy[j, i, k] += signals->sectionvydiff[l][nt];
             }
             break;
         }
diff --git a/src/gradient_F.cpp b/src/gradient_F.cpp
index 1bc81d03f56d306faea28cd642f429f72ad458b9..e8775a84fa3f1b187174a0985a6f7f84057bf468 100644
--- a/src/gradient_F.cpp
+++ b/src/gradient_F.cpp
@@ -28,7 +28,7 @@
 
 void gradient_F(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *back, st_gradient *grad,
                 st_hessian *hessian,
-                st_model *mod, const float *finv, int nf, const GlobVar *gv)
+                st_model &mod, const float *finv, int nf, const GlobVar *gv)
 {
     float fvxx, fvxy, fvxz, fvyx, fvyy, fvyz, fvzx, fvzy, fvzz;
     float bvxx, bvxy, bvxz, bvyx, bvyy, bvyz, bvzx, bvzy, bvzz;
@@ -194,16 +194,14 @@ void gradient_F(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *
                     /*parametrisation vp, vs, rho */
                     grad->vp[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k +
                                                                                  gv->SMOOTH_LENGTH_DZ] +=
-                        sqrt(mod->rho[j][i][k] * mod->pi[j][i][k]) * 2 * gradlam;                                                                                        /*gradient vp */
+                        sqrt(mod.rho[j, i, k] * mod.pi[j, i, k]) * 2 * gradlam;                                                                                        /*gradient vp */
                     grad->vs[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] += -4 *
                                                                                                               sqrt(
-                        mod->rho[j][i][k] * mod->u[j][i][k]) * gradlam + 2 * sqrt(mod->rho[j][i][k] * mod->u[j][i][k]) *
+                        mod.rho[j, i, k] * mod.u[j, i, k]) * gradlam + 2 * sqrt(mod.rho[j, i, k] * mod.u[j, i, k]) *
                                                                                                               gradmu;                                                                                                            /*gradient vs */
                     grad->rho[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] += gradrho +
-                                                                                                               mod->u[j]
-                                                                                                               [i][k] /
-                                                                                                               mod->rho[
-                        j][i][k] * gradmu + (mod->pi[j][i][k] - 2 * mod->u[j][i][k]) / mod->rho[j][i][k] * gradlam;                                                                                                                              /*gradient rho */
+                                                                                                               mod.u[j, i, k] /
+                                                                                                               mod.rho[j, i, k] * gradmu + (mod.pi[j, i, k] - 2 * mod.u[j, i, k]) / mod.rho[j, i, k] * gradlam;                                                                                                                                                                                                                              /*gradient rho */
 
 
                     if (gv->HESS && !gv->READ_HESS) {
@@ -227,11 +225,11 @@ void gradient_F(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *
                              fw->Fvy_im[l][j][i][k] * fw->Fvy_im[l][j][i][k] +
                              fw->Fvz_im[l][j][i][k] * fw->Fvz_im[l][j][i][k]);
 
-                        hessian->vp[j][i][k] += sqrt(mod->rho[j][i][k] * mod->pi[j][i][k]) * 2 * relam;                /*gradient vp */
-                        hessian->vs[j][i][k] += -4 * sqrt(mod->rho[j][i][k] * mod->u[j][i][k]) * relam + 2 *
-                                                sqrt(mod->rho[j][i][k] * mod->u[j][i][k]) * remu;                      /*gradient vs */
-                        hessian->rho[j][i][k] += rerho + mod->u[j][i][k] / mod->rho[j][i][k] * remu +
-                                                 (mod->pi[j][i][k] - 2 * mod->u[j][i][k]) / mod->rho[j][i][k] * relam; /*gradient rho */
+                        hessian->vp[j][i][k] += sqrt(mod.rho[j, i, k] * mod.pi[j, i, k]) * 2 * relam;               /*gradient vp */
+                        hessian->vs[j][i][k] += -4 * sqrt(mod.rho[j, i, k] * mod.u[j, i, k]) * relam + 2 *
+                                                sqrt(mod.rho[j, i, k] * mod.u[j, i, k]) * remu;                     /*gradient vs */
+                        hessian->rho[j][i][k] += rerho + mod.u[j, i, k] / mod.rho[j, i, k] * remu +
+                                                 (mod.pi[j, i, k] - 2 * mod.u[j, i, k]) / mod.rho[j, i, k] * relam; /*gradient rho */
                     }
                 }
             }
diff --git a/src/gradient_F_acoustic.cpp b/src/gradient_F_acoustic.cpp
index 3c44f1b10eee5277eabdf5a8b5a81bf0afbf2b66..a8e93a331a0757c2419442b9bf33009c542e69be 100644
--- a/src/gradient_F_acoustic.cpp
+++ b/src/gradient_F_acoustic.cpp
@@ -28,7 +28,7 @@
 
 void gradient_F_acoustic(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_velocity *back, st_gradient *grad,
                          st_hessian *hessian,
-                         st_model *mod, const float *finv, int nf, const GlobVar *gv)
+                         st_model &mod, const float *finv, int nf, const GlobVar *gv)
 {
     float fvxx, fvyy, fvzz, bvxx, bvyy, bvzz;
     float fivxx, fivyy, fivzz, bivxx, bivyy, bivzz;
@@ -107,12 +107,10 @@ void gradient_F_acoustic(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_v
                     /* parametrisation vp, rho */
                     grad->vp[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k +
                                                                                  gv->SMOOTH_LENGTH_DZ] +=
-                        sqrt(mod->rho[j][i][k] * mod->pi[j][i][k]) * 2 * gradlam;                                                                                         /*gradient vp */
+                        sqrt(mod.rho[j, i, k] * mod.pi[j, i, k]) * 2 * gradlam;                                                                                         /*gradient vp */
                     grad->rho[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] += gradrho +
-                                                                                                               mod->pi[j]
-                                                                                                               [i][k] /
-                                                                                                               mod->rho[
-                        j][i][k] * gradlam;                                                                                                                               /*gradient rho */
+                                                                                                               mod.pi[j, i, k] /
+                                                                                                               mod.rho[j, i, k] * gradlam;                                                                                                                               /*gradient rho */
 
                     if (gv->HESS && !gv->READ_HESS) {
                         rerho =
@@ -127,8 +125,8 @@ void gradient_F_acoustic(int nx, int ny, int nz, st_freq_velocity *fw, st_freq_v
                                 (fivxx + fivyy + fivzz);
                         relam = relam * fdummy;
 
-                        hessian->vp[j][i][k] += sqrt(mod->rho[j][i][k] * mod->pi[j][i][k]) * 2 * relam;
-                        hessian->rho[j][i][k] += rerho + (mod->pi[j][i][k]) / mod->rho[j][i][k] * relam;
+                        hessian->vp[j][i][k] += sqrt(mod.rho[j, i, k] * mod.pi[j, i, k]) * 2 * relam;
+                        hessian->rho[j][i][k] += rerho + (mod.pi[j, i, k]) / mod.rho[j, i, k] * relam;
                     }
                 }
             }
diff --git a/src/ifos3d.cpp b/src/ifos3d.cpp
index 06a2544c2975f417574a9eaaa9731b82e7f9b1f4..ed9ceeb112220c0d615aa0da134b824f95eb3f87 100644
--- a/src/ifos3d.cpp
+++ b/src/ifos3d.cpp
@@ -183,9 +183,9 @@ int main(int argc, char **argv)
     }
 
     /* allocate and initialize buffers */
-    buffsize = initmem(&mod, &testmod, &mod_av, &visco_mem, &pml_coeff, &pml_wfd,
-                       &grad, &grad_prior1, &grad_prior2, &grad_halo, &hessian, &stress, &stressbuff,
-                       &fourier_vel_back, &fourier_vel_fw, &vel, &velbuff, &gv);
+    buffsize = initmem(mod, testmod, mod_av, &visco_mem, &pml_coeff, pml_wfd,
+                       &grad, &grad_prior1, &grad_prior2, &grad_halo, &hessian, stress, &stressbuff,
+                       &fourier_vel_back, &fourier_vel_fw, vel, &velbuff, &gv);
 
     /* allocate buffer for buffering messages */
     buff_addr = (char *)malloc(buffsize);
@@ -204,13 +204,13 @@ int main(int argc, char **argv)
     /* create model grids */
     log_infoc(0, "------------------------- Model creation / output -----------\n");
     if (gv.READMOD) {
-        readmod(&mod, &gv);     // read model
+        readmod(mod, &gv);     // read model
     } else {
-        model(&mod, &gv);       // create model
+        model(mod, &gv);       // create model
     }
 
     if (gv.COLOR == 0 && gv.ITMIN == 1) {
-        outmod(&mod, 0, &gv);
+        outmod(mod, 0, &gv);
     }
 
     /* reading source positions from SOURCE_FILE */
@@ -332,7 +332,7 @@ int main(int argc, char **argv)
     MPI_Barrier(MPI_COMM_WORLD);
 
     /* check if the FD run will be stable and free of numerical dispersion */
-    checkfd(&mod, &acq, &gv);
+    checkfd(mod, &acq, &gv);
 
     st_boundary nb_fix = { .nx1 = 1, .nx2 = gv.NX, .ny1 = 1, .ny2 = gv.NY, .nz1 = 1, .nz2 = gv.NZ };
     nb = nb_fix;
@@ -368,18 +368,18 @@ int main(int argc, char **argv)
             zero_invers(&fourier_vel_fw, &fourier_vel_back, gv.NFMAX, &gv);
         }
         if (gv.WEQ != 2) {
-            matcopy(&mod, &gv);
+            matcopy(mod, &gv);
         } else {
-            matcopy_acoustic(&mod, &gv);
+            matcopy_acoustic(mod, &gv);
         }
         if (gv.FREE_SURF) {
             if (gv.WEQ != 2) {
-                constant_boundary(&nb, &mod, &gv);
+                constant_boundary(&nb, mod, &gv);
             } else {
-                constant_boundary_acoustic(&nb, &mod, &gv);
+                constant_boundary_acoustic(&nb, mod, &gv);
             }
         }
-        av_mat(&mod, &mod_av, &gv);
+        av_mat(mod, mod_av, &gv);
         L2all = 0.0;
         misfit[0] = 0.0;
 
@@ -471,9 +471,9 @@ int main(int argc, char **argv)
 
             /* initialize wavefield with zero */
             if (gv.WEQ != 2) {
-                zero_wavefield(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                zero_wavefield(vel, stress, &visco_mem, pml_wfd, &gv);
             } else {
-                zero_wavefield_acoustic(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                zero_wavefield_acoustic(vel, stress, &visco_mem, pml_wfd, &gv);
             }
             if (gv.METHOD)
                 zero_invers(&fourier_vel_fw, &fourier_vel_back, gv.NFMAX, &gv);
@@ -487,8 +487,8 @@ int main(int argc, char **argv)
                     ntast = 1;
 
                 if (gv.STFI) {
-                    stfi(&acq, &nb, &nb_fix, &vel, &stress, &mod, &mod_av, &visco_mem, &section, &section_obs,
-                         &signals, nsrc_loc, ntr_loc, &pml_coeff, &pml_wfd, &stressbuff, &velbuff,
+                    stfi(&acq, &nb, &nb_fix, vel, stress, mod, mod_av, &visco_mem, &section, &section_obs,
+                         &signals, nsrc_loc, ntr_loc, &pml_coeff, pml_wfd, &stressbuff, &velbuff,
                          &fourier_vel_fw, finv, &L2, nf, ntast, lsnap, nsnap, ishot, shot_id, cdf, iteration, groupnum,
                          it_group, ncplx, &gv);
                 }
@@ -497,9 +497,9 @@ int main(int argc, char **argv)
             /*****************************************************
             * Timestep loop (simulation)
             *****************************************************/
-            timeloop(&nb, &nb_fix, &vel, &stress, &mod, &mod_av, &section,
+            timeloop(&nb, &nb_fix, vel, stress, mod, mod_av, &section,
                      acq.srcpos_loc, acq.recpos_loc, &signals, nsrc_loc,
-                     mod.absorb_coeff, &pml_coeff, &pml_wfd, &stressbuff, &velbuff, &fourier_vel_fw,
+                     mod.absorb_coeff, &pml_coeff, pml_wfd, &stressbuff, &velbuff, &fourier_vel_fw,
                      finv, nf, ntast, ntr_loc, lsnap, nsnap, 0, shot_id, 1, &gv);
 
             time3a = MPI_Wtime();
@@ -556,17 +556,17 @@ int main(int argc, char **argv)
 
                 /* initialize wavefields */
                 if (gv.WEQ != 2) {
-                    zero_wavefield(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                    zero_wavefield(vel, stress, &visco_mem, pml_wfd, &gv);
                 } else {
-                    zero_wavefield_acoustic(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                    zero_wavefield_acoustic(vel, stress, &visco_mem, pml_wfd, &gv);
                 }
 
                 /*****************************************************
                 *           Timestep loop (back-propagation)
                 *****************************************************/
-                timeloop(&nb, &nb_fix, &vel, &stress, &mod, &mod_av, &section,
+                timeloop(&nb, &nb_fix, vel, stress, mod, mod_av, &section,
                          acq.srcpos_loc_back, acq.recpos_loc, &signals, ntr_loc,
-                         mod.absorb_coeff, &pml_coeff, &pml_wfd, &stressbuff, &velbuff, &fourier_vel_back,
+                         mod.absorb_coeff, &pml_coeff, pml_wfd, &stressbuff, &velbuff, &fourier_vel_back,
                          finv, nf, ntast, ntr_loc, lsnap, nsnap, 0, shot_id, 2, &gv);
 
                 MPI_Barrier(gv.COMM_SHOT);
@@ -579,10 +579,10 @@ int main(int argc, char **argv)
                 MPI_Barrier(gv.COMM_SHOT);
 
                 if (gv.WEQ != 2) {
-                    gradient_F(gv.NX, gv.NY, gv.NZ, &fourier_vel_fw, &fourier_vel_back, &grad, &hessian, &mod, finv, nf,
+                    gradient_F(gv.NX, gv.NY, gv.NZ, &fourier_vel_fw, &fourier_vel_back, &grad, &hessian, mod, finv, nf,
                                &gv);
                 } else {
-                    gradient_F_acoustic(gv.NX, gv.NY, gv.NZ, &fourier_vel_fw, &fourier_vel_back, &grad, &hessian, &mod,
+                    gradient_F_acoustic(gv.NX, gv.NY, gv.NZ, &fourier_vel_fw, &fourier_vel_back, &grad, &hessian, mod,
                                         finv, nf, &gv);
                 }
 
@@ -729,22 +729,22 @@ int main(int argc, char **argv)
                     log_info("%d. test steplength: step[%d]=%.2e\n", steptest, steptest, step[steptest]);
                 }
 
-                cpmodel(&mod, &testmod, &gv);
+                cpmodel(mod, testmod, &gv);
                 if (gv.WEQ != 2) {
-                    modelupdate(&grad, &testmod, step[steptest], it_group, &gv);
-                    matcopy(&testmod, &gv);
+                    modelupdate(&grad, testmod, step[steptest], it_group, &gv);
+                    matcopy(testmod, &gv);
                 } else {
-                    modelupdate_acoustic(&grad, &testmod, step[steptest], it_group, &gv);
-                    matcopy_acoustic(&testmod, &gv);
+                    modelupdate_acoustic(&grad, testmod, step[steptest], it_group, &gv);
+                    matcopy_acoustic(testmod, &gv);
                 }
                 if (gv.FREE_SURF) {
                     if (gv.WEQ != 2) {
-                        constant_boundary(&nb, &testmod, &gv);
+                        constant_boundary(&nb, testmod, &gv);
                     } else {
-                        constant_boundary_acoustic(&nb, &testmod, &gv);
+                        constant_boundary_acoustic(&nb, testmod, &gv);
                     }
                 }
-                av_mat(&testmod, &mod_av, &gv);
+                av_mat(testmod, mod_av, &gv);
 
                 L2 = 0.0;
 
@@ -794,17 +794,17 @@ int main(int argc, char **argv)
                         }
 
                         if (gv.WEQ != 2) {
-                            zero_wavefield(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                            zero_wavefield(vel, stress, &visco_mem, pml_wfd, &gv);
                         } else {
-                            zero_wavefield_acoustic(&vel, &stress, &visco_mem, &pml_wfd, &gv);
+                            zero_wavefield_acoustic(vel, stress, &visco_mem, pml_wfd, &gv);
                         }
 
                         /*****************************************************
                         * Timestep loop (steplength calculation)
                         *****************************************************/
-                        timeloop(&nb, &nb_fix, &vel, &stress, &testmod, &mod_av, &section,
+                        timeloop(&nb, &nb_fix, vel, stress, testmod, mod_av, &section,
                                  acq.srcpos_loc, acq.recpos_loc, &signals, nsrc_loc,
-                                 mod.absorb_coeff, &pml_coeff, &pml_wfd, &stressbuff, &velbuff, &fourier_vel_fw,
+                                 mod.absorb_coeff, &pml_coeff, pml_wfd, &stressbuff, &velbuff, &fourier_vel_fw,
                                  finv, nf, ntast, ntr_loc, lsnap, nsnap, 0, shot_id, 3, &gv);
 
                         seismo_shift(&section, ntr_loc, acq.srcpos[5][ishot1], &gv);
@@ -830,12 +830,12 @@ int main(int argc, char **argv)
             }
 
             if (gv.WEQ != 2) {
-                modelupdate(&grad, &mod, step[3], it_group, &gv);
+                modelupdate(&grad, mod, step[3], it_group, &gv);
             } else {
-                modelupdate_acoustic(&grad, &mod, step[3], it_group, &gv);
+                modelupdate_acoustic(&grad, mod, step[3], it_group, &gv);
             }
             if (gv.COLOR == 0) {
-                outmod(&mod, iteration, &gv);
+                outmod(mod, iteration, &gv);
             }
         }
         /* fwi loop */
@@ -848,10 +848,10 @@ int main(int argc, char **argv)
 
 
     /* de-allocation of memory */
-    freemem(nsrc_loc, &acq, &mod, &testmod, &mod_av,
-            &visco_mem, &pml_coeff, &pml_wfd, &signals, &grad,
-            &grad_prior1, &grad_prior2, &grad_halo, &hessian, &stress, &stressbuff,
-            &fourier_vel_back, &fourier_vel_fw, &vel, &velbuff, &gv);
+    freemem(nsrc_loc, &acq, mod, testmod, mod_av,
+            &visco_mem, &pml_coeff, pml_wfd, &signals, &grad,
+            &grad_prior1, &grad_prior2, &grad_halo, &hessian, stress, &stressbuff,
+            &fourier_vel_back, &fourier_vel_fw, vel, &velbuff, &gv);
 
     if (topo) {
         free_imatrix(topo, 1, gv.NXG, 1, gv.NZG);
diff --git a/src/initmem.cpp b/src/initmem.cpp
index af01298f68609cdf00bc2cf8d393eeddd86b721c..54a548f8afee5ffa3b36ecdb85d9c3df34692f3a 100644
--- a/src/initmem.cpp
+++ b/src/initmem.cpp
@@ -25,12 +25,12 @@
 #include "logging.hpp"
 #include "util.hpp"
 
-int initmem(st_model *mod, st_model *testmod,
-            st_model_av *mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff,
-            st_pml_wfd *pml_wfd, st_gradient *grad, st_gradient *grad_prior1,
-            st_gradient *grad_prior2, st_gradient *grad_halo, st_hessian *hessian, st_stress *stress,
+int initmem(st_model &mod, st_model &testmod,
+            st_model_av &mod_av, st_visc_mem *visco_mem, st_pml_coeff *pml_coeff,
+            st_pml_wfd &pml_wfd, st_gradient *grad, st_gradient *grad_prior1,
+            st_gradient *grad_prior2, st_gradient *grad_halo, st_hessian *hessian, st_stress &stress,
             st_buffer_flat *stressbuff, st_freq_velocity *fourier_vel_back,
-            st_freq_velocity *fourier_vel_fw, st_velocity *vel, st_buffer_flat *velbuff,
+            st_freq_velocity *fourier_vel_fw, st_velocity &vel, st_buffer_flat *velbuff,
             GlobVar *gv)
 {
     int l, nf1, nf2, nseismograms = 0, buffsize;
@@ -40,34 +40,34 @@ int initmem(st_model *mod, st_model *testmod,
 
     /* number of seismogram sections which have to be stored in core memory */
     switch (gv->SEISMO) {
-    case 1:                    /* particle velocities only */
+    case 1: /* particle velocities only */
         nseismograms = 3;
         break;
-    case 2:                    /* pressure only */
+    case 2: /* pressure only */
         nseismograms = 1;
         break;
-    case 3:                    /* curl and div only */
+    case 3: /* curl and div only */
         nseismograms = 2;
         break;
-    case 4:                    /* everything */
+    case 4: /* everything */
         nseismograms = 6;
         break;
     }
     if (gv->METHOD) {
         switch (gv->ADJOINT_TYPE) {
-        case 1:                      /* vx only */
+        case 1: /* vx only */
             nseismograms += 1;
             break;
-        case 2:                      /* vy only */
+        case 2: /* vy only */
             nseismograms += 1;
             break;
-        case 3:                      /* vz only */
+        case 3: /* vz only */
             nseismograms += 1;
             break;
-        case 4:                      /* particle velocities (vx + vy + vz) */
+        case 4: /* particle velocities (vx + vy + vz) */
             nseismograms += 3;
             break;
-        case 5:                      /* pressure only */
+        case 5: /* pressure only */
             nseismograms += 1;
             break;
         }
@@ -78,10 +78,10 @@ int initmem(st_model *mod, st_model *testmod,
     fac2 = sizeof(float) * pow(2.0, -20.0);
     fac3 = gv->NZ * gv->NY * gv->NX;
 
-    if (gv->L > 0) {            /* viscoelastic case */
+    if (gv->L > 0) { /* viscoelastic case */
         memdyn = 15.0 * fac1 * fac2;
         memmodel = 16.0 * fac1 * fac2;
-    } else {                    /* elastic case */
+    } else {         /* elastic case */
         memdyn = 9.0 * fac1 * fac2;
         memmodel = 10.0 * fac1 * fac2;
     }
@@ -127,18 +127,15 @@ int initmem(st_model *mod, st_model *testmod,
 
     /* memory allocation for dynamic (wavefield) arrays */
     if (gv->POS[2] == 0) {
-        vel->vx =
-            f3tensor(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        vel->vy =
-            f3tensor(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        vel->vz =
-            f3tensor(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vx.malloc(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vy.malloc(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vz.malloc(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         /* fvx  =  f4tensor(1,NT,0-gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
          * fvy  =  f4tensor(1,NT,0-gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
          * fvz  =  f4tensor(1,NT,0-gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2); */
@@ -187,30 +184,25 @@ int initmem(st_model *mod, st_model *testmod,
                          gv->NX + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         }
         if (gv->WEQ != 2) {
-            stress->sxy =
-                f3tensor(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                         gv->NX + l * gv->FDORDER / 2,
-                         1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-            stress->syz =
-                f3tensor(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                         gv->NX + l * gv->FDORDER / 2,
-                         1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.sxy.malloc(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.syz.malloc(0 - gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         }
     }
 
     if (gv->POS[2] > 0) {
-        vel->vx =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        vel->vy =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        vel->vz =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vx.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vy.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        vel.vz.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                      1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         /* fvx  =  f4tensor(1,NT,1-l*gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
          * fvy  =  f4tensor(1,NT,1-l*gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2);
          * fvz  =  f4tensor(1,NT,1-l*gv->FDORDER/2,gv->NY+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NX+l*gv->FDORDER/2,1-l*gv->FDORDER/2,gv->NZ+l*gv->FDORDER/2); */
@@ -259,39 +251,32 @@ int initmem(st_model *mod, st_model *testmod,
                          gv->NX + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         }
         if (gv->WEQ != 2) {
-            stress->sxy =
-                f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                         gv->NX + l * gv->FDORDER / 2,
-                         1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-            stress->syz =
-                f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                         gv->NX + l * gv->FDORDER / 2,
-                         1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.sxy.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+            stress.syz.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                              1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
         }
     }
 
     if (gv->WEQ != 2) {
-        stress->sxz =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        stress->sxx =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        stress->syy =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
-        stress->szz =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.sxz.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.sxx.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.syy.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.szz.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                          1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
     } else {
-        stress->sp =
-            f3tensor(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2, 1 - l * gv->FDORDER / 2,
-                     gv->NX + l * gv->FDORDER / 2,
-                     1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
+        stress.sp.malloc(1 - l * gv->FDORDER / 2, gv->NY + l * gv->FDORDER / 2,
+                         1 - l * gv->FDORDER / 2, gv->NX + l * gv->FDORDER / 2,
+                         1 - l * gv->FDORDER / 2, gv->NZ + l * gv->FDORDER / 2);
     }
 
     /* memory allocation for inversion parameter */
@@ -374,30 +359,30 @@ int initmem(st_model *mod, st_model *testmod,
         pml_coeff->b_z_half = vector(1, 2 * gv->FW);
 
         if (gv->WEQ != 2) {
-            pml_wfd->psi_sxx_x = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_sxy_x = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_sxz_x = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_syy_y = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            pml_wfd->psi_sxy_y = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            pml_wfd->psi_syz_y = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            pml_wfd->psi_szz_z = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            pml_wfd->psi_sxz_z = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            pml_wfd->psi_syz_z = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_sxx_x.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_sxy_x.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_sxz_x.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_syy_y.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_sxy_y.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_syz_y.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_szz_z.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_sxz_z.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_syz_z.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
 
-            pml_wfd->psi_vxy = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            pml_wfd->psi_vxz = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            pml_wfd->psi_vyx = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_vyz = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
-            pml_wfd->psi_vzx = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_vzy = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_vxy.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_vxz.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_vyx.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_vyz.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_vzx.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_vzy.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
         } else {
-            pml_wfd->psi_sp_x = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-            pml_wfd->psi_sp_y = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-            pml_wfd->psi_sp_z = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+            pml_wfd.psi_sp_x.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+            pml_wfd.psi_sp_y.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+            pml_wfd.psi_sp_z.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
         }
-        pml_wfd->psi_vxx = f3tensor(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
-        pml_wfd->psi_vyy = f3tensor(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
-        pml_wfd->psi_vzz = f3tensor(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
+        pml_wfd.psi_vxx.malloc(1, gv->NY, 1, 2 * gv->FW, 1, gv->NZ);
+        pml_wfd.psi_vyy.malloc(1, 2 * gv->FW, 1, gv->NX, 1, gv->NZ);
+        pml_wfd.psi_vzz.malloc(1, gv->NY, 1, gv->NX, 1, 2 * gv->FW);
     }
 
     if (gv->L) {
@@ -409,40 +394,40 @@ int initmem(st_model *mod, st_model *testmod,
             visco_mem->ryy = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
             visco_mem->rzz = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
 
-            mod->taus = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-            testmod->taus = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-            mod_av->tausipjp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-            mod_av->tausjpkp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-            mod_av->tausipkp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+            mod.taus.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+            testmod.taus.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+            mod_av.tausipjp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+            mod_av.tausjpkp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+            mod_av.tausipkp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
         } else {
             visco_mem->rp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
         }
-        mod->taup = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        mod.taup.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
 
-        //testmodel dummy (currently no viscoelastic gradients)
-        testmod->taup = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        // testmodel dummy (currently no viscoelastic gradients)
+        testmod.taup.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
 
-        mod->eta = vector(1, gv->L);
+        mod.eta = vector(1, gv->L);
     }
 
     /* visco_memory allocation for static (model) arrays */
-    mod->rho = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    mod->pi = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    mod->absorb_coeff = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    testmod->rho = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-    testmod->pi = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+    mod.rho.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+    mod.pi.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+    mod.absorb_coeff.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+    testmod.rho.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+    testmod.pi.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
 
     if (gv->WEQ != 2) {
-        mod->u = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
-        testmod->u = f3tensor(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        mod.u.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
+        testmod.u.malloc(0, gv->NY + 1, 0, gv->NX + 1, 0, gv->NZ + 1);
         /* averaged material parameters */
-        mod_av->uipjp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-        mod_av->ujpkp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-        mod_av->uipkp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+        mod_av.uipjp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+        mod_av.ujpkp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+        mod_av.uipkp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
     }
-    mod_av->rjp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    mod_av->rkp = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
-    mod_av->rip = f3tensor(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+    mod_av.rjp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+    mod_av.rkp.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
+    mod_av.rip.malloc(1, gv->NY, 1, gv->NX, 1, gv->NZ);
 
     /* memory allocation for buffer arrays in which the wavefield
      * information which is exchanged between neighbouring PEs is stored */
diff --git a/src/matcopy.cpp b/src/matcopy.cpp
index e5f9434ed870937a62a10870895175ab52a793be..e4c23395452d583d42cb9b6168774be03322e62c 100644
--- a/src/matcopy.cpp
+++ b/src/matcopy.cpp
@@ -29,7 +29,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void matcopy(st_model *mod, GlobVar *gv)
+void matcopy(st_model &mod, GlobVar *gv)
 {
     MPI_Status status;
     //double time1=0.0, time2=0.0;
@@ -56,13 +56,13 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of top of local volume into buffer */
-            buffertop_to_bot[i][k][1] = mod->rho[1][i][k];
-            buffertop_to_bot[i][k][2] = mod->pi[1][i][k];
-            buffertop_to_bot[i][k][3] = mod->u[1][i][k];
+            buffertop_to_bot[i][k][1] = mod.rho[1, i, k];
+            buffertop_to_bot[i][k][2] = mod.pi[1, i, k];
+            buffertop_to_bot[i][k][3] = mod.u[1, i, k];
 
             if (gv->L) {
-                buffertop_to_bot[i][k][4] = mod->taus[1][i][k];
-                buffertop_to_bot[i][k][5] = mod->taup[1][i][k];
+                buffertop_to_bot[i][k][4] = mod.taus[1, i, k];
+                buffertop_to_bot[i][k][5] = mod.taup[1, i, k];
             }
         }
     }
@@ -70,13 +70,13 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of bottom of local volume into buffer */
-            bufferbot_to_top[i][k][1] = mod->rho[gv->NY][i][k];
-            bufferbot_to_top[i][k][2] = mod->pi[gv->NY][i][k];
-            bufferbot_to_top[i][k][3] = mod->u[gv->NY][i][k];
+            bufferbot_to_top[i][k][1] = mod.rho[gv->NY, i, k];
+            bufferbot_to_top[i][k][2] = mod.pi[gv->NY, i, k];
+            bufferbot_to_top[i][k][3] = mod.u[gv->NY, i, k];
 
             if (gv->L) {
-                bufferbot_to_top[i][k][4] = mod->taus[gv->NY][i][k];
-                bufferbot_to_top[i][k][5] = mod->taup[gv->NY][i][k];
+                bufferbot_to_top[i][k][4] = mod.taus[gv->NY, i, k];
+                bufferbot_to_top[i][k][5] = mod.taup[gv->NY, i, k];
             }
         }
     }
@@ -94,24 +94,24 @@ void matcopy(st_model *mod, GlobVar *gv)
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[gv->NY + 1][i][k] = buffertop_to_bot[i][k][1];
-            mod->pi[gv->NY + 1][i][k] = buffertop_to_bot[i][k][2];
-            mod->u[gv->NY + 1][i][k] = buffertop_to_bot[i][k][3];
+            mod.rho[gv->NY + 1, i, k] = buffertop_to_bot[i][k][1];
+            mod.pi[gv->NY + 1, i, k] = buffertop_to_bot[i][k][2];
+            mod.u[gv->NY + 1, i, k] = buffertop_to_bot[i][k][3];
             if (gv->L) {
-                mod->taus[gv->NY + 1][i][k] = buffertop_to_bot[i][k][4];
-                mod->taup[gv->NY + 1][i][k] = buffertop_to_bot[i][k][5];
+                mod.taus[gv->NY + 1, i, k] = buffertop_to_bot[i][k][4];
+                mod.taup[gv->NY + 1, i, k] = buffertop_to_bot[i][k][5];
             }
         }
     }
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[0][i][k] = bufferbot_to_top[i][k][1];
-            mod->pi[0][i][k] = bufferbot_to_top[i][k][2];
-            mod->u[0][i][k] = bufferbot_to_top[i][k][3];
+            mod.rho[0, i, k] = bufferbot_to_top[i][k][1];
+            mod.pi[0, i, k] = bufferbot_to_top[i][k][2];
+            mod.u[0, i, k] = bufferbot_to_top[i][k][3];
             if (gv->L) {
-                mod->taus[0][i][k] = bufferbot_to_top[i][k][4];
-                mod->taup[0][i][k] = bufferbot_to_top[i][k][5];
+                mod.taus[0, i, k] = bufferbot_to_top[i][k][4];
+                mod.taup[0, i, k] = bufferbot_to_top[i][k][5];
             }
         }
     }
@@ -121,12 +121,12 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of left edge of local volume into buffer */
-            bufferlef_to_rig[j][k][1] = mod->rho[j][1][k];
-            bufferlef_to_rig[j][k][2] = mod->pi[j][1][k];
-            bufferlef_to_rig[j][k][3] = mod->u[j][1][k];
+            bufferlef_to_rig[j][k][1] = mod.rho[j, 1, k];
+            bufferlef_to_rig[j][k][2] = mod.pi[j, 1, k];
+            bufferlef_to_rig[j][k][3] = mod.u[j, 1, k];
             if (gv->L) {
-                bufferlef_to_rig[j][k][4] = mod->taus[j][1][k];
-                bufferlef_to_rig[j][k][5] = mod->taup[j][1][k];
+                bufferlef_to_rig[j][k][4] = mod.taus[j, 1, k];
+                bufferlef_to_rig[j][k][5] = mod.taup[j, 1, k];
             }
         }
     }
@@ -134,12 +134,12 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of right edge of local volume into buffer */
-            bufferrig_to_lef[j][k][1] = mod->rho[j][gv->NX][k];
-            bufferrig_to_lef[j][k][2] = mod->pi[j][gv->NX][k];
-            bufferrig_to_lef[j][k][3] = mod->u[j][gv->NX][k];
+            bufferrig_to_lef[j][k][1] = mod.rho[j, gv->NX, k];
+            bufferrig_to_lef[j][k][2] = mod.pi[j, gv->NX, k];
+            bufferrig_to_lef[j][k][3] = mod.u[j, gv->NX, k];
             if (gv->L) {
-                bufferrig_to_lef[j][k][4] = mod->taus[j][gv->NX][k];
-                bufferrig_to_lef[j][k][5] = mod->taup[j][gv->NX][k];
+                bufferrig_to_lef[j][k][4] = mod.taus[j, gv->NX, k];
+                bufferrig_to_lef[j][k][5] = mod.taup[j, gv->NX, k];
             }
         }
     }
@@ -157,24 +157,24 @@ void matcopy(st_model *mod, GlobVar *gv)
 
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][1];
-            mod->pi[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][2];
-            mod->u[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][3];
+            mod.rho[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][1];
+            mod.pi[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][2];
+            mod.u[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][3];
             if (gv->L) {
-                mod->taus[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][4];
-                mod->taup[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][5];
+                mod.taus[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][4];
+                mod.taup[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][5];
             }
         }
     }
 
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[j][0][k] = bufferrig_to_lef[j][k][1];
-            mod->pi[j][0][k] = bufferrig_to_lef[j][k][2];
-            mod->u[j][0][k] = bufferrig_to_lef[j][k][3];
+            mod.rho[j, 0, k] = bufferrig_to_lef[j][k][1];
+            mod.pi[j, 0, k] = bufferrig_to_lef[j][k][2];
+            mod.u[j, 0, k] = bufferrig_to_lef[j][k][3];
             if (gv->L) {
-                mod->taus[j][0][k] = bufferrig_to_lef[j][k][4];
-                mod->taup[j][0][k] = bufferrig_to_lef[j][k][5];
+                mod.taus[j, 0, k] = bufferrig_to_lef[j][k][4];
+                mod.taup[j, 0, k] = bufferrig_to_lef[j][k][5];
             }
         }
     }
@@ -184,12 +184,12 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
             /* storage of front side of local volume into buffer */
-            bufferfro_to_bac[j][i][1] = mod->rho[j][i][1];
-            bufferfro_to_bac[j][i][2] = mod->pi[j][i][1];
-            bufferfro_to_bac[j][i][3] = mod->u[j][i][1];
+            bufferfro_to_bac[j][i][1] = mod.rho[j, i, 1];
+            bufferfro_to_bac[j][i][2] = mod.pi[j, i, 1];
+            bufferfro_to_bac[j][i][3] = mod.u[j, i, 1];
             if (gv->L) {
-                bufferfro_to_bac[j][i][4] = mod->taus[j][i][1];
-                bufferfro_to_bac[j][i][5] = mod->taup[j][i][1];
+                bufferfro_to_bac[j][i][4] = mod.taus[j, i, 1];
+                bufferfro_to_bac[j][i][5] = mod.taup[j, i, 1];
             }
         }
     }
@@ -197,12 +197,12 @@ void matcopy(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
             /* storage of back side of local volume into buffer */
-            bufferbac_to_fro[j][i][1] = mod->rho[j][i][gv->NZ];
-            bufferbac_to_fro[j][i][2] = mod->pi[j][i][gv->NZ];
-            bufferbac_to_fro[j][i][3] = mod->u[j][i][gv->NZ];
+            bufferbac_to_fro[j][i][1] = mod.rho[j, i, gv->NZ];
+            bufferbac_to_fro[j][i][2] = mod.pi[j, i, gv->NZ];
+            bufferbac_to_fro[j][i][3] = mod.u[j, i, gv->NZ];
             if (gv->L) {
-                bufferbac_to_fro[j][i][4] = mod->taus[j][i][gv->NZ];
-                bufferbac_to_fro[j][i][5] = mod->taup[j][i][gv->NZ];
+                bufferbac_to_fro[j][i][4] = mod.taus[j, i, gv->NZ];
+                bufferbac_to_fro[j][i][5] = mod.taup[j, i, gv->NZ];
             }
         }
     }
@@ -220,24 +220,24 @@ void matcopy(st_model *mod, GlobVar *gv)
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
-            mod->rho[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][1];
-            mod->pi[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][2];
-            mod->u[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][3];
+            mod.rho[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][1];
+            mod.pi[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][2];
+            mod.u[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][3];
             if (gv->L) {
-                mod->taus[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][4];
-                mod->taup[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][5];
+                mod.taus[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][4];
+                mod.taup[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][5];
             }
         }
     }
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
-            mod->rho[j][i][0] = bufferbac_to_fro[j][i][1];
-            mod->pi[j][i][0] = bufferbac_to_fro[j][i][2];
-            mod->u[j][i][0] = bufferbac_to_fro[j][i][3];
+            mod.rho[j, i, 0] = bufferbac_to_fro[j][i][1];
+            mod.pi[j, i, 0] = bufferbac_to_fro[j][i][2];
+            mod.u[j, i, 0] = bufferbac_to_fro[j][i][3];
             if (gv->L) {
-                mod->taus[j][i][0] = bufferbac_to_fro[j][i][4];
-                mod->taup[j][i][0] = bufferbac_to_fro[j][i][5];
+                mod.taus[j, i, 0] = bufferbac_to_fro[j][i][4];
+                mod.taup[j, i, 0] = bufferbac_to_fro[j][i][5];
             }
         }
     }
diff --git a/src/matcopy_acoustic.cpp b/src/matcopy_acoustic.cpp
index 8ccc40d639ad7795dfc2dad2a79741b88d3d4086..7dc2832277c3bfbb331e2be561d6d173fad6fe8f 100644
--- a/src/matcopy_acoustic.cpp
+++ b/src/matcopy_acoustic.cpp
@@ -29,7 +29,7 @@
 #include "fd.hpp"
 #include "util.hpp"
 
-void matcopy_acoustic(st_model *mod, GlobVar *gv)
+void matcopy_acoustic(st_model &mod, GlobVar *gv)
 {
     MPI_Status status;
     //double time1=0.0, time2=0.0;
@@ -56,11 +56,11 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of top of local volume into buffer */
-            buffertop_to_bot[i][k][1] = mod->rho[1][i][k];
-            buffertop_to_bot[i][k][2] = mod->pi[1][i][k];
+            buffertop_to_bot[i][k][1] = mod.rho[1, i, k];
+            buffertop_to_bot[i][k][2] = mod.pi[1, i, k];
 
             if (gv->L) {
-                buffertop_to_bot[i][k][3] = mod->taup[1][i][k];
+                buffertop_to_bot[i][k][3] = mod.taup[1, i, k];
             }
         }
     }
@@ -68,11 +68,11 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of bottom of local volume into buffer */
-            bufferbot_to_top[i][k][1] = mod->rho[gv->NY][i][k];
-            bufferbot_to_top[i][k][2] = mod->pi[gv->NY][i][k];
+            bufferbot_to_top[i][k][1] = mod.rho[gv->NY, i, k];
+            bufferbot_to_top[i][k][2] = mod.pi[gv->NY, i, k];
 
             if (gv->L) {
-                bufferbot_to_top[i][k][3] = mod->taup[gv->NY][i][k];
+                bufferbot_to_top[i][k][3] = mod.taup[gv->NY, i, k];
             }
         }
     }
@@ -90,20 +90,20 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[gv->NY + 1][i][k] = buffertop_to_bot[i][k][1];
-            mod->pi[gv->NY + 1][i][k] = buffertop_to_bot[i][k][2];
+            mod.rho[gv->NY + 1, i, k] = buffertop_to_bot[i][k][1];
+            mod.pi[gv->NY + 1, i, k] = buffertop_to_bot[i][k][2];
             if (gv->L) {
-                mod->taup[gv->NY + 1][i][k] = buffertop_to_bot[i][k][3];
+                mod.taup[gv->NY + 1, i, k] = buffertop_to_bot[i][k][3];
             }
         }
     }
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[0][i][k] = bufferbot_to_top[i][k][1];
-            mod->pi[0][i][k] = bufferbot_to_top[i][k][2];
+            mod.rho[0, i, k] = bufferbot_to_top[i][k][1];
+            mod.pi[0, i, k] = bufferbot_to_top[i][k][2];
             if (gv->L) {
-                mod->taup[0][i][k] = bufferbot_to_top[i][k][3];
+                mod.taup[0, i, k] = bufferbot_to_top[i][k][3];
             }
         }
     }
@@ -113,10 +113,10 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of left edge of local volume into buffer */
-            bufferlef_to_rig[j][k][1] = mod->rho[j][1][k];
-            bufferlef_to_rig[j][k][2] = mod->pi[j][1][k];
+            bufferlef_to_rig[j][k][1] = mod.rho[j, 1, k];
+            bufferlef_to_rig[j][k][2] = mod.pi[j, 1, k];
             if (gv->L) {
-                bufferlef_to_rig[j][k][3] = mod->taup[j][1][k];
+                bufferlef_to_rig[j][k][3] = mod.taup[j, 1, k];
             }
         }
     }
@@ -124,10 +124,10 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
             /* storage of right edge of local volume into buffer */
-            bufferrig_to_lef[j][k][1] = mod->rho[j][gv->NX][k];
-            bufferrig_to_lef[j][k][2] = mod->pi[j][gv->NX][k];
+            bufferrig_to_lef[j][k][1] = mod.rho[j, gv->NX, k];
+            bufferrig_to_lef[j][k][2] = mod.pi[j, gv->NX, k];
             if (gv->L) {
-                bufferrig_to_lef[j][k][3] = mod->taup[j][gv->NX][k];
+                bufferrig_to_lef[j][k][3] = mod.taup[j, gv->NX, k];
             }
         }
     }
@@ -145,20 +145,20 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
 
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][1];
-            mod->pi[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][2];
+            mod.rho[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][1];
+            mod.pi[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][2];
             if (gv->L) {
-                mod->taup[j][gv->NX + 1][k] = bufferlef_to_rig[j][k][3];
+                mod.taup[j, gv->NX + 1, k] = bufferlef_to_rig[j][k][3];
             }
         }
     }
 
     for (j = 0; j <= gv->NY + 1; j++) {
         for (k = 0; k <= gv->NZ + 1; k++) {
-            mod->rho[j][0][k] = bufferrig_to_lef[j][k][1];
-            mod->pi[j][0][k] = bufferrig_to_lef[j][k][2];
+            mod.rho[j, 0, k] = bufferrig_to_lef[j][k][1];
+            mod.pi[j, 0, k] = bufferrig_to_lef[j][k][2];
             if (gv->L) {
-                mod->taup[j][0][k] = bufferrig_to_lef[j][k][3];
+                mod.taup[j, 0, k] = bufferrig_to_lef[j][k][3];
             }
         }
     }
@@ -168,10 +168,10 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
             /* storage of front side of local volume into buffer */
-            bufferfro_to_bac[j][i][1] = mod->rho[j][i][1];
-            bufferfro_to_bac[j][i][2] = mod->pi[j][i][1];
+            bufferfro_to_bac[j][i][1] = mod.rho[j, i, 1];
+            bufferfro_to_bac[j][i][2] = mod.pi[j, i, 1];
             if (gv->L) {
-                bufferfro_to_bac[j][i][3] = mod->taup[j][i][1];
+                bufferfro_to_bac[j][i][3] = mod.taup[j, i, 1];
             }
         }
     }
@@ -179,10 +179,10 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
             /* storage of back side of local volume into buffer */
-            bufferbac_to_fro[j][i][1] = mod->rho[j][i][gv->NZ];
-            bufferbac_to_fro[j][i][2] = mod->pi[j][i][gv->NZ];
+            bufferbac_to_fro[j][i][1] = mod.rho[j, i, gv->NZ];
+            bufferbac_to_fro[j][i][2] = mod.pi[j, i, gv->NZ];
             if (gv->L) {
-                bufferbac_to_fro[j][i][3] = mod->taup[j][i][gv->NZ];
+                bufferbac_to_fro[j][i][3] = mod.taup[j, i, gv->NZ];
             }
         }
     }
@@ -200,20 +200,20 @@ void matcopy_acoustic(st_model *mod, GlobVar *gv)
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
-            mod->rho[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][1];
-            mod->pi[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][2];
+            mod.rho[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][1];
+            mod.pi[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][2];
             if (gv->L) {
-                mod->taup[j][i][gv->NZ + 1] = bufferfro_to_bac[j][i][3];
+                mod.taup[j, i, gv->NZ + 1] = bufferfro_to_bac[j][i][3];
             }
         }
     }
 
     for (i = 0; i <= gv->NX + 1; i++) {
         for (j = 0; j <= gv->NY + 1; j++) {
-            mod->rho[j][i][0] = bufferbac_to_fro[j][i][1];
-            mod->pi[j][i][0] = bufferbac_to_fro[j][i][2];
+            mod.rho[j, i, 0] = bufferbac_to_fro[j][i][1];
+            mod.pi[j, i, 0] = bufferbac_to_fro[j][i][2];
             if (gv->L) {
-                mod->taup[j][i][0] = bufferbac_to_fro[j][i][3];
+                mod.taup[j, i, 0] = bufferbac_to_fro[j][i][3];
             }
         }
     }
diff --git a/src/model2_5D.cpp b/src/model2_5D.cpp
index 68dfb57d7e827b5ded1b0aa56703180dfa0b41c8..ba069b26b7e00e07da3f1a4df5b8da3437647b35 100644
--- a/src/model2_5D.cpp
+++ b/src/model2_5D.cpp
@@ -25,7 +25,7 @@
 
 #include "fd.hpp"
 
-void model2_5(st_model *mod)
+void model2_5(st_model &mod)
 {
     /*--------------------------------------------------------------------------*/
     /* extern variables */
@@ -40,21 +40,21 @@ void model2_5(st_model *mod)
     for (j = 1; j <= NYG; j++) {
         for (i = 1; i <= NXG; i++) {
             if (L) {
-                ts = mod->taus[j][i][100];
-                tp = mod->taup[j][i][100];
+                ts = mod.taus[j, i, 100];
+                tp = mod.taup[j, i, 100];
             }
-            muv = mod->u[j][i][100];
-            Rho = mod->rho[j][i][100];
-            piv = mod->pi[j][i][100];
+            muv = mod.u[j, i, 100];
+            Rho = mod.rho[j, i, 100];
+            piv = mod.pi[j, i, 100];
             for (k = 1; k <= NZG; k++) {
                 if (L) {
-                    mod->taus[j][i][k] = ts;
-                    mod->taup[j][i][k] = tp;
+                    mod.taus[j, i, k] = ts;
+                    mod.taup[j, i, k] = tp;
                 }
 
-                mod->u[j][i][k] = muv;
-                mod->rho[j][i][k] = Rho;
-                mod->pi[j][i][k] = piv;
+                mod.u[j, i, k] = muv;
+                mod.rho[j, i, k] = Rho;
+                mod.pi[j, i, k] = piv;
             }
         }
     }
diff --git a/src/modelupdate.cpp b/src/modelupdate.cpp
index 0b4e867fa2c3ae74787a3b3728ed58d007671641..2c228078a5e21d19e2ecc24a512d8f1cc670d28e 100644
--- a/src/modelupdate.cpp
+++ b/src/modelupdate.cpp
@@ -25,7 +25,7 @@
 #include "fd.hpp"
 #include "logging.hpp"
 
-void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, GlobVar *gv)
+void modelupdate(st_gradient *grad, st_model &mod, float step, int it_group, GlobVar *gv)
 {
     int j, i, k, l, l1;
     float vpnew, vsnew, rhonew, vpstart, vsstart;
@@ -66,15 +66,15 @@ void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, Glo
             for (k = 1; k <= gv->NZ; k++) {
                 vp = 0.0;
                 vs = 0.0;
-                vp = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
-                vs = sqrt(mod->u[j][i][k] / mod->rho[j][i][k]);
+                vp = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
+                vs = sqrt(mod.u[j, i, k] / mod.rho[j, i, k]);
 
                 if (vp > max[0])
                     max[0] = vp;
                 if (vs > max[1])
                     max[1] = vs;
-                if (mod->rho[j][i][k] > max[2])
-                    max[2] = mod->rho[j][i][k];
+                if (mod.rho[j, i, k] > max[2])
+                    max[2] = mod.rho[j, i, k];
             }
         }
     }
@@ -157,8 +157,8 @@ void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, Glo
             for (k = 1; k <= gv->NZ; k++) {
                 /*update model */
                 vpnew = 0.0;
-                vpstart = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
-                /*vpnew=sqrt(mod->pi[j][i][k]/mod->rho[j][i][k])+max[0]*step*gradconvp[j][i][k]; */
+                vpstart = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
+                /*vpnew=sqrt(mod.pi[j, i, k]/mod.rho[j, i, k])+max[0]*step*gradconvp[j][i][k]; */
                 vpnew = vpstart + step * scale1 *
                         grad->vp[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] *
                         gv->VP0;
@@ -182,8 +182,8 @@ void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, Glo
                 }
 
                 vsnew = 0.0;
-                vsstart = sqrt(mod->u[j][i][k] / mod->rho[j][i][k]);
-                /*vsnew=sqrt(mod->u[j][i][k]/mod->rho[j][i][k])+max[1]*step*gradconvs[j][i][k]; */
+                vsstart = sqrt(mod.u[j, i, k] / mod.rho[j, i, k]);
+                /*vsnew=sqrt(mod.u[j, i, k]/mod.rho[j, i, k])+max[1]*step*gradconvs[j][i][k]; */
                 vsnew = vsstart + step * scale2 *
                         grad->vs[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] *
                         gv->VS0;
@@ -207,24 +207,24 @@ void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, Glo
                 }
 
                 rhonew = 0.0;
-                rhonew = mod->rho[j][i][k] + scale3 * step *
+                rhonew = mod.rho[j, i, k] + scale3 * step *
                          grad->rho[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] *
                          gv->RHO0;
                 if (gv->RHOMIN > 0 && rhonew < gv->RHOMIN) {
-                    if (gv->RHOMIN <= mod->rho[j][i][k]) {
+                    if (gv->RHOMIN <= mod.rho[j, i, k]) {
                         rhonew = gv->RHOMIN;
                     } else {
-                        if (rhonew <= mod->rho[j][i][k]) {
-                            rhonew = mod->rho[j][i][k];
+                        if (rhonew <= mod.rho[j, i, k]) {
+                            rhonew = mod.rho[j, i, k];
                         }
                     }
                 }
                 if (gv->RHOMAX > 0 && rhonew > gv->RHOMAX) {
-                    if (gv->RHOMAX >= mod->rho[j][i][k]) {
+                    if (gv->RHOMAX >= mod.rho[j, i, k]) {
                         rhonew = gv->RHOMAX;
                     } else {
-                        if (rhonew >= mod->rho[j][i][k]) {
-                            rhonew = mod->rho[j][i][k];
+                        if (rhonew >= mod.rho[j, i, k]) {
+                            rhonew = mod.rho[j, i, k];
                         }
                     }
                 }
@@ -233,15 +233,15 @@ void modelupdate(st_gradient *grad, st_model *mod, float step, int it_group, Glo
                     /*save normalised model differences for gv->LBFGS */
                     l++;
                     l1++;
-                    grad->bfgsmod[w][l] = (vpnew - sqrt(mod->pi[j][i][k] / mod->rho[j][i][k])) / gv->VP0;
+                    grad->bfgsmod[w][l] = (vpnew - sqrt(mod.pi[j, i, k] / mod.rho[j, i, k])) / gv->VP0;
                     if (gv->NUMPAR > 1) {
-                        grad->bfgsmod[w][l1] = (vsnew - sqrt(mod->u[j][i][k] / mod->rho[j][i][k])) / gv->VS0;
+                        grad->bfgsmod[w][l1] = (vsnew - sqrt(mod.u[j, i, k] / mod.rho[j, i, k])) / gv->VS0;
                     }
                 }
 
-                mod->u[j][i][k] = rhonew * vsnew * vsnew;
-                mod->pi[j][i][k] = rhonew * vpnew * vpnew;
-                mod->rho[j][i][k] = rhonew;
+                mod.u[j, i, k] = rhonew * vsnew * vsnew;
+                mod.pi[j, i, k] = rhonew * vpnew * vpnew;
+                mod.rho[j, i, k] = rhonew;
             }
         }
     }
diff --git a/src/modelupdate_acoustic.cpp b/src/modelupdate_acoustic.cpp
index 37108cad93fab80c2a037e03694a31acc99d6b92..9d5a43d49ad41667b42e981b0b8fc77645e13842 100644
--- a/src/modelupdate_acoustic.cpp
+++ b/src/modelupdate_acoustic.cpp
@@ -25,7 +25,7 @@
 #include "fd.hpp"
 #include "logging.hpp"
 
-void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_group, GlobVar *gv)
+void modelupdate_acoustic(st_gradient *grad, st_model &mod, float step, int it_group, GlobVar *gv)
 {
     int j, i, k, l; // l1;
     float vpnew, rhonew, vpstart;
@@ -57,12 +57,12 @@ void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_g
         for (i = 1; i <= gv->NX; i++) {
             for (k = 1; k <= gv->NZ; k++) {
                 vp = 0.0;
-                vp = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
+                vp = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
 
                 if (vp > max[0])
                     max[0] = vp;
-                if (mod->rho[j][i][k] > max[1])
-                    max[1] = mod->rho[j][i][k];
+                if (mod.rho[j, i, k] > max[1])
+                    max[1] = mod.rho[j, i, k];
             }
         }
     }
@@ -129,8 +129,8 @@ void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_g
             for (k = 1; k <= gv->NZ; k++) {
                 /*update model */
                 vpnew = 0.0;
-                vpstart = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
-                /*vpnew=sqrt(mod->pi[j][i][k]/mod->rho[j][i][k])+max[0]*step*gradconvp[j][i][k]; */
+                vpstart = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
+                /*vpnew=sqrt(mod.pi[j, i, k]/mod.rho[j, i, k])+max[0]*step*gradconvp[j][i][k]; */
                 vpnew = vpstart + step * scale1 *
                         grad->vp[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] *
                         gv->VP0;
@@ -154,24 +154,24 @@ void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_g
                 }
 
                 rhonew = 0.0;
-                rhonew = mod->rho[j][i][k] + scale3 * step *
+                rhonew = mod.rho[j, i, k] + scale3 * step *
                          grad->rho[j + gv->SMOOTH_LENGTH_DY][i + gv->SMOOTH_LENGTH_DX][k + gv->SMOOTH_LENGTH_DZ] *
                          gv->RHO0;
                 if (gv->RHOMIN > 0 && rhonew < gv->RHOMIN) {
-                    if (gv->RHOMIN <= mod->rho[j][i][k]) {
+                    if (gv->RHOMIN <= mod.rho[j, i, k]) {
                         rhonew = gv->RHOMIN;
                     } else {
-                        if (rhonew <= mod->rho[j][i][k]) {
-                            rhonew = mod->rho[j][i][k];
+                        if (rhonew <= mod.rho[j, i, k]) {
+                            rhonew = mod.rho[j, i, k];
                         }
                     }
                 }
                 if (gv->RHOMAX > 0 && rhonew > gv->RHOMAX) {
-                    if (gv->RHOMAX >= mod->rho[j][i][k]) {
+                    if (gv->RHOMAX >= mod.rho[j, i, k]) {
                         rhonew = gv->RHOMAX;
                     } else {
-                        if (rhonew >= mod->rho[j][i][k]) {
-                            rhonew = mod->rho[j][i][k];
+                        if (rhonew >= mod.rho[j, i, k]) {
+                            rhonew = mod.rho[j, i, k];
                         }
                     }
                 }
@@ -180,11 +180,11 @@ void modelupdate_acoustic(st_gradient *grad, st_model *mod, float step, int it_g
                     /*save normalised model differences for gv->LBFGS */
                     l++;
                     // l1++;
-                    grad->bfgsmod[w][l] = (vpnew - sqrt(mod->pi[j][i][k] / mod->rho[j][i][k])) / gv->VP0;
+                    grad->bfgsmod[w][l] = (vpnew - sqrt(mod.pi[j, i, k] / mod.rho[j, i, k])) / gv->VP0;
                 }
 
-                mod->pi[j][i][k] = rhonew * vpnew * vpnew;
-                mod->rho[j][i][k] = rhonew;
+                mod.pi[j, i, k] = rhonew * vpnew * vpnew;
+                mod.rho[j, i, k] = rhonew;
             }
         }
     }
diff --git a/src/outmod.cpp b/src/outmod.cpp
index 4984e3d5a2b87bfcab303547fbbb8c5660ff1007..cbe48d26a48b1ffa6516593a5d75bfaec92fdcec 100644
--- a/src/outmod.cpp
+++ b/src/outmod.cpp
@@ -24,7 +24,7 @@
 
 #include "fd.hpp"
 
-void outmod(const st_model *mod, int iteration, GlobVar *gv)
+void outmod(const st_model &mod, int iteration, GlobVar *gv)
 {
     FILE *fpmod1, *fpmod2, *fpmod3;
 
@@ -47,9 +47,9 @@ void outmod(const st_model *mod, int iteration, GlobVar *gv)
         for (k = 1; k <= gv->NZ; k++) {
             for (i = 1; i <= gv->NX; i++) {
                 for (j = 1; j <= gv->NY; j++) {
-                    vp = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
+                    vp = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
                     fwrite(&vp, sizeof(float), 1, fpmod1);
-                    fwrite(&mod->rho[j][i][k], sizeof(float), 1, fpmod3);
+                    fwrite(&mod.rho[j, i, k], sizeof(float), 1, fpmod3);
                 }
             }
         }
@@ -63,7 +63,7 @@ void outmod(const st_model *mod, int iteration, GlobVar *gv)
             for (k = 1; k <= gv->NZ; k++) {
                 for (i = 1; i <= gv->NX; i++) {
                     for (j = 1; j <= gv->NY; j++) {
-                        vs = sqrt(mod->u[j][i][k] / mod->rho[j][i][k]);
+                        vs = sqrt(mod.u[j, i, k] / mod.rho[j, i, k]);
                         fwrite(&vs, sizeof(float), 1, fpmod2);
                     }
                 }
@@ -99,7 +99,7 @@ void outmod(const st_model *mod, int iteration, GlobVar *gv)
             for (k = 1; k <= gv->NZ; k++) {
                 for (i = 1; i <= gv->NX; i++) {
                     for (j = 1; j <= gv->NY; j++) {
-                        vp = sqrt(mod->pi[j][i][k] / mod->rho[j][i][k]);
+                        vp = sqrt(mod.pi[j, i, k] / mod.rho[j, i, k]);
                         fwrite(&vp, sizeof(float), 1, fpmod1);
                     }
                 }
@@ -125,7 +125,7 @@ void outmod(const st_model *mod, int iteration, GlobVar *gv)
             for (k = 1; k <= gv->NZ; k++) {
                 for (i = 1; i <= gv->NX; i++) {
                     for (j = 1; j <= gv->NY; j++) {
-                        vs = sqrt(mod->u[j][i][k] / mod->rho[j][i][k]);
+                        vs = sqrt(mod.u[j, i, k] / mod.rho[j, i, k]);
                         fwrite(&vs, sizeof(float), 1, fpmod2);
                     }
                 }
@@ -151,7 +151,7 @@ void outmod(const st_model *mod, int iteration, GlobVar *gv)
             for (k = 1; k <= gv->NZ; k++) {
                 for (i = 1; i <= gv->NX; i++) {
                     for (j = 1; j <= gv->NY; j++) {
-                        fwrite(&mod->rho[j][i][k], sizeof(float), 1, fpmod3);
+                        fwrite(&mod.rho[j, i, k], sizeof(float), 1, fpmod3);
                     }
                 }
             }
diff --git a/src/psource.cpp b/src/psource.cpp
index dc89c65344b86c70da0d554b0d2d0ad0e1428159..d22f0c17744d60c02bc9049925e6df0312830fe7 100644
--- a/src/psource.cpp
+++ b/src/psource.cpp
@@ -23,7 +23,7 @@
 
 #include "fd.hpp"
 
-void psource(int nt, st_stress *stress, float **srcpos_loc, float **signals, int nsrc, const GlobVar *gv, int sw)
+void psource(int nt, st_stress &stress, float **srcpos_loc, float **signals, int nsrc, const GlobVar *gv, int sw)
 {
     /* adding source wavelet to stress components *
     * (explosive source) at source points        */
@@ -34,11 +34,11 @@ void psource(int nt, st_stress *stress, float **srcpos_loc, float **signals, int
         if ((sw == 0 && (int)srcpos_loc[7][l] == 1) || (sw == 1)) {
             float amp = signals[l][nt];
             if (gv->WEQ == 2) {
-                stress->sp[j][i][k] += amp;
+                stress.sp[j, i, k] += amp;
             } else {
-                stress->sxx[j][i][k] += amp;
-                stress->syy[j][i][k] += amp;
-                stress->szz[j][i][k] += amp;
+                stress.sxx[j, i, k] += amp;
+                stress.syy[j, i, k] += amp;
+                stress.szz[j, i, k] += amp;
             }
         }
     }
diff --git a/src/readmod.cpp b/src/readmod.cpp
index 6e84b1700ab9ba8bf76ef0b5a0787ff13c5f018d..880c4df4610fd4d6d5b6b04ad6d992403af7605d 100644
--- a/src/readmod.cpp
+++ b/src/readmod.cpp
@@ -25,7 +25,7 @@
 #include "util.hpp"
 #include "logging.hpp"
 
-void readmod(st_model *mod, GlobVar *gv)
+void readmod(st_model &mod, GlobVar *gv)
 {
     float rhov, vp, vs = 0.0;
     float *pts = NULL, tp = 0.0, ts = 0.0, sumpi = 0.0, sumu = 0.0, ws;
@@ -43,7 +43,7 @@ void readmod(st_model *mod, GlobVar *gv)
         pts = vector(1, gv->L);
         for (int l = 1; l <= gv->L; l++) {
             pts[l] = 1.0f / (2.0f * PI * gv->FL[l]);
-            mod->eta[l] = gv->DT / pts[l];
+            mod.eta[l] = gv->DT / pts[l];
         }
 
         tp = gv->TAU;
@@ -180,15 +180,15 @@ void readmod(st_model *mod, GlobVar *gv)
                     ii = i - gv->POS[1] * gv->NX;
                     jj = j - gv->POS[2] * gv->NY;
                     kk = k - gv->POS[3] * gv->NZ;
-                    mod->rho[jj][ii][kk] = rhov;
-                    mod->pi[jj][ii][kk] = vp * vp * rhov / (1.0 + sumpi);
+                    mod.rho[jj, ii, kk] = rhov;
+                    mod.pi[jj, ii, kk] = vp * vp * rhov / (1.0 + sumpi);
                     if (gv->WEQ != 2) {
-                        mod->u[jj][ii][kk] = vs * vs * rhov / (1.0 + sumu);
+                        mod.u[jj, ii, kk] = vs * vs * rhov / (1.0 + sumu);
                     }
                     if (gv->L) {
-                        mod->taup[jj][ii][kk] = tp;
+                        mod.taup[jj, ii, kk] = tp;
                         if (gv->WEQ != 2) {
-                            mod->taus[jj][ii][kk] = ts;
+                            mod.taus[jj, ii, kk] = ts;
                         }
                     }
                 }
diff --git a/src/scan_topo.cpp b/src/scan_topo.cpp
index 2aa7ca43a0e8646ea437d81fb9cae0ce7d613bb9..9391490b19c16eaeac1fd35299ff1a3661c72776 100644
--- a/src/scan_topo.cpp
+++ b/src/scan_topo.cpp
@@ -28,7 +28,6 @@
 #include "util.hpp"
 #include <unistd.h>
 #include <cstdbool>
-#include <cfloat>
 
 int **scan_topo(GlobVar *gv)
 {
diff --git a/src/seismo_ssg.cpp b/src/seismo_ssg.cpp
index 27c3dcf9a1104bda36ac77c557d3397393c507a3..88602a5c79c8e1e0e20973dd719989b7f7116ffd 100644
--- a/src/seismo_ssg.cpp
+++ b/src/seismo_ssg.cpp
@@ -25,7 +25,7 @@
 #include "fd.hpp"
 
 void seismo(int nt, int ntr, int **recpos, st_seismogram *section,
-            st_velocity *vel, st_stress *stress, st_model *mod, const GlobVar *gv)
+            st_velocity &vel, st_stress &stress, st_model &mod, const GlobVar *gv)
 {
     int i, j, k, itr;
     float amp, dh24x, dh24y, dh24z, vyx, vxy, vxx, vyy, vzx, vyz, vxz, vzy, vzz;
@@ -46,9 +46,9 @@ void seismo(int nt, int ntr, int **recpos, st_seismogram *section,
                 section->vy[itr][0] = 0.0f;
                 section->vz[itr][0] = 0.0f;
             }
-            section->vx[itr][nt] = vel->vx[nyrec][nxrec][nzrec];
-            section->vy[itr][nt] = vel->vy[nyrec][nxrec][nzrec];
-            section->vz[itr][nt] = vel->vz[nyrec][nxrec][nzrec];
+            section->vx[itr][nt] = vel.vx[nyrec, nxrec, nzrec];
+            section->vy[itr][nt] = vel.vy[nyrec, nxrec, nzrec];
+            section->vz[itr][nt] = vel.vz[nyrec, nxrec, nzrec];
             break;
         case 2:
             if (nt == 1) {
@@ -56,11 +56,11 @@ void seismo(int nt, int ntr, int **recpos, st_seismogram *section,
                 section->p[itr][0] = 0.0f;
             }
             if (gv->WEQ != 2) {
-                section->p[itr][nt] = (-stress->sxx[nyrec][nxrec][nzrec]
-                                       - stress->syy[nyrec][nxrec][nzrec]
-                                       - stress->szz[nyrec][nxrec][nzrec]) / 3.0;
+                section->p[itr][nt] = (-stress.sxx[nyrec, nxrec, nzrec]
+                                       - stress.syy[nyrec, nxrec, nzrec]
+                                       - stress.szz[nyrec, nxrec, nzrec]) / 3.0;
             } else {
-                section->p[itr][nt] = -stress->sp[nyrec][nxrec][nzrec];
+                section->p[itr][nt] = -stress.sp[nyrec, nxrec, nzrec];
             }
             break;
         case 3:
@@ -73,34 +73,34 @@ void seismo(int nt, int ntr, int **recpos, st_seismogram *section,
             j = nyrec;
             k = nzrec;
             if (gv->WEQ != 2) {
-                /*vxy=(-vel->vx[j+2][i][k]+27.0*(vel->vx[j+1][i][k]-vel->vx[j][i][k])+vel->vx[j-1][i][k])*(24.0*gv->DY);
-                 * vxz=(-vel->vx[j][i][k+2]+27.0*(vel->vx[j][i][k+1]-vel->vx[j][i][k])+vel->vx[j][i][k-1])*(24.0*gv->DZ);
-                 * vyx=(-vel->vy[j][i+2][k]+27.0*(vel->vy[j][i+1][k]-vel->vy[j][i][k])+vel->vy[j][i-1][k])*(24.0*gv->DX);
-                 * vyz=(-vel->vy[j][i][k+2]+27.0*(vel->vy[j][i][k+1]-vel->vy[j][i][k])+vel->vy[j][i][k-1])*(24.0*gv->DZ);
-                 * vzx=(-vel->vz[j][i+2][k]+27.0*(vel->vz[j][i+1][k]-vel->vz[j][i][k])+vel->vz[j][i-1][k])*(24.0*gv->DX);
-                 * vzy=(-vel->vz[j+2][i][k]+27.0*(vel->vz[j+1][i][k]-vel->vz[j][i][k])+vel->vz[j-1][i][k])*(24.0*gv->DY); */
-
-                vxy = (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) * (dh24y);
-                vxz = (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) * (dh24z);
-                vyx = (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) * (dh24x);
-                vyz = (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) * (dh24z);
-                vzx = (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) * (dh24x);
-                vzy = (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) * (dh24y);
-
-                amp = mod->u[j][i][k] * ((vyz - vzy) * fabs(vyz - vzy) +
+                /*vxy=(-vel.vx[j+2, i, k]+27.0*(vel.vx[j+1, i, k]-vel.vx[j, i, k])+vel.vx[j-1, i, k])*(24.0*gv->DY);
+                 * vxz=(-vel.vx[j, i, k+2]+27.0*(vel.vx[j, i, k+1]-vel.vx[j, i, k])+vel.vx[j, i, k-1])*(24.0*gv->DZ);
+                 * vyx=(-vel.vy[j, i+2, k]+27.0*(vel.vy[j, i+1, k]-vel.vy[j, i, k])+vel.vy[j, i-1, k])*(24.0*gv->DX);
+                 * vyz=(-vel.vy[j, i, k+2]+27.0*(vel.vy[j, i, k+1]-vel.vy[j, i, k])+vel.vy[j, i, k-1])*(24.0*gv->DZ);
+                 * vzx=(-vel.vz[j, i+2, k]+27.0*(vel.vz[j, i+1, k]-vel.vz[j, i, k])+vel.vz[j, i-1, k])*(24.0*gv->DX);
+                 * vzy=(-vel.vz[j+2, i, k]+27.0*(vel.vz[j+1, i, k]-vel.vz[j, i, k])+vel.vz[j-1, i, k])*(24.0*gv->DY); */
+
+                vxy = (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) * (dh24y);
+                vxz = (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) * (dh24z);
+                vyx = (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) * (dh24x);
+                vyz = (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) * (dh24z);
+                vzx = (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) * (dh24x);
+                vzy = (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) * (dh24y);
+
+                amp = mod.u[j, i, k] * ((vyz - vzy) * fabs(vyz - vzy) +
                                          (vzx - vxz) * fabs(vzx - vxz) + (vxy - vyx) * fabs(vxy - vyx));
                 section->curl[itr][nt] = fsign(amp) * sqrt(fabs(amp));
             }
 
-            /*vxx=(-vel->vx[j][i+1][k]+27.0*(vel->vx[j][i][k]-vel->vx[j][i-1][k])+vel->vx[j][i-2][k])*(24.0*gv->DX);
-             * vyy=(-vel->vy[j+1][i][k]+27.0*(vel->vy[j][i][k]-vel->vy[j-1][i][k])+vel->vy[j-2][i][k])*(24.0*gv->DY);
-             * vzz=(-vel->vz[j][i][k+1]+27.0*(vel->vz[j][i][k]-vel->vz[j][i][k-1])+vel->vz[j][i][k-2])*(24.0*gv->DZ); */
+            /*vxx=(-vel.vx[j, i+1, k]+27.0*(vel.vx[j, i, k]-vel.vx[j, i-1, k])+vel.vx[j, i-2, k])*(24.0*gv->DX);
+             * vyy=(-vel.vy[j+1, i, k]+27.0*(vel.vy[j, i, k]-vel.vy[j-1, i, k])+vel.vy[j-2, i, k])*(24.0*gv->DY);
+             * vzz=(-vel.vz[j, i, k+1]+27.0*(vel.vz[j, i, k]-vel.vz[j, i, k-1])+vel.vz[j, i, k-2])*(24.0*gv->DZ); */
 
-            vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * (dh24x);
-            vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * (dh24y);
-            vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * (dh24z);
+            vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * (dh24x);
+            vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * (dh24y);
+            vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * (dh24z);
 
-            section->div[itr][nt] = (vxx + vyy + vzz) * sqrt(mod->pi[j][i][k]);
+            section->div[itr][nt] = (vxx + vyy + vzz) * sqrt(mod.pi[j, i, k]);
 
             break;
         case 4:
@@ -113,49 +113,49 @@ void seismo(int nt, int ntr, int **recpos, st_seismogram *section,
                 section->div[itr][0] = 0.0f;
                 section->curl[itr][0] = 0.0f;
             }
-            section->vx[itr][nt] = vel->vx[nyrec][nxrec][nzrec];
-            section->vy[itr][nt] = vel->vy[nyrec][nxrec][nzrec];
-            section->vz[itr][nt] = vel->vz[nyrec][nxrec][nzrec];
+            section->vx[itr][nt] = vel.vx[nyrec, nxrec, nzrec];
+            section->vy[itr][nt] = vel.vy[nyrec, nxrec, nzrec];
+            section->vz[itr][nt] = vel.vz[nyrec, nxrec, nzrec];
             if (gv->WEQ != 2) {
-                section->p[itr][nt] = (-stress->sxx[nyrec][nxrec][nzrec]
-                                       - stress->syy[nyrec][nxrec][nzrec]
-                                       - stress->szz[nyrec][nxrec][nzrec]) / 3.0;
+                section->p[itr][nt] = (-stress.sxx[nyrec, nxrec, nzrec]
+                                       - stress.syy[nyrec, nxrec, nzrec]
+                                       - stress.szz[nyrec, nxrec, nzrec]) / 3.0;
             } else {
-                section->p[itr][nt] = -stress->sp[nyrec][nxrec][nzrec];
+                section->p[itr][nt] = -stress.sp[nyrec, nxrec, nzrec];
             }
             i = nxrec;
             j = nyrec;
             k = nzrec;
 
             if (gv->WEQ != 2) {
-                /*vxy=(-vel->vx[j+2][i][k]+27.0*(vel->vx[j+1][i][k]-vel->vx[j][i][k])+vel->vx[j-1][i][k])*(dh24y);
-                 * vxz=(-vel->vx[j][i][k+2]+27.0*(vel->vx[j][i][k+1]-vel->vx[j][i][k])+vel->vx[j][i][k-1])*(dh24z);
-                 * vyx=(-vel->vy[j][i+2][k]+27.0*(vel->vy[j][i+1][k]-vel->vy[j][i][k])+vel->vy[j][i-1][k])*(dh24x);
-                 * vyz=(-vel->vy[j][i][k+2]+27.0*(vel->vy[j][i][k+1]-vel->vy[j][i][k])+vel->vy[j][i][k-1])*(dh24z);
-                 * vzx=(-vel->vz[j][i+2][k]+27.0*(vel->vz[j][i+1][k]-vel->vz[j][i][k])+vel->vz[j][i-1][k])*(dh24x);
-                 * vzy=(-vel->vz[j+2][i][k]+27.0*(vel->vz[j+1][i][k]-vel->vz[j][i][k])+vel->vz[j-1][i][k])*(dh24y); */
-
-                vxy = (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) * (dh24y);
-                vxz = (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) * (dh24z);
-                vyx = (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) * (dh24x);
-                vyz = (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) * (dh24z);
-                vzx = (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) * (dh24x);
-                vzy = (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) * (dh24y);
-
-                amp = mod->u[j][i][k] * ((vyz - vzy) * fabs(vyz - vzy) +
+                /*vxy=(-vel.vx[j+2, i, k]+27.0*(vel.vx[j+1, i, k]-vel.vx[j, i, k])+vel.vx[j-1, i, k])*(dh24y);
+                 * vxz=(-vel.vx[j, i, k+2]+27.0*(vel.vx[j, i, k+1]-vel.vx[j, i, k])+vel.vx[j, i, k-1])*(dh24z);
+                 * vyx=(-vel.vy[j, i+2, k]+27.0*(vel.vy[j, i+1, k]-vel.vy[j, i, k])+vel.vy[j, i-1, k])*(dh24x);
+                 * vyz=(-vel.vy[j, i, k+2]+27.0*(vel.vy[j, i, k+1]-vel.vy[j, i, k])+vel.vy[j, i, k-1])*(dh24z);
+                 * vzx=(-vel.vz[j, i+2, k]+27.0*(vel.vz[j, i+1, k]-vel.vz[j, i, k])+vel.vz[j, i-1, k])*(dh24x);
+                 * vzy=(-vel.vz[j+2, i, k]+27.0*(vel.vz[j+1, i, k]-vel.vz[j, i, k])+vel.vz[j-1, i, k])*(dh24y); */
+
+                vxy = (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) * (dh24y);
+                vxz = (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) * (dh24z);
+                vyx = (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) * (dh24x);
+                vyz = (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) * (dh24z);
+                vzx = (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) * (dh24x);
+                vzy = (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) * (dh24y);
+
+                amp = mod.u[j, i, k] * ((vyz - vzy) * fabs(vyz - vzy) +
                                          (vzx - vxz) * fabs(vzx - vxz) + (vxy - vyx) * fabs(vxy - vyx));
                 section->curl[itr][nt] = fsign(amp) * sqrt(fabs(amp));
             }
 
-            /*vxx=(-vel->vx[j][i+1][k]+27.0*(vel->vx[j][i][k]-vel->vx[j][i-1][k])+vel->vx[j][i-2][k])*(dh24x);
-             * vyy=(-vel->vy[j+1][i][k]+27.0*(vel->vy[j][i][k]-vel->vy[j-1][i][k])+vel->vy[j-2][i][k])*(dh24y);
-             * vzz=(-vel->vz[j][i][k+1]+27.0*(vel->vz[j][i][k]-vel->vz[j][i][k-1])+vel->vz[j][i][k-2])*(dh24z); */
+            /*vxx=(-vel.vx[j, i+1, k]+27.0*(vel.vx[j, i, k]-vel.vx[j, i-1, k])+vel.vx[j, i-2, k])*(dh24x);
+             * vyy=(-vel.vy[j+1, i, k]+27.0*(vel.vy[j, i, k]-vel.vy[j-1, i, k])+vel.vy[j-2, i, k])*(dh24y);
+             * vzz=(-vel.vz[j, i, k+1]+27.0*(vel.vz[j, i, k]-vel.vz[j, i, k-1])+vel.vz[j, i, k-2])*(dh24z); */
 
-            vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * (dh24x);
-            vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * (dh24y);
-            vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * (dh24z);
+            vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * (dh24x);
+            vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * (dh24y);
+            vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * (dh24z);
 
-            section->div[itr][nt] = (vxx + vyy + vzz) * sqrt(mod->pi[j][i][k]);
+            section->div[itr][nt] = (vxx + vyy + vzz) * sqrt(mod.pi[j, i, k]);
             break;
         }
     }
diff --git a/src/snap_ssg.cpp b/src/snap_ssg.cpp
index edee4fcc799465be499cfb2751db25a998eaf251..a447f00f4626c99d0ac8843b005be5dcb3fa127e 100644
--- a/src/snap_ssg.cpp
+++ b/src/snap_ssg.cpp
@@ -24,7 +24,7 @@
 #include "fd.hpp"
 #include "logging.hpp"
 
-void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model *mod,
+void snap(int nt, int nsnap, st_velocity &vel, st_stress &stress, const st_model &mod,
           const st_boundary *nb, GlobVar *gv)
 {
     /*
@@ -88,9 +88,9 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
         for (int j = nb->ny1; j <= nb->ny2; j += gv->IDY) {
             for (int i = nb->nx1; i <= nb->nx2; i += gv->IDX) {
                 for (int k = nb->nz1; k <= nb->nz2; k += gv->IDZ) {
-                    writedsk(fpx1, vel->vx[j][i][k], gv->SNAP_FORMAT);
-                    writedsk(fpy1, vel->vy[j][i][k], gv->SNAP_FORMAT);
-                    writedsk(fpz1, vel->vz[j][i][k], gv->SNAP_FORMAT);
+                    writedsk(fpx1, vel.vx[j, i, k], gv->SNAP_FORMAT);
+                    writedsk(fpy1, vel.vy[j, i, k], gv->SNAP_FORMAT);
+                    writedsk(fpz1, vel.vz[j, i, k], gv->SNAP_FORMAT);
                 }
             }
         }
@@ -104,9 +104,9 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
             for (int i = nb->nx1; i <= nb->nx2; i += gv->IDX)
                 for (int j = nb->nz1; j <= nb->nz2; j += gv->IDZ) {
                     if (gv->WEQ != 2) {
-                        amp = -stress->sxx[j][i][k] - stress->syy[j][i][k] - stress->szz[j][i][k];
+                        amp = -stress.sxx[j, i, k] - stress.syy[j, i, k] - stress.szz[j, i, k];
                     } else {
-                        amp = -stress->sp[j][i][k];
+                        amp = -stress.sp[j, i, k];
                     }
 
                     writedsk(fpx1, amp, gv->SNAP_FORMAT);
@@ -120,9 +120,9 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
         for (int k = nb->ny1; k <= nb->ny2; k += gv->IDY)
             for (int i = nb->nx1; i <= nb->nx2; i += gv->IDX)
                 for (int j = nb->nz1; j <= nb->nz2; j += gv->IDZ) {
-                    writedsk(fpx1, vel->vx[j][i][k], gv->SNAP_FORMAT);
-                    writedsk(fpy1, vel->vy[j][i][k], gv->SNAP_FORMAT);
-                    writedsk(fpz1, vel->vz[j][i][k], gv->SNAP_FORMAT);
+                    writedsk(fpx1, vel.vx[j, i, k], gv->SNAP_FORMAT);
+                    writedsk(fpy1, vel.vy[j, i, k], gv->SNAP_FORMAT);
+                    writedsk(fpz1, vel.vz[j, i, k], gv->SNAP_FORMAT);
                 }
         fclose(fpx1);
         fclose(fpy1);
@@ -142,19 +142,19 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
             for (int k = nb->ny1; k <= nb->ny2; k += gv->IDY)
                 for (int i = nb->nx1; i <= nb->nx2; i += gv->IDX)
                     for (int j = nb->nz1; j <= nb->nz2; j += gv->IDZ) {
-                        /*vxy=(-vel->vx[j+2][i][k]+27.0*(vel->vx[j+1][i][k]-vel->vx[j][i][k])+vel->vx[j-1][i][k])*(dh24);
-                         * vxz=(-vel->vx[j][i][k+2]+27.0*(vel->vx[j][i][k+1]-vel->vx[j][i][k])+vel->vx[j][i][k-1])*(dh24);
-                         * vyx=(-vel->vy[j][i+2][k]+27.0*(vel->vy[j][i+1][k]-vel->vy[j][i][k])+vel->vy[j][i-1][k])*(dh24);
-                         * vyz=(-vel->vy[j][i][k+2]+27.0*(vel->vy[j][i][k+1]-vel->vy[j][i][k])+vel->vy[j][i][k-1])*(dh24);
-                         * vzx=(-vel->vz[j][i+2][k]+27.0*(vel->vz[j][i+1][k]-vel->vz[j][i][k])+vel->vz[j][i-1][k])*(dh24);
-                         * vzy=(-vel->vz[j+2][i][k]+27.0*(vel->vz[j+1][i][k]-vel->vz[j][i][k])+vel->vz[j-1][i][k])*(dh24); */
-
-                        float vxy = (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) * (dh24y);
-                        float vxz = (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) * (dh24z);
-                        float vyx = (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) * (dh24x);
-                        float vyz = (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) * (dh24z);
-                        float vzx = (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) * (dh24x);
-                        float vzy = (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) * (dh24y);
+                        /*vxy=(-vel.vx[j+2, i, k]+27.0*(vel.vx[j+1, i, k]-vel.vx[j, i, k])+vel.vx[j-1, i, k])*(dh24);
+                         * vxz=(-vel.vx[j, i, k+2]+27.0*(vel.vx[j, i, k+1]-vel.vx[j, i, k])+vel.vx[j, i, k-1])*(dh24);
+                         * vyx=(-vel.vy[j, i+2, k]+27.0*(vel.vy[j, i+1, k]-vel.vy[j, i, k])+vel.vy[j, i-1, k])*(dh24);
+                         * vyz=(-vel.vy[j, i, k+2]+27.0*(vel.vy[j, i, k+1]-vel.vy[j, i, k])+vel.vy[j, i, k-1])*(dh24);
+                         * vzx=(-vel.vz[j, i+2, k]+27.0*(vel.vz[j, i+1, k]-vel.vz[j, i, k])+vel.vz[j, i-1, k])*(dh24);
+                         * vzy=(-vel.vz[j+2, i, k]+27.0*(vel.vz[j+1, i, k]-vel.vz[j, i, k])+vel.vz[j-1, i, k])*(dh24); */
+
+                        float vxy = (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) * (dh24y);
+                        float vxz = (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) * (dh24z);
+                        float vyx = (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) * (dh24x);
+                        float vyz = (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) * (dh24z);
+                        float vzx = (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) * (dh24x);
+                        float vzy = (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) * (dh24y);
 
                         /*amp= absolute value of curl(v)), without sqrt!!! */
                         amp = ((vzy - vyz) * (vzy - vyz) + (vxz - vzx) * (vxz - vzx) + (vyx - vxy) * (vyx - vxy));
@@ -164,30 +164,30 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
                         switch (gv->SNAP_PLANE) {
                         case 1:    /* energy without sign */
                             /* sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                            a = sqrt((mod->u[j][i][k]) * amp);
+                            a = sqrt((mod.u[j, i, k]) * amp);
                             break;
                         case 2:    /* energy with sign true for x-y-plane */
                             /*sign(rot(v)x * sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                            a = fsign((vxy - vyx)) * sqrt((mod->u[j][i][k]) * amp);
+                            a = fsign((vxy - vyx)) * sqrt((mod.u[j, i, k]) * amp);
                             break;
                         case 3:    /* energy with sign true for x-z-plane */
                             /*sign(rot(v)r * sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                            a = fsign((vxz - vzx)) * sqrt((mod->u[j][i][k]) * amp);
+                            a = fsign((vxz - vzx)) * sqrt((mod.u[j, i, k]) * amp);
                             break;
                         case 4:    /* energy with sign true for y-z-plane */
                             /*sign(rot(v)t * sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                            a = fsign((vzy - vyz)) * sqrt((mod->u[j][i][k]) * amp);
+                            a = fsign((vzy - vyz)) * sqrt((mod.u[j, i, k]) * amp);
                             break;
                         case 5:    /*custom force *//*not yet working properly */
                             /*sign(rot(v)t * sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                            a = fsign((vxz - vzx)) * sqrt((mod->u[j][i][k]) * amp);
+                            a = fsign((vxz - vzx)) * sqrt((mod.u[j, i, k]) * amp);
                             break;
                         }
 
                         /*sign(rot(v)t * sqrt(Es) with Es = u*amp*amp (second amp removed due to missing sqrt in amp */
-                        /*a=fsign((vxz-vzx))*sqrt((mod->u[j][i][k])*amp);
+                        /*a=fsign((vxz-vzx))*sqrt((mod.u[j, i, k])*amp);
                          *
-                         * amp=mod->u[j][i][k]*((vyz-vzy)*fabs(vyz-vzy)+
+                         * amp=mod.u[j, i, k]*((vyz-vzy)*fabs(vyz-vzy)+
                          * (vzx-vxz)*fabs(vzx-vxz)+(vxy-vyx)*fabs(vxy-vyx));
                          * a=fsign(amp)*sqrt(fabs(amp)); */
 
@@ -200,13 +200,13 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
         for (int k = nb->ny1; k <= nb->ny2; k += gv->IDY)
             for (int i = nb->nx1; i <= nb->nx2; i += gv->IDX)
                 for (int j = nb->nz1; j <= nb->nz2; j += gv->IDZ) {
-                    /*vxx=(-vel->vx[j][i+1][k]+27.0*(vel->vx[j][i][k]-vel->vx[j][i-1][k])+vel->vx[j][i-2][k])*(dh24);
-                     * vyy=(-vel->vy[j+1][i][k]+27.0*(vel->vy[j][i][k]-vel->vy[j-1][i][k])+vel->vy[j-2][i][k])*(dh24);
-                     * vzz=(-vel->vz[j][i][k+1]+27.0*(vel->vz[j][i][k]-vel->vz[j][i][k-1])+vel->vz[j][i][k-2])*(dh24); */
+                    /*vxx=(-vel.vx[j, i+1, k]+27.0*(vel.vx[j, i, k]-vel.vx[j, i-1, k])+vel.vx[j, i-2, k])*(dh24);
+                     * vyy=(-vel.vy[j+1, i, k]+27.0*(vel.vy[j, i, k]-vel.vy[j-1, i, k])+vel.vy[j-2, i, k])*(dh24);
+                     * vzz=(-vel.vz[j, i, k+1]+27.0*(vel.vz[j, i, k]-vel.vz[j, i, k-1])+vel.vz[j, i, k-2])*(dh24); */
 
-                    vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * (dh24x);
-                    vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * (dh24y);
-                    vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * (dh24z);
+                    vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * (dh24x);
+                    vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * (dh24y);
+                    vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * (dh24z);
 
                     /*amp= div(v)) */
                     amp = (vxx + vyy + vzz);
@@ -214,26 +214,26 @@ void snap(int nt, int nsnap, st_velocity *vel, st_stress *stress, const st_model
                     switch (gv->SNAP_PLANE) {
                     case 1:        /* energy without sign */
                         /* Ep with Ep=pi*amp*amp */
-                        a = sqrt((mod->pi[j][i][k]) * amp * amp);
+                        a = sqrt((mod.pi[j, i, k]) * amp * amp);
                         break;
                     case 2:        /* single force in x */
                         /*sign of div(v) * Ep with Ep=pi*amp*amp */
-                        a = fsign(amp) * sqrt((mod->pi[j][i][k]) * amp * amp);
+                        a = fsign(amp) * sqrt((mod.pi[j, i, k]) * amp * amp);
                         break;
                     case 3:        /* single force in y */
                         /*sign of div(v) * Ep with Ep=pi*amp*amp */
-                        a = fsign(amp) * sqrt((mod->pi[j][i][k]) * amp * amp);
+                        a = fsign(amp) * sqrt((mod.pi[j, i, k]) * amp * amp);
                         break;
                     case 4:        /* single force in z */
                         /*sign of div(v) * Ep with Ep=pi*amp*amp */
-                        a = fsign(amp) * sqrt((mod->pi[j][i][k]) * amp * amp);
+                        a = fsign(amp) * sqrt((mod.pi[j, i, k]) * amp * amp);
                         break;
                     }
 
                     /*sign of div(v) * Ep with Ep=pi*amp*amp */
-                    /*a=fsign(amp)*sqrt((mod->pi[j][i][k])*amp*amp);
+                    /*a=fsign(amp)*sqrt((mod.pi[j, i, k])*amp*amp);
                      *
-                     * a=(vxx+vyy+vzz)*sqrt(mod->pi[j][i][k]); */
+                     * a=(vxx+vyy+vzz)*sqrt(mod.pi[j, i, k]); */
 
                     writedsk(fpx2, a, gv->SNAP_FORMAT);
                 }
diff --git a/src/stfi.cpp b/src/stfi.cpp
index edb3b3c6fc97fa82ef06eefc3aacf5265f36a16a..9989d3880241623fd95edb909eb686d78a2f3da9 100644
--- a/src/stfi.cpp
+++ b/src/stfi.cpp
@@ -30,10 +30,10 @@
 #include "seismo_shift.hpp"
 #include "kiss_fftr.h"
 
-void stfi(st_acquisition *acq, st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_stress *stress,
-          st_model *mod, st_model_av *mod_av, st_visc_mem *visco_mem, st_seismogram *section,
+void stfi(st_acquisition *acq, st_boundary *nb, const st_boundary *nb_fix, st_velocity &vel, st_stress &stress,
+          st_model &mod, st_model_av &mod_av, st_visc_mem *visco_mem, st_seismogram *section,
           st_seismogram *section_obs, st_signals *signals, int nsrc_loc, int ntr_loc, st_pml_coeff *pml_coeff,
-          st_pml_wfd *pml_wfd, st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel_fw,
+          st_pml_wfd &pml_wfd, st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel_fw,
           const float *finv, double *L2, int nf, int ntast, int lsnap, int nsnap, int ishot, int shot_id, int cdf,
           int iteration, int groupnum, int it_group, int ncplx, GlobVar *gv)
 {
@@ -49,7 +49,7 @@ void stfi(st_acquisition *acq, st_boundary *nb, const st_boundary *nb_fix, st_ve
         * Timestep loop (simulation for STFI)
         *****************************************************/
         timeloop(nb, nb_fix, vel, stress, mod, mod_av, section, acq->srcpos_loc, acq->recpos_loc,
-                 signals, nsrc_loc, mod->absorb_coeff, pml_coeff, pml_wfd, stressbuff, velbuff,
+                 signals, nsrc_loc, mod.absorb_coeff, pml_coeff, pml_wfd, stressbuff, velbuff,
                  fourier_vel_fw, finv, nf, ntast, ntr_loc, lsnap, nsnap, 0, shot_id, 4, gv);
 
         /* STFI: Calculate filter */
diff --git a/src/surface_ssg.cpp b/src/surface_ssg.cpp
index 2837a7f5b5814c08248c2e318e96e21d13c4dae3..482053c7b25994a5fef830ae32d92b0715bb6952 100644
--- a/src/surface_ssg.cpp
+++ b/src/surface_ssg.cpp
@@ -23,8 +23,8 @@
 
 #include "fd.hpp"
 
-void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, st_visc_mem *mem,
-             st_stress *stress, st_velocity *vel)
+void surface(int ndepth, st_model &mod, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, st_visc_mem *mem,
+             st_stress &stress, st_velocity &vel)
 {
     int i, k, j, fdoh, m, h1;
     float vxx, vyy, vzz;
@@ -55,13 +55,13 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
-                stress->syy[j - 1][i][k] = -stress->syy[j + 1][i][k];
-                stress->sxy[j - 1][i][k] = -stress->sxy[j][i][k];
-                stress->sxy[j - 2][i][k] = -stress->sxy[j + 1][i][k];
-                stress->syz[j - 1][i][k] = -stress->syz[j][i][k];
-                stress->syz[j - 2][i][k] = -stress->syz[j + 1][i][k];
+                stress.syy[j - 1, i, k] = -stress.syy[j + 1, i, k];
+                stress.sxy[j - 1, i, k] = -stress.sxy[j, i, k];
+                stress.sxy[j - 2, i, k] = -stress.sxy[j + 1, i, k];
+                stress.syz[j - 1, i, k] = -stress.syz[j, i, k];
+                stress.syz[j - 2, i, k] = -stress.syz[j + 1, i, k];
 
                 /* in the case of using several relaxation mechanisms all
                  * memory-variables corresponding to syy must be set to zero
@@ -72,63 +72,63 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
 
                 /* first calculate spatial derivatives of components of particle velocities */
                 vxx =
-                    (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                     b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / DX;
+                    (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                     b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / DX;
                 vyy =
-                    (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                     b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / DY;
+                    (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                     b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / DY;
                 vzz =
-                    (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                     b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / DZ;
+                    (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                     b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / DZ;
 
-                /*vxx=(-vel->vx[j][i+1][k]+27.0*(vel->vx[j][i][k]-vel->vx[j][i-1][k])+vel->vx[j][i-2][k])/(dh24x);
-                 * vyy=(-vel->vy[j+1][i][k]+27.0*(vel->vy[j][i][k]-vel->vy[j-1][i][k])+vel->vy[j-2][i][k])/(dh24x);
-                 * vzz=(-vel->vz[j][i][k+1]+27.0*(vel->vz[j][i][k]-vel->vz[j][i][k-1])+vel->vz[j][i][k-2])/(dh24x); */
+                /*vxx=(-vel.vx[j, i+1, k]+27.0*(vel.vx[j, i, k]-vel.vx[j, i-1, k])+vel.vx[j, i-2, k])/(dh24x);
+                 * vyy=(-vel.vy[j+1, i, k]+27.0*(vel.vy[j, i, k]-vel.vy[j-1, i, k])+vel.vy[j-2, i, k])/(dh24x);
+                 * vzz=(-vel.vz[j, i, k+1]+27.0*(vel.vz[j, i, k]-vel.vz[j, i, k-1])+vel.vz[j, i, k-2])/(dh24x); */
 
                 if (ABS_TYPE == 1) {
                     if ((POS[1] == 0) && (i <= FW)) {
-                        pml_wfd->psi_vxx[j][i][k] =
-                            pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
+                        pml_wfd.psi_vxx[j, i, k] =
+                            pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
                     }
                     if ((POS[1] == NPROCX - 1) && (i >= NX - FW + 1)) {
                         h1 = i - NX + 2 * FW;
 
-                        pml_wfd->psi_vxx[j][h1][k] =
-                            pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
+                        pml_wfd.psi_vxx[j, h1, k] =
+                            pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
                     }
                     if ((POS[3] == 0) && (k <= FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd.psi_vzz[j, i, k];
                     }
                     if ((POS[3] == NPROCZ - 1) && (k >= NZ - FW + 1)) {
                         h1 = (k - NZ + 2 * FW);
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
                 }
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0f + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0f + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
@@ -147,12 +147,12 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
                 for (m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
                 /* in the case of using several relaxation mechanisms all
@@ -166,59 +166,59 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
                  * of particle velocities */
 
                 vxx =
-                    (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                     b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / DX;
+                    (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                     b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / DX;
                 vyy =
-                    (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                     b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / DY;
+                    (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                     b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / DY;
                 vzz =
-                    (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                     b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / DZ;
+                    (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                     b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / DZ;
 
                 if (ABS_TYPE == 1) {
                     if ((POS[1] == 0) && (i <= FW)) {
-                        pml_wfd->psi_vxx[j][i][k] =
-                            pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
+                        pml_wfd.psi_vxx[j, i, k] =
+                            pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
                     }
                     if ((POS[1] == NPROCX - 1) && (i >= NX - FW + 1)) {
                         h1 = i - NX + 2 * FW;
 
-                        pml_wfd->psi_vxx[j][h1][k] =
-                            pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
+                        pml_wfd.psi_vxx[j, h1, k] =
+                            pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
                     }
                     if ((POS[3] == 0) && (k <= FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd.psi_vzz[j, i, k];
                     }
                     if ((POS[3] == NPROCZ - 1) && (k >= NZ - FW + 1)) {
                         h1 = (k - NZ + 2 * FW);
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
                 }
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0f + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0f + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
@@ -238,12 +238,12 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
                 for (m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
                 /* in the case of using several relaxation mechanisms all
@@ -256,36 +256,36 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
                 /* first calculate spatial derivatives of components
                  * of particle velocities */
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k])) / DX;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k])) / DX;
 
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k])) / DY;
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k])) / DY;
 
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3])) / DZ;
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3])) / DZ;
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0 + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0 + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
@@ -308,12 +308,12 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
                 for (m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
                 /* in the case of using several relaxation mechanisms all
@@ -326,39 +326,39 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
                 /* first calculate spatial derivatives of components
                  * of particle velocities */
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k])) / DX;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k])) / DX;
 
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k])) / DY;
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k])) / DY;
 
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4])) / DZ;
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4])) / DZ;
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0f + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0f + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
@@ -383,12 +383,12 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
                 for (m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
                 /* in the case of using several relaxation mechanisms all
@@ -401,42 +401,42 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
                 /* first calculate spatial derivatives of components
                  * of particle velocities */
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                       b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k])) / DX;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                       b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k])) / DX;
 
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                       b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k])) / DY;
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                       b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k])) / DY;
 
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                       b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5])) / DZ;
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                       b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5])) / DZ;
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0f + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0f + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0f) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
@@ -465,12 +465,12 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
             for (i = 1; i <= NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = mem->ryy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = mem->ryy[j][i][k] = 0.0;
 
                 for (m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
                 /* in the case of using several relaxation mechanisms all
@@ -483,45 +483,45 @@ void surface(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml
                 /* first calculate spatial derivatives of components
                  * of particle velocities */
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                       b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k]) +
-                       b6 * (vel->vx[j][i + 5][k] - vel->vx[j][i - 6][k])) / DX;
-
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                       b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k]) +
-                       b6 * (vel->vy[j + 5][i][k] - vel->vy[j - 6][i][k])) / DY;
-
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                       b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5]) +
-                       b6 * (vel->vz[j][i][k + 5] - vel->vz[j][i][k - 6])) / DZ;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                       b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k]) +
+                       b6 * (vel.vx[j, i + 5, k] - vel.vx[j, i - 6, k])) / DX;
+
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                       b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k]) +
+                       b6 * (vel.vy[j + 5, i, k] - vel.vy[j - 6, i, k])) / DY;
+
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                       b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5]) +
+                       b6 * (vel.vz[j, i, k + 5] - vel.vz[j, i, k - 6])) / DZ;
 
                 /* partially updating sxx and szz in the same way */
-                f = mod->u[j][i][k] * 2.0f * (1.0f + L * mod->taus[j][i][k]);
-                g = mod->pi[j][i][k] * (1.0f + L * mod->taup[j][i][k]);
+                f = mod.u[j, i, k] * 2.0f * (1.0f + L * mod.taus[j, i, k]);
+                g = mod.pi[j, i, k] * (1.0f + L * mod.taup[j, i, k]);
                 h = -(DT * (g - f) * (g - f) * (vxx + vzz) / g) - (DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h - (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += h - (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += h - (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += h - (dthalbe * mem->rzz[j][i][k]);
 
                 /* updating the memory-variable rxx, rzz at the free surface */
-                b = mod->eta[1] / (1.0 + (mod->eta[1] * 0.5));
-                d = 2.0f * mod->u[j][i][k] * mod->taus[j][i][k];
-                e = mod->pi[j][i][k] * mod->taup[j][i][k];
+                b = mod.eta[1] / (1.0 + (mod.eta[1] * 0.5));
+                d = 2.0f * mod.u[j, i, k] * mod.taus[j, i, k];
+                e = mod.pi[j, i, k] * mod.taup[j, i, k];
                 h = b * (((d - e) * ((f / g) - 1.0) * (vxx + vzz)) - ((d - e) * vyy));
                 mem->rxx[j][i][k] += h;
                 mem->rzz[j][i][k] += h;
 
                 /*completely updating the stresses sxx and szz */
-                stress->sxx[j][i][k] += (dthalbe * mem->rxx[j][i][k]);
-                stress->szz[j][i][k] += (dthalbe * mem->rzz[j][i][k]);
+                stress.sxx[j, i, k] += (dthalbe * mem->rxx[j][i][k]);
+                stress.szz[j, i, k] += (dthalbe * mem->rzz[j][i][k]);
             }
         }
         break;
diff --git a/src/surface_ssg_acoustic.cpp b/src/surface_ssg_acoustic.cpp
index 9b0c978701dfce0d68104b274acd84007aef3968..5a5b33b2179158086a752b2a86982c357b42067e 100644
--- a/src/surface_ssg_acoustic.cpp
+++ b/src/surface_ssg_acoustic.cpp
@@ -23,7 +23,7 @@
 
 #include "fd.hpp"
 
-void surface_acoustic(int ndepth, st_stress *stress, const GlobVar *gv)
+void surface_acoustic(int ndepth, st_stress &stress, const GlobVar *gv)
 {
     int j = ndepth;                 /* The free surface is located exactly in y=ndepth*dh meter!! */
     int fdoh = gv->FDORDER / 2;
@@ -32,9 +32,9 @@ void surface_acoustic(int ndepth, st_stress *stress, const GlobVar *gv)
         for (int i = 1; i <= gv->NX; i++) {
             /* Mirroring the components of the stress tensor to make     *
             * a stress free surface (method of imaging, Levander, 1988) */
-            stress->sp[j][i][k] = 0.0;
+            stress.sp[j, i, k] = 0.0;
             for (int m = 1; m <= fdoh; m++) {
-                stress->sp[j - m][i][k] = -stress->sp[j + m][i][k];
+                stress.sp[j - m, i, k] = -stress.sp[j + m, i, k];
             }
         }
     }
diff --git a/src/surface_ssg_elastic.cpp b/src/surface_ssg_elastic.cpp
index b9090d22cb946c3d6bfc81108390d4af600ff996..52343f44152e61aaf600dc254622e8f37aa55985 100644
--- a/src/surface_ssg_elastic.cpp
+++ b/src/surface_ssg_elastic.cpp
@@ -23,8 +23,8 @@
 
 #include "fd.hpp"
 
-void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd,
-                     st_stress *stress, st_velocity *vel, const GlobVar *gv)
+void surface_elastic(int ndepth, st_model &mod, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd,
+                     st_stress &stress, st_velocity &vel, const GlobVar *gv)
 {
     int h1;
     float vxx, vyy, vzz;
@@ -44,49 +44,49 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
-                stress->syy[j - 1][i][k] = -stress->syy[j + 1][i][k];
-                stress->sxy[j - 1][i][k] = -stress->sxy[j][i][k];
-                stress->sxy[j - 2][i][k] = -stress->sxy[j + 1][i][k];
-                stress->syz[j - 1][i][k] = -stress->syz[j][i][k];
-                stress->syz[j - 2][i][k] = -stress->syz[j + 1][i][k];
+                stress.syy[j - 1, i, k] = -stress.syy[j + 1, i, k];
+                stress.sxy[j - 1, i, k] = -stress.sxy[j, i, k];
+                stress.sxy[j - 2, i, k] = -stress.sxy[j + 1, i, k];
+                stress.syz[j - 1, i, k] = -stress.syz[j, i, k];
+                stress.syz[j - 2, i, k] = -stress.syz[j + 1, i, k];
 
-                vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * oodx;
-                vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * oody;
-                vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * oodz;
+                vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * oodx;
+                vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * oody;
+                vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * oodz;
 
                 if (gv->ABS_TYPE == 1) {
                     if ((gv->POS[1] == 0) && (i <= gv->FW)) {
-                        pml_wfd->psi_vxx[j][i][k] =
-                            pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
+                        pml_wfd.psi_vxx[j, i, k] =
+                            pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
                     }
                     if ((gv->POS[1] == gv->NPROCX - 1) && (i >= gv->NX - gv->FW + 1)) {
                         h1 = i - gv->NX + 2 * gv->FW;
 
-                        pml_wfd->psi_vxx[j][h1][k] =
-                            pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
+                        pml_wfd.psi_vxx[j, h1, k] =
+                            pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
                     }
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd.psi_vzz[j, i, k];
                     }
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= gv->NZ - gv->FW + 1)) {
                         h1 = (k - gv->NZ + 2 * gv->FW);
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
                 }
 
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
@@ -105,54 +105,54 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
                 for (int m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
                 vxx =
-                    (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                     b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                    (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                     b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                 vyy =
-                    (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                     b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                    (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                     b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                 vzz =
-                    (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                     b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
+                    (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                     b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
 
                 if (gv->ABS_TYPE == 1) {
                     if ((gv->POS[1] == 0) && (i <= gv->FW)) {
-                        pml_wfd->psi_vxx[j][i][k] =
-                            pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
+                        pml_wfd.psi_vxx[j, i, k] =
+                            pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                        vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
                     }
                     if ((gv->POS[1] == gv->NPROCX - 1) && (i >= gv->NX - gv->FW + 1)) {
                         h1 = i - gv->NX + 2 * gv->FW;
 
-                        pml_wfd->psi_vxx[j][h1][k] =
-                            pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
+                        pml_wfd.psi_vxx[j, h1, k] =
+                            pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                        vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
                     }
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_z[k] + pml_wfd.psi_vzz[j, i, k];
                     }
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= gv->NZ - gv->FW + 1)) {
                         h1 = (k - gv->NZ + 2 * gv->FW);
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
                 }
 
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
@@ -172,31 +172,31 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
                 for (int m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k])) * oodx;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k])) * oodx;
 
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k])) * oody;
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k])) * oody;
 
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3])) * oodz;
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3])) * oodz;
 
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
@@ -219,34 +219,34 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
                 for (int m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k])) * oodx;
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k])) * oodx;
 
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k])) * oody;
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k])) * oody;
 
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4])) * oodz;
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4])) * oodz;
 
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
@@ -271,37 +271,37 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
                 for (int m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                       b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k])) * oodx;
-
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                       b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k])) * oody;
-
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                       b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5])) * oodz;
-
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                       b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k])) * oodx;
+
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                       b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k])) * oody;
+
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                       b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5])) * oodz;
+
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
@@ -330,40 +330,40 @@ void surface_elastic(int ndepth, st_model *mod, st_pml_coeff *pml_coeff, st_pml_
             for (int i = 1; i <= gv->NX; i++) {
                 /*Mirroring the components of the stress tensor to make
                  * a stress free surface (method of imaging, Levander, 1988) */
-                stress->syy[j][i][k] = 0.0;
+                stress.syy[j, i, k] = 0.0;
 
                 for (int m = 1; m <= fdoh; m++) {
-                    stress->syy[j - m][i][k] = -stress->syy[j + m][i][k];
-                    stress->sxy[j - m][i][k] = -stress->sxy[j + m - 1][i][k];
-                    stress->syz[j - m][i][k] = -stress->syz[j + m - 1][i][k];
+                    stress.syy[j - m, i, k] = -stress.syy[j + m, i, k];
+                    stress.sxy[j - m, i, k] = -stress.sxy[j + m - 1, i, k];
+                    stress.syz[j - m, i, k] = -stress.syz[j + m - 1, i, k];
                 }
 
-                vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                       b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                       b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                       b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                       b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k]) +
-                       b6 * (vel->vx[j][i + 5][k] - vel->vx[j][i - 6][k])) * oodx;
-
-                vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                       b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                       b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                       b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                       b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k]) +
-                       b6 * (vel->vy[j + 5][i][k] - vel->vy[j - 6][i][k])) * oody;
-
-                vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                       b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                       b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                       b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                       b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5]) +
-                       b6 * (vel->vz[j][i][k + 5] - vel->vz[j][i][k - 6])) * oodz;
-
-                f = mod->u[j][i][k] * 2.0;
-                g = mod->pi[j][i][k];
+                vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                       b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                       b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                       b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                       b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k]) +
+                       b6 * (vel.vx[j, i + 5, k] - vel.vx[j, i - 6, k])) * oodx;
+
+                vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                       b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                       b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                       b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                       b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k]) +
+                       b6 * (vel.vy[j + 5, i, k] - vel.vy[j - 6, i, k])) * oody;
+
+                vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                       b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                       b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                       b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                       b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5]) +
+                       b6 * (vel.vz[j, i, k + 5] - vel.vz[j, i, k - 6])) * oodz;
+
+                f = mod.u[j, i, k] * 2.0;
+                g = mod.pi[j, i, k];
                 h = -(gv->DT * (g - f) * (g - f) * (vxx + vzz) / g) - (gv->DT * (g - f) * vyy);
-                stress->sxx[j][i][k] += h;
-                stress->szz[j][i][k] += h;
+                stress.sxx[j, i, k] += h;
+                stress.szz[j, i, k] += h;
             }
         }
         break;
diff --git a/src/timeloop.cpp b/src/timeloop.cpp
index d621f2b9f09f46be747a54c0808a0c55d5e5061d..037823ae74584c87790ac65e3c591ffa49011d29 100644
--- a/src/timeloop.cpp
+++ b/src/timeloop.cpp
@@ -23,10 +23,10 @@
 #include "fd.hpp"
 #include "logging.hpp"
 
-void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_stress *stress,
-              st_model *mod, st_model_av *mod_av, st_seismogram *section,
+void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity &vel, st_stress &stress,
+              st_model &mod, st_model_av &mod_av, st_seismogram *section,
               float **srcpos_loc, int **recpos_loc, st_signals *signals, int nsrc_loc,
-              float ***absorb_coeff, st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd,
+              float3DTensorT &absorb_coeff, st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd,
               st_buffer_flat *stressbuff, st_buffer_flat *velbuff, st_freq_velocity *fourier_vel,
               const float *finv, int nf, int ntast, int ntr, int lsnap, int nsnap, int pshot, int shot_id,
               int proptype, GlobVar *gv)
@@ -42,7 +42,7 @@ void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_s
 
     for (int nt = 1; nt <= gv->NT; nt++) {
         /* Check if simulation is still stable */
-        if (isnan(vel->vy[gv->NY / 2][gv->NX / 2][gv->NZ / 2]))
+        if (isnan(vel.vy[gv->NY / 2, gv->NX / 2, gv->NZ / 2]))
             log_fatal("Simulation is unstable!\n"); /* maybe just breaking the loop would be better */
 
         /* update of particle velocities */
@@ -124,6 +124,27 @@ void timeloop(st_boundary *nb, const st_boundary *nb_fix, st_velocity *vel, st_s
             lsnap = lsnap + iround(gv->TSNAPINC / gv->DT);
         }
 
+        if (nt % gv->LOG_NTSTEP == 0) {
+            double vx_max = 0.0, vy_max = 0.0, vz_max = 0.0;
+            for (int j = nb->ny1; j <= nb->ny2; j++) {
+                for (int i = nb->nx1; i <= nb->nx2; i++) {
+                    #pragma omp simd
+                    for (int k = nb->nz1; k <= nb->nz2; k++) {
+                        vx_max = fmax(vx_max, fabs(vel.vx[j, i, k]));
+                        vy_max = fmax(vy_max, fabs(vel.vy[j, i, k]));
+                        vz_max = fmax(vz_max, fabs(vel.vz[j, i, k]));
+                    }
+                }
+            }
+
+            double max_send[] = { vx_max, vy_max, vz_max };
+            double max_recv[3];
+            MPI_Reduce(max_send, max_recv, 3, MPI_DOUBLE, MPI_MAX, 0, gv->COMM_SHOT);
+            if (gv->MYID_SHOT == 0) {
+                printf("max fabs: vx=%.3g, vy=%.3g, vz=%.3g\n", max_recv[0], max_recv[1], max_recv[2]);
+            }
+        }
+
         if ((nt % gv->LOG_NTSTEP == 0) && (gv->MYID_SHOT == 0)) {
             double time2c = MPI_Wtime();
             if (proptype == 1)
diff --git a/src/update_s_ssg_CPML_acoustic.cpp b/src/update_s_ssg_CPML_acoustic.cpp
index 483b2cd6f5b3d267a9543cdde7d462c48ff41fce..e7be7fc2e3f146573c8374d99b65fc60d2f81cd4 100644
--- a/src/update_s_ssg_CPML_acoustic.cpp
+++ b/src/update_s_ssg_CPML_acoustic.cpp
@@ -29,9 +29,9 @@
 
 #define UNUSED(x) (void)(x)
 
-double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
-                              st_stress *stress, st_model *mod, st_pml_coeff *pml_coeff,
-                              st_pml_wfd *pml_wfd, const GlobVar *gv)
+double update_s_CPML_acoustic(st_boundary *nb, st_velocity &vel,
+                              st_stress &stress, st_model &mod, st_pml_coeff *pml_coeff,
+                              st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     int h1;
     float vxx, vyy, vzz, vxxyyzz, g;
@@ -51,51 +51,51 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
-                    pml_wfd->psi_vxx[j][i][k] = pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                    vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
+                    pml_wfd.psi_vxx[j, i, k] = pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                    vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_vyy[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
+                        pml_wfd.psi_vyy[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
 
-                        pml_wfd->psi_vyy[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
+                        pml_wfd.psi_vyy[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -107,54 +107,54 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
                     h1 = i - nb->nx2 + gv->FW;
 
-                    pml_wfd->psi_vxx[j][h1][k] =
-                        pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                    vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
+                    pml_wfd.psi_vxx[j, h1, k] =
+                        pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                    vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_vyy[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
+                        pml_wfd.psi_vyy[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
 
-                        pml_wfd->psi_vyy[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
+                        pml_wfd.psi_vyy[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -166,37 +166,37 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
-                    pml_wfd->psi_vyy[j][i][k] = pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                    vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
+                    pml_wfd.psi_vyy[j, i, k] = pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                    vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -208,40 +208,40 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
                     h1 = (j - nb->ny2 + gv->FW);
 
-                    pml_wfd->psi_vyy[h1][i][k] =
-                        pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                    vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
+                    pml_wfd.psi_vyy[h1, i, k] =
+                        pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                    vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -253,23 +253,23 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->FW; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
-                    pml_wfd->psi_vzz[j][i][k] = pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                    vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                    pml_wfd.psi_vzz[j, i, k] = pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                    vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -281,26 +281,26 @@ double update_s_CPML_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = nb->nz2 + 1; k <= nb->nz2 + gv->FW; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) / gv->DX;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) / gv->DX;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) / gv->DY;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) / gv->DY;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) / gv->DZ;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) / gv->DZ;
 
                     h1 = (k - nb->nz2 + gv->FW);
 
-                    pml_wfd->psi_vzz[j][i][h1] =
-                        pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                    vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                    pml_wfd.psi_vzz[j, i, h1] =
+                        pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                    vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
diff --git a/src/update_s_ssg_CPML_elastic.cpp b/src/update_s_ssg_CPML_elastic.cpp
index 6c3c430cf0548e42e635ae5b1f988b001d1b0027..5dc7ed8ba5b586022ac9bea9867c50c12c41cbec 100644
--- a/src/update_s_ssg_CPML_elastic.cpp
+++ b/src/update_s_ssg_CPML_elastic.cpp
@@ -29,9 +29,9 @@
 
 #define UNUSED(x) (void)(x)
 
-double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
-                             st_stress *stress, st_model *mod, st_model_av *mod_av,
-                             st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, const GlobVar *gv)
+double update_s_CPML_elastic(st_boundary *nb, st_velocity &vel,
+                             st_stress &stress, st_model &mod, st_model_av &mod_av,
+                             st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     int h1;
     float vxx, vxy, vxz, vyx, vyy, vyz, vzx, vzy, vzz;
@@ -59,99 +59,99 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
-
-                    pml_wfd->psi_vxx[j][i][k] = pml_coeff->b_x[i] * pml_wfd->psi_vxx[j][i][k] + pml_coeff->a_x[i] * vxx;
-                    vxx = vxx / pml_coeff->K_x[i] + pml_wfd->psi_vxx[j][i][k];
-                    pml_wfd->psi_vyx[j][i][k] =
-                        pml_coeff->b_x_half[i] * pml_wfd->psi_vyx[j][i][k] + pml_coeff->a_x_half[i] * vyx;
-                    vyx = vyx / pml_coeff->K_x_half[i] + pml_wfd->psi_vyx[j][i][k];
-                    pml_wfd->psi_vzx[j][i][k] =
-                        pml_coeff->b_x_half[i] * pml_wfd->psi_vzx[j][i][k] + pml_coeff->a_x_half[i] * vzx;
-                    vzx = vzx / pml_coeff->K_x_half[i] + pml_wfd->psi_vzx[j][i][k];
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
+
+                    pml_wfd.psi_vxx[j, i, k] = pml_coeff->b_x[i] * pml_wfd.psi_vxx[j, i, k] + pml_coeff->a_x[i] * vxx;
+                    vxx = vxx / pml_coeff->K_x[i] + pml_wfd.psi_vxx[j, i, k];
+                    pml_wfd.psi_vyx[j, i, k] =
+                        pml_coeff->b_x_half[i] * pml_wfd.psi_vyx[j, i, k] + pml_coeff->a_x_half[i] * vyx;
+                    vyx = vyx / pml_coeff->K_x_half[i] + pml_wfd.psi_vyx[j, i, k];
+                    pml_wfd.psi_vzx[j, i, k] =
+                        pml_coeff->b_x_half[i] * pml_wfd.psi_vzx[j, i, k] + pml_coeff->a_x_half[i] * vzx;
+                    vzx = vzx / pml_coeff->K_x_half[i] + pml_wfd.psi_vzx[j, i, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_vxy[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_vxy[j][i][k] + pml_coeff->a_y_half[j] * vxy;
-                        vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd->psi_vxy[j][i][k];
-                        pml_wfd->psi_vyy[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
-                        pml_wfd->psi_vzy[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_vzy[j][i][k] + pml_coeff->a_y_half[j] * vzy;
-                        vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd->psi_vzy[j][i][k];
+                        pml_wfd.psi_vxy[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_vxy[j, i, k] + pml_coeff->a_y_half[j] * vxy;
+                        vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd.psi_vxy[j, i, k];
+                        pml_wfd.psi_vyy[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
+                        pml_wfd.psi_vzy[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_vzy[j, i, k] + pml_coeff->a_y_half[j] * vzy;
+                        vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd.psi_vzy[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
 
-                        pml_wfd->psi_vxy[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_vxy[h1][i][k] + pml_coeff->a_y_half[h1] * vxy;
-                        vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vxy[h1][i][k];
-                        pml_wfd->psi_vyy[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
-                        pml_wfd->psi_vzy[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_vzy[h1][i][k] + pml_coeff->a_y_half[h1] * vzy;
-                        vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vzy[h1][i][k];
+                        pml_wfd.psi_vxy[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_vxy[h1, i, k] + pml_coeff->a_y_half[h1] * vxy;
+                        vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vxy[h1, i, k];
+                        pml_wfd.psi_vyy[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
+                        pml_wfd.psi_vzy[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_vzy[h1, i, k] + pml_coeff->a_y_half[h1] * vzy;
+                        vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vzy[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vxz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vxz[j][i][k] + pml_coeff->a_z_half[k] * vxz;
-                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd->psi_vxz[j][i][k];
-                        pml_wfd->psi_vyz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vyz[j][i][k] + pml_coeff->a_z_half[k] * vyz;
-                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd->psi_vyz[j][i][k];
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vxz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vxz[j, i, k] + pml_coeff->a_z_half[k] * vxz;
+                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd.psi_vxz[j, i, k];
+                        pml_wfd.psi_vyz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vyz[j, i, k] + pml_coeff->a_z_half[k] * vyz;
+                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd.psi_vyz[j, i, k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vxz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vxz[j][i][h1] + pml_coeff->a_z_half[h1] * vxz;
-                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vxz[j][i][h1];
-                        pml_wfd->psi_vyz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vyz[j][i][h1] + pml_coeff->a_z_half[h1] * vyz;
-                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vyz[j][i][h1];
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vxz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vxz[j, i, h1] + pml_coeff->a_z_half[h1] * vxz;
+                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vxz[j, i, h1];
+                        pml_wfd.psi_vyz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vyz[j, i, h1] + pml_coeff->a_z_half[h1] * vyz;
+                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vyz[j, i, h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -161,12 +161,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -178,102 +178,102 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
 
                     h1 = i - nb->nx2 + gv->FW;
 
-                    pml_wfd->psi_vxx[j][h1][k] =
-                        pml_coeff->b_x[h1] * pml_wfd->psi_vxx[j][h1][k] + pml_coeff->a_x[h1] * vxx;
-                    vxx = vxx / pml_coeff->K_x[h1] + pml_wfd->psi_vxx[j][h1][k];
-                    pml_wfd->psi_vyx[j][h1][k] =
-                        pml_coeff->b_x_half[h1] * pml_wfd->psi_vyx[j][h1][k] + pml_coeff->a_x_half[h1] * vyx;
-                    vyx = vyx / pml_coeff->K_x_half[h1] + pml_wfd->psi_vyx[j][h1][k];
-                    pml_wfd->psi_vzx[j][h1][k] =
-                        pml_coeff->b_x_half[h1] * pml_wfd->psi_vzx[j][h1][k] + pml_coeff->a_x_half[h1] * vzx;
-                    vzx = vzx / pml_coeff->K_x_half[h1] + pml_wfd->psi_vzx[j][h1][k];
+                    pml_wfd.psi_vxx[j, h1, k] =
+                        pml_coeff->b_x[h1] * pml_wfd.psi_vxx[j, h1, k] + pml_coeff->a_x[h1] * vxx;
+                    vxx = vxx / pml_coeff->K_x[h1] + pml_wfd.psi_vxx[j, h1, k];
+                    pml_wfd.psi_vyx[j, h1, k] =
+                        pml_coeff->b_x_half[h1] * pml_wfd.psi_vyx[j, h1, k] + pml_coeff->a_x_half[h1] * vyx;
+                    vyx = vyx / pml_coeff->K_x_half[h1] + pml_wfd.psi_vyx[j, h1, k];
+                    pml_wfd.psi_vzx[j, h1, k] =
+                        pml_coeff->b_x_half[h1] * pml_wfd.psi_vzx[j, h1, k] + pml_coeff->a_x_half[h1] * vzx;
+                    vzx = vzx / pml_coeff->K_x_half[h1] + pml_wfd.psi_vzx[j, h1, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_vxy[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_vxy[j][i][k] + pml_coeff->a_y_half[j] * vxy;
-                        vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd->psi_vxy[j][i][k];
-                        pml_wfd->psi_vyy[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
-                        pml_wfd->psi_vzy[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_vzy[j][i][k] + pml_coeff->a_y_half[j] * vzy;
-                        vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd->psi_vzy[j][i][k];
+                        pml_wfd.psi_vxy[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_vxy[j, i, k] + pml_coeff->a_y_half[j] * vxy;
+                        vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd.psi_vxy[j, i, k];
+                        pml_wfd.psi_vyy[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                        vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
+                        pml_wfd.psi_vzy[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_vzy[j, i, k] + pml_coeff->a_y_half[j] * vzy;
+                        vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd.psi_vzy[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
 
-                        pml_wfd->psi_vxy[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_vxy[h1][i][k] + pml_coeff->a_y_half[h1] * vxy;
-                        vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vxy[h1][i][k];
-                        pml_wfd->psi_vyy[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
-                        pml_wfd->psi_vzy[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_vzy[h1][i][k] + pml_coeff->a_y_half[h1] * vzy;
-                        vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vzy[h1][i][k];
+                        pml_wfd.psi_vxy[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_vxy[h1, i, k] + pml_coeff->a_y_half[h1] * vxy;
+                        vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vxy[h1, i, k];
+                        pml_wfd.psi_vyy[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                        vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
+                        pml_wfd.psi_vzy[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_vzy[h1, i, k] + pml_coeff->a_y_half[h1] * vzy;
+                        vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vzy[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vxz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vxz[j][i][k] + pml_coeff->a_z_half[k] * vxz;
-                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd->psi_vxz[j][i][k];
-                        pml_wfd->psi_vyz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vyz[j][i][k] + pml_coeff->a_z_half[k] * vyz;
-                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd->psi_vyz[j][i][k];
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vxz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vxz[j, i, k] + pml_coeff->a_z_half[k] * vxz;
+                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd.psi_vxz[j, i, k];
+                        pml_wfd.psi_vyz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vyz[j, i, k] + pml_coeff->a_z_half[k] * vyz;
+                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd.psi_vyz[j, i, k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vxz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vxz[j][i][h1] + pml_coeff->a_z_half[h1] * vxz;
-                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vxz[j][i][h1];
-                        pml_wfd->psi_vyz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vyz[j][i][h1] + pml_coeff->a_z_half[h1] * vyz;
-                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vyz[j][i][h1];
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vxz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vxz[j, i, h1] + pml_coeff->a_z_half[h1] * vxz;
+                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vxz[j, i, h1];
+                        pml_wfd.psi_vyz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vyz[j, i, h1] + pml_coeff->a_z_half[h1] * vyz;
+                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vyz[j, i, h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -283,12 +283,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -302,73 +302,73 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
-
-                    pml_wfd->psi_vxy[j][i][k] =
-                        pml_coeff->b_y_half[j] * pml_wfd->psi_vxy[j][i][k] + pml_coeff->a_y_half[j] * vxy;
-                    vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd->psi_vxy[j][i][k];
-                    pml_wfd->psi_vyy[j][i][k] = pml_coeff->b_y[j] * pml_wfd->psi_vyy[j][i][k] + pml_coeff->a_y[j] * vyy;
-                    vyy = vyy / pml_coeff->K_y[j] + pml_wfd->psi_vyy[j][i][k];
-                    pml_wfd->psi_vzy[j][i][k] =
-                        pml_coeff->b_y_half[j] * pml_wfd->psi_vzy[j][i][k] + pml_coeff->a_y_half[j] * vzy;
-                    vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd->psi_vzy[j][i][k];
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
+
+                    pml_wfd.psi_vxy[j, i, k] =
+                        pml_coeff->b_y_half[j] * pml_wfd.psi_vxy[j, i, k] + pml_coeff->a_y_half[j] * vxy;
+                    vxy = vxy / pml_coeff->K_y_half[j] + pml_wfd.psi_vxy[j, i, k];
+                    pml_wfd.psi_vyy[j, i, k] = pml_coeff->b_y[j] * pml_wfd.psi_vyy[j, i, k] + pml_coeff->a_y[j] * vyy;
+                    vyy = vyy / pml_coeff->K_y[j] + pml_wfd.psi_vyy[j, i, k];
+                    pml_wfd.psi_vzy[j, i, k] =
+                        pml_coeff->b_y_half[j] * pml_wfd.psi_vzy[j, i, k] + pml_coeff->a_y_half[j] * vzy;
+                    vzy = vzy / pml_coeff->K_y_half[j] + pml_wfd.psi_vzy[j, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vxz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vxz[j][i][k] + pml_coeff->a_z_half[k] * vxz;
-                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd->psi_vxz[j][i][k];
-                        pml_wfd->psi_vyz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vyz[j][i][k] + pml_coeff->a_z_half[k] * vyz;
-                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd->psi_vyz[j][i][k];
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vxz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vxz[j, i, k] + pml_coeff->a_z_half[k] * vxz;
+                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd.psi_vxz[j, i, k];
+                        pml_wfd.psi_vyz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vyz[j, i, k] + pml_coeff->a_z_half[k] * vyz;
+                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd.psi_vyz[j, i, k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vxz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vxz[j][i][h1] + pml_coeff->a_z_half[h1] * vxz;
-                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vxz[j][i][h1];
-                        pml_wfd->psi_vyz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vyz[j][i][h1] + pml_coeff->a_z_half[h1] * vyz;
-                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vyz[j][i][h1];
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vxz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vxz[j, i, h1] + pml_coeff->a_z_half[h1] * vxz;
+                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vxz[j, i, h1];
+                        pml_wfd.psi_vyz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vyz[j, i, h1] + pml_coeff->a_z_half[h1] * vyz;
+                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vyz[j, i, h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -378,12 +378,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -395,76 +395,76 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
 
                     h1 = (j - nb->ny2 + gv->FW);
 
-                    pml_wfd->psi_vxy[h1][i][k] =
-                        pml_coeff->b_y_half[h1] * pml_wfd->psi_vxy[h1][i][k] + pml_coeff->a_y_half[h1] * vxy;
-                    vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vxy[h1][i][k];
-                    pml_wfd->psi_vyy[h1][i][k] =
-                        pml_coeff->b_y[h1] * pml_wfd->psi_vyy[h1][i][k] + pml_coeff->a_y[h1] * vyy;
-                    vyy = vyy / pml_coeff->K_y[h1] + pml_wfd->psi_vyy[h1][i][k];
-                    pml_wfd->psi_vzy[h1][i][k] =
-                        pml_coeff->b_y_half[h1] * pml_wfd->psi_vzy[h1][i][k] + pml_coeff->a_y_half[h1] * vzy;
-                    vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd->psi_vzy[h1][i][k];
+                    pml_wfd.psi_vxy[h1, i, k] =
+                        pml_coeff->b_y_half[h1] * pml_wfd.psi_vxy[h1, i, k] + pml_coeff->a_y_half[h1] * vxy;
+                    vxy = vxy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vxy[h1, i, k];
+                    pml_wfd.psi_vyy[h1, i, k] =
+                        pml_coeff->b_y[h1] * pml_wfd.psi_vyy[h1, i, k] + pml_coeff->a_y[h1] * vyy;
+                    vyy = vyy / pml_coeff->K_y[h1] + pml_wfd.psi_vyy[h1, i, k];
+                    pml_wfd.psi_vzy[h1, i, k] =
+                        pml_coeff->b_y_half[h1] * pml_wfd.psi_vzy[h1, i, k] + pml_coeff->a_y_half[h1] * vzy;
+                    vzy = vzy / pml_coeff->K_y_half[h1] + pml_wfd.psi_vzy[h1, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_vxz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vxz[j][i][k] + pml_coeff->a_z_half[k] * vxz;
-                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd->psi_vxz[j][i][k];
-                        pml_wfd->psi_vyz[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_vyz[j][i][k] + pml_coeff->a_z_half[k] * vyz;
-                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd->psi_vyz[j][i][k];
-                        pml_wfd->psi_vzz[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
+                        pml_wfd.psi_vxz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vxz[j, i, k] + pml_coeff->a_z_half[k] * vxz;
+                        vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd.psi_vxz[j, i, k];
+                        pml_wfd.psi_vyz[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_vyz[j, i, k] + pml_coeff->a_z_half[k] * vyz;
+                        vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd.psi_vyz[j, i, k];
+                        pml_wfd.psi_vzz[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                        vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
 
-                        pml_wfd->psi_vxz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vxz[j][i][h1] + pml_coeff->a_z_half[h1] * vxz;
-                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vxz[j][i][h1];
-                        pml_wfd->psi_vyz[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_vyz[j][i][h1] + pml_coeff->a_z_half[h1] * vyz;
-                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vyz[j][i][h1];
-                        pml_wfd->psi_vzz[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
+                        pml_wfd.psi_vxz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vxz[j, i, h1] + pml_coeff->a_z_half[h1] * vxz;
+                        vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vxz[j, i, h1];
+                        pml_wfd.psi_vyz[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_vyz[j, i, h1] + pml_coeff->a_z_half[h1] * vyz;
+                        vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vyz[j, i, h1];
+                        pml_wfd.psi_vzz[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                        vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
                     }
 
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -474,12 +474,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -493,47 +493,47 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = 1; k <= gv->FW; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
-
-                    pml_wfd->psi_vxz[j][i][k] =
-                        pml_coeff->b_z_half[k] * pml_wfd->psi_vxz[j][i][k] + pml_coeff->a_z_half[k] * vxz;
-                    vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd->psi_vxz[j][i][k];
-                    pml_wfd->psi_vyz[j][i][k] =
-                        pml_coeff->b_z_half[k] * pml_wfd->psi_vyz[j][i][k] + pml_coeff->a_z_half[k] * vyz;
-                    vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd->psi_vyz[j][i][k];
-                    pml_wfd->psi_vzz[j][i][k] = pml_coeff->b_z[k] * pml_wfd->psi_vzz[j][i][k] + pml_coeff->a_z[k] * vzz;
-                    vzz = vzz / pml_coeff->K_y[k] + pml_wfd->psi_vzz[j][i][k];
-
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
+
+                    pml_wfd.psi_vxz[j, i, k] =
+                        pml_coeff->b_z_half[k] * pml_wfd.psi_vxz[j, i, k] + pml_coeff->a_z_half[k] * vxz;
+                    vxz = vxz / pml_coeff->K_y_half[k] + pml_wfd.psi_vxz[j, i, k];
+                    pml_wfd.psi_vyz[j, i, k] =
+                        pml_coeff->b_z_half[k] * pml_wfd.psi_vyz[j, i, k] + pml_coeff->a_z_half[k] * vyz;
+                    vyz = vyz / pml_coeff->K_y_half[k] + pml_wfd.psi_vyz[j, i, k];
+                    pml_wfd.psi_vzz[j, i, k] = pml_coeff->b_z[k] * pml_wfd.psi_vzz[j, i, k] + pml_coeff->a_z[k] * vzz;
+                    vzz = vzz / pml_coeff->K_y[k] + pml_wfd.psi_vzz[j, i, k];
+
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -543,12 +543,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -560,50 +560,50 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = nb->nz2 + 1; k <= nb->nz2 + gv->FW; k++) {
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
 
                     h1 = (k - nb->nz2 + gv->FW);
 
-                    pml_wfd->psi_vxz[j][i][h1] =
-                        pml_coeff->b_z_half[h1] * pml_wfd->psi_vxz[j][i][h1] + pml_coeff->a_z_half[h1] * vxz;
-                    vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vxz[j][i][h1];
-                    pml_wfd->psi_vyz[j][i][h1] =
-                        pml_coeff->b_z_half[h1] * pml_wfd->psi_vyz[j][i][h1] + pml_coeff->a_z_half[h1] * vyz;
-                    vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd->psi_vyz[j][i][h1];
-                    pml_wfd->psi_vzz[j][i][h1] =
-                        pml_coeff->b_z[h1] * pml_wfd->psi_vzz[j][i][h1] + pml_coeff->a_z[h1] * vzz;
-                    vzz = vzz / pml_coeff->K_z[h1] + pml_wfd->psi_vzz[j][i][h1];
-
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    pml_wfd.psi_vxz[j, i, h1] =
+                        pml_coeff->b_z_half[h1] * pml_wfd.psi_vxz[j, i, h1] + pml_coeff->a_z_half[h1] * vxz;
+                    vxz = vxz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vxz[j, i, h1];
+                    pml_wfd.psi_vyz[j, i, h1] =
+                        pml_coeff->b_z_half[h1] * pml_wfd.psi_vyz[j, i, h1] + pml_coeff->a_z_half[h1] * vyz;
+                    vyz = vyz / pml_coeff->K_z_half[h1] + pml_wfd.psi_vyz[j, i, h1];
+                    pml_wfd.psi_vzz[j, i, h1] =
+                        pml_coeff->b_z[h1] * pml_wfd.psi_vzz[j, i, h1] + pml_coeff->a_z[h1] * vzz;
+                    vzz = vzz / pml_coeff->K_z[h1] + pml_wfd.psi_vzz[j, i, h1];
+
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -613,12 +613,12 @@ double update_s_CPML_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
diff --git a/src/update_s_ssg_acoustic.cpp b/src/update_s_ssg_acoustic.cpp
index b7528d01a4e58d591f6b3e8fdaa869a382dd3499..cba7bac7f1f0887f4a9f0199119d421ddb649039 100644
--- a/src/update_s_ssg_acoustic.cpp
+++ b/src/update_s_ssg_acoustic.cpp
@@ -27,8 +27,8 @@
 
 #define UNUSED(x) (void)(x)
 
-double update_s_acoustic(st_boundary *nb, st_velocity *vel,
-                         st_stress *stress, st_model *mod, const GlobVar *gv)
+double update_s_acoustic(st_boundary *nb, st_velocity &vel,
+                         st_stress &stress, st_model &mod, const GlobVar *gv)
 {
     float vxx, vyy, vzz;
     float vxxyyzz;
@@ -46,10 +46,10 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    float vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * oodx;
-                    float vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * oody;
-                    float vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * oodz;
-                    stress->sp[j][i][k] += gv->DT * mod->pi[j][i][k] * (vxx + vyy + vzz);
+                    float vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * oodx;
+                    float vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * oody;
+                    float vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * oodz;
+                    stress.sp[j, i, k] += gv->DT * mod.pi[j, i, k] * (vxx + vyy + vzz);
                 }
             }
         }
@@ -68,15 +68,15 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
                     float vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     float vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     float vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
-                    stress->sp[j][i][k] += gv->DT * mod->pi[j][i][k] * (vxx + vyy + vzz);
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
+                    stress.sp[j, i, k] += gv->DT * mod.pi[j, i, k] * (vxx + vyy + vzz);
                 }
             }
         }
@@ -100,23 +100,23 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k])) * oodx;
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k])) * oodx;
 
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k])) * oody;
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k])) * oody;
 
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3])) * oodz;
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3])) * oodz;
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -137,33 +137,32 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
 
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
-                float *sp_j_i = stress->sp[j][i];
-                #pragma omp simd nontemporal(sp_j_i)
+                #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k])) * oodx;
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k])) * oodx;
 
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k])) * oody;
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k])) * oody;
 
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4])) * oodz;
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4])) * oodz;
 
                     /* updating components of the stress tensor, partially */
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    sp_j_i[k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -191,29 +190,29 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                           b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k])) * oodx;
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                           b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k])) * oodx;
 
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                           b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k])) * oody;
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                           b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k])) * oody;
 
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                           b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5])) * oodz;
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                           b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5])) * oodz;
 
-                    g = mod->pi[j][i][k];
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    stress->sp[j][i][k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
@@ -241,38 +240,37 @@ double update_s_acoustic(st_boundary *nb, st_velocity *vel,
 
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
-                float *sp_j_i = stress->sp[j][i];
-                #pragma omp simd nontemporal(sp_j_i)
+                #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                           b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k]) +
-                           b6 * (vel->vx[j][i + 5][k] - vel->vx[j][i - 6][k])) * oodx;
-
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                           b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k]) +
-                           b6 * (vel->vy[j + 5][i][k] - vel->vy[j - 6][i][k])) * oody;
-
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                           b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5]) +
-                           b6 * (vel->vz[j][i][k + 5] - vel->vz[j][i][k - 6])) * oodz;
-
-                    g = mod->pi[j][i][k];
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                           b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k]) +
+                           b6 * (vel.vx[j, i + 5, k] - vel.vx[j, i - 6, k])) * oodx;
+
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                           b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k]) +
+                           b6 * (vel.vy[j + 5, i, k] - vel.vy[j - 6, i, k])) * oody;
+
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                           b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5]) +
+                           b6 * (vel.vz[j, i, k + 5] - vel.vz[j, i, k - 6])) * oodz;
+
+                    g = mod.pi[j, i, k];
 
                     vxxyyzz = vxx + vyy + vzz;
 
-                    sp_j_i[k] += gv->DT * (g * vxxyyzz);
+                    stress.sp[j, i, k] += gv->DT * (g * vxxyyzz);
                 }
             }
         }
diff --git a/src/update_s_ssg_elastic.cpp b/src/update_s_ssg_elastic.cpp
index 0728b8d427b7e10c326e395a7b29c3910db5f103..5b0ab21aab816b4496058c1a68c9177a4359eb0f 100644
--- a/src/update_s_ssg_elastic.cpp
+++ b/src/update_s_ssg_elastic.cpp
@@ -28,8 +28,8 @@
 
 #define UNUSED(x) (void)(x)
 
-double update_s_elastic(st_boundary *nb, st_velocity *vel,
-                        st_stress *stress, st_model *mod, st_model_av *mod_av, const GlobVar *gv)
+double update_s_elastic(st_boundary *nb, st_velocity &vel,
+                        st_stress &stress, st_model &mod, st_model_av &mod_av, const GlobVar *gv)
 {
     float vxx, vxy, vxz, vyx, vyy, vyz, vzx, vzy, vzz;
     float vxyyx, vyzzy, vxzzx, vxxyyzz, vyyzz, vxxzz, vxxyy;
@@ -49,30 +49,30 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    vxy = (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) * oody;
-                    vyx = (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) * oodx;
-                    stress->sxy[j][i][k] += mod_av->uipjp[j][i][k] * gv->DT * (vxy + vyx);
-
-                    vyz = (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) * oodz;
-                    vzy = (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) * oody;
-                    stress->syz[j][i][k] += mod_av->ujpkp[j][i][k] * gv->DT * (vyz + vzy);
-
-                    vxz = (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) * oodz;
-                    vzx = (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) * oodx;
-                    stress->sxz[j][i][k] += mod_av->uipkp[j][i][k] * gv->DT * (vxz + vzx);
-
-                    vxx = (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) * oodx;
-                    vyy = (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) * oody;
-                    vzz = (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) * oodz;
-                    stress->sxx[j][i][k] += gv->DT *
-                                            (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] *
-                                             (vyy + vzz));
-                    stress->syy[j][i][k] += gv->DT *
-                                            (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] *
-                                             (vxx + vzz));
-                    stress->szz[j][i][k] += gv->DT *
-                                            (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] *
-                                             (vxx + vyy));
+                    vxy = (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) * oody;
+                    vyx = (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) * oodx;
+                    stress.sxy[j, i, k] += mod_av.uipjp[j, i, k] * gv->DT * (vxy + vyx);
+
+                    vyz = (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) * oodz;
+                    vzy = (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) * oody;
+                    stress.syz[j, i, k] += mod_av.ujpkp[j, i, k] * gv->DT * (vyz + vzy);
+
+                    vxz = (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) * oodz;
+                    vzx = (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) * oodx;
+                    stress.sxz[j, i, k] += mod_av.uipkp[j, i, k] * gv->DT * (vxz + vzx);
+
+                    vxx = (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) * oodx;
+                    vyy = (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) * oody;
+                    vzz = (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) * oodz;
+                    stress.sxx[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vyy + vzz));
+                    stress.syy[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vxx + vzz));
+                    stress.szz[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vxx + vyy));
                 }
             }
         }
@@ -100,53 +100,50 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                             gv->LEVEL2_CACHE_SIZE / (160 * min(nb->nz2 - nb->nz1, 1024)), , 1024)
         for (int j = j_start; j <= j_end; j++) {
             for (int i = i_start; i <= i_end; i++) {
-                float *sxy_j_i = stress->sxy[j][i];
-                float *syz_j_i = stress->syz[j][i];
-                float *sxz_j_i = stress->sxz[j][i];
-                float *sxx_j_i = stress->sxx[j][i];
-                float *syy_j_i = stress->syy[j][i];
-                float *szz_j_i = stress->szz[j][i];
-                #pragma omp simd nontemporal(sxy_j_i, syz_j_i, sxz_j_i, sxx_j_i, syy_j_i, szz_j_i)
+                #pragma omp simd
                 for (int k = k_start; k <= k_end; k++) {
                     vxy =
-                        (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k])) * oody;
+                        (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k])) * oody;
                     vyx =
-                        (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k])) * oodx;
-                    sxy_j_i[k] += mod_av->uipjp[j][i][k] * gv->DT * (vxy + vyx);
+                        (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k])) * oodx;
+                    stress.sxy[j, i, k] += mod_av.uipjp[j, i, k] * gv->DT * (vxy + vyx);
 
                     vyz =
-                        (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                         b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                         b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1])) * oodz;
                     vzy =
-                        (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k])) * oody;
-                    syz_j_i[k] += mod_av->ujpkp[j][i][k] * gv->DT * (vyz + vzy);
+                        (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k])) * oody;
+                    stress.syz[j, i, k] += mod_av.ujpkp[j, i, k] * gv->DT * (vyz + vzy);
 
                     vxz =
-                        (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                         b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1])) * oodz;
+                        (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                         b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1])) * oodz;
                     vzx =
-                        (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                         b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k])) * oodx;
-                    sxz_j_i[k] += mod_av->uipkp[j][i][k] * gv->DT * (vxz + vzx);
+                        (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                         b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k])) * oodx;
+                    stress.sxz[j, i, k] += mod_av.uipkp[j, i, k] * gv->DT * (vxz + vzx);
 
                     vxx =
-                        (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                         b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k])) * oodx;
+                        (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                         b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k])) * oodx;
                     vyy =
-                        (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                         b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k])) * oody;
+                        (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                         b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k])) * oody;
                     vzz =
-                        (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                         b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2])) * oodz;
-                    sxx_j_i[k] += gv->DT *
-                                  (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] * (vyy + vzz));
-                    syy_j_i[k] += gv->DT *
-                                  (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] * (vxx + vzz));
-                    szz_j_i[k] += gv->DT *
-                                  (mod->pi[j][i][k] * (vxx + vyy + vzz) - 2.0f * mod->u[j][i][k] * (vxx + vyy));
+                        (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                         b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2])) * oodz;
+                    stress.sxx[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vyy + vzz));
+                    stress.syy[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vxx + vzz));
+                    stress.szz[j, i, k] += gv->DT *
+                                           (mod.pi[j, i, k] * (vxx + vyy + vzz) - 2.0f * mod.u[j, i, k] *
+                                            (vxx + vyy));
                 }
             }
         }
@@ -171,47 +168,47 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k])) * oodx;
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k])) * oodx;
 
-                    vxy = (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k]) +
-                           b3 * (vel->vx[j + 3][i][k] - vel->vx[j - 2][i][k])) * oody;
+                    vxy = (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k]) +
+                           b3 * (vel.vx[j + 3, i, k] - vel.vx[j - 2, i, k])) * oody;
 
-                    vxz = (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1]) +
-                           b3 * (vel->vx[j][i][k + 3] - vel->vx[j][i][k - 2])) * oodz;
+                    vxz = (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1]) +
+                           b3 * (vel.vx[j, i, k + 3] - vel.vx[j, i, k - 2])) * oodz;
 
-                    vyx = (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k]) +
-                           b3 * (vel->vy[j][i + 3][k] - vel->vy[j][i - 2][k])) * oodx;
+                    vyx = (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k]) +
+                           b3 * (vel.vy[j, i + 3, k] - vel.vy[j, i - 2, k])) * oodx;
 
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k])) * oody;
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k])) * oody;
 
-                    vyz = (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1]) +
-                           b3 * (vel->vy[j][i][k + 3] - vel->vy[j][i][k - 2])) * oodz;
+                    vyz = (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1]) +
+                           b3 * (vel.vy[j, i, k + 3] - vel.vy[j, i, k - 2])) * oodz;
 
-                    vzx = (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k]) +
-                           b3 * (vel->vz[j][i + 3][k] - vel->vz[j][i - 2][k])) * oodx;
+                    vzx = (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k]) +
+                           b3 * (vel.vz[j, i + 3, k] - vel.vz[j, i - 2, k])) * oodx;
 
-                    vzy = (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k]) +
-                           b3 * (vel->vz[j + 3][i][k] - vel->vz[j - 2][i][k])) * oody;
+                    vzy = (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k]) +
+                           b3 * (vel.vz[j + 3, i, k] - vel.vz[j - 2, i, k])) * oody;
 
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3])) * oodz;
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3])) * oodz;
 
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -221,12 +218,12 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -252,57 +249,57 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k])) * oodx;
-
-                    vxy = (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k]) +
-                           b3 * (vel->vx[j + 3][i][k] - vel->vx[j - 2][i][k]) +
-                           b4 * (vel->vx[j + 4][i][k] - vel->vx[j - 3][i][k])) * oody;
-
-                    vxz = (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1]) +
-                           b3 * (vel->vx[j][i][k + 3] - vel->vx[j][i][k - 2]) +
-                           b4 * (vel->vx[j][i][k + 4] - vel->vx[j][i][k - 3])) * oodz;
-
-                    vyx = (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k]) +
-                           b3 * (vel->vy[j][i + 3][k] - vel->vy[j][i - 2][k]) +
-                           b4 * (vel->vy[j][i + 4][k] - vel->vy[j][i - 3][k])) * oodx;
-
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k])) * oody;
-
-                    vyz = (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1]) +
-                           b3 * (vel->vy[j][i][k + 3] - vel->vy[j][i][k - 2]) +
-                           b4 * (vel->vy[j][i][k + 4] - vel->vy[j][i][k - 3])) * oodz;
-
-                    vzx = (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k]) +
-                           b3 * (vel->vz[j][i + 3][k] - vel->vz[j][i - 2][k]) +
-                           b4 * (vel->vz[j][i + 4][k] - vel->vz[j][i - 3][k])) * oodx;
-
-                    vzy = (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k]) +
-                           b3 * (vel->vz[j + 3][i][k] - vel->vz[j - 2][i][k]) +
-                           b4 * (vel->vz[j + 4][i][k] - vel->vz[j - 3][i][k])) * oody;
-
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4])) * oodz;
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k])) * oodx;
+
+                    vxy = (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k]) +
+                           b3 * (vel.vx[j + 3, i, k] - vel.vx[j - 2, i, k]) +
+                           b4 * (vel.vx[j + 4, i, k] - vel.vx[j - 3, i, k])) * oody;
+
+                    vxz = (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1]) +
+                           b3 * (vel.vx[j, i, k + 3] - vel.vx[j, i, k - 2]) +
+                           b4 * (vel.vx[j, i, k + 4] - vel.vx[j, i, k - 3])) * oodz;
+
+                    vyx = (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k]) +
+                           b3 * (vel.vy[j, i + 3, k] - vel.vy[j, i - 2, k]) +
+                           b4 * (vel.vy[j, i + 4, k] - vel.vy[j, i - 3, k])) * oodx;
+
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k])) * oody;
+
+                    vyz = (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1]) +
+                           b3 * (vel.vy[j, i, k + 3] - vel.vy[j, i, k - 2]) +
+                           b4 * (vel.vy[j, i, k + 4] - vel.vy[j, i, k - 3])) * oodz;
+
+                    vzx = (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k]) +
+                           b3 * (vel.vz[j, i + 3, k] - vel.vz[j, i - 2, k]) +
+                           b4 * (vel.vz[j, i + 4, k] - vel.vz[j, i - 3, k])) * oodx;
+
+                    vzy = (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k]) +
+                           b3 * (vel.vz[j + 3, i, k] - vel.vz[j - 2, i, k]) +
+                           b4 * (vel.vz[j + 4, i, k] - vel.vz[j - 3, i, k])) * oody;
+
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4])) * oodz;
 
                     /* updating components of the stress tensor, partially */
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -312,12 +309,12 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -345,65 +342,65 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                           b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k])) * oodx;
-
-                    vxy = (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k]) +
-                           b3 * (vel->vx[j + 3][i][k] - vel->vx[j - 2][i][k]) +
-                           b4 * (vel->vx[j + 4][i][k] - vel->vx[j - 3][i][k]) +
-                           b5 * (vel->vx[j + 5][i][k] - vel->vx[j - 4][i][k])) * oody;
-
-                    vxz = (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1]) +
-                           b3 * (vel->vx[j][i][k + 3] - vel->vx[j][i][k - 2]) +
-                           b4 * (vel->vx[j][i][k + 4] - vel->vx[j][i][k - 3]) +
-                           b5 * (vel->vx[j][i][k + 5] - vel->vx[j][i][k - 4])) * oodz;
-
-                    vyx = (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k]) +
-                           b3 * (vel->vy[j][i + 3][k] - vel->vy[j][i - 2][k]) +
-                           b4 * (vel->vy[j][i + 4][k] - vel->vy[j][i - 3][k]) +
-                           b5 * (vel->vy[j][i + 5][k] - vel->vy[j][i - 4][k])) * oodx;
-
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                           b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k])) * oody;
-
-                    vyz = (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1]) +
-                           b3 * (vel->vy[j][i][k + 3] - vel->vy[j][i][k - 2]) +
-                           b4 * (vel->vy[j][i][k + 4] - vel->vy[j][i][k - 3]) +
-                           b5 * (vel->vy[j][i][k + 5] - vel->vy[j][i][k - 4])) * oodz;
-
-                    vzx = (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k]) +
-                           b3 * (vel->vz[j][i + 3][k] - vel->vz[j][i - 2][k]) +
-                           b4 * (vel->vz[j][i + 4][k] - vel->vz[j][i - 3][k]) +
-                           b5 * (vel->vz[j][i + 5][k] - vel->vz[j][i - 4][k])) * oodx;
-
-                    vzy = (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k]) +
-                           b3 * (vel->vz[j + 3][i][k] - vel->vz[j - 2][i][k]) +
-                           b4 * (vel->vz[j + 4][i][k] - vel->vz[j - 3][i][k]) +
-                           b5 * (vel->vz[j + 5][i][k] - vel->vz[j - 4][i][k])) * oody;
-
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                           b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5])) * oodz;
-
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                           b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k])) * oodx;
+
+                    vxy = (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k]) +
+                           b3 * (vel.vx[j + 3, i, k] - vel.vx[j - 2, i, k]) +
+                           b4 * (vel.vx[j + 4, i, k] - vel.vx[j - 3, i, k]) +
+                           b5 * (vel.vx[j + 5, i, k] - vel.vx[j - 4, i, k])) * oody;
+
+                    vxz = (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1]) +
+                           b3 * (vel.vx[j, i, k + 3] - vel.vx[j, i, k - 2]) +
+                           b4 * (vel.vx[j, i, k + 4] - vel.vx[j, i, k - 3]) +
+                           b5 * (vel.vx[j, i, k + 5] - vel.vx[j, i, k - 4])) * oodz;
+
+                    vyx = (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k]) +
+                           b3 * (vel.vy[j, i + 3, k] - vel.vy[j, i - 2, k]) +
+                           b4 * (vel.vy[j, i + 4, k] - vel.vy[j, i - 3, k]) +
+                           b5 * (vel.vy[j, i + 5, k] - vel.vy[j, i - 4, k])) * oodx;
+
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                           b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k])) * oody;
+
+                    vyz = (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1]) +
+                           b3 * (vel.vy[j, i, k + 3] - vel.vy[j, i, k - 2]) +
+                           b4 * (vel.vy[j, i, k + 4] - vel.vy[j, i, k - 3]) +
+                           b5 * (vel.vy[j, i, k + 5] - vel.vy[j, i, k - 4])) * oodz;
+
+                    vzx = (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k]) +
+                           b3 * (vel.vz[j, i + 3, k] - vel.vz[j, i - 2, k]) +
+                           b4 * (vel.vz[j, i + 4, k] - vel.vz[j, i - 3, k]) +
+                           b5 * (vel.vz[j, i + 5, k] - vel.vz[j, i - 4, k])) * oodx;
+
+                    vzy = (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k]) +
+                           b3 * (vel.vz[j + 3, i, k] - vel.vz[j - 2, i, k]) +
+                           b4 * (vel.vz[j + 4, i, k] - vel.vz[j - 3, i, k]) +
+                           b5 * (vel.vz[j + 5, i, k] - vel.vz[j - 4, i, k])) * oody;
+
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                           b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5])) * oodz;
+
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -413,12 +410,12 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
@@ -451,74 +448,74 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     /* spatial derivatives of the components of the velocities
                      * are computed */
 
-                    vxx = (b1 * (vel->vx[j][i][k] - vel->vx[j][i - 1][k]) +
-                           b2 * (vel->vx[j][i + 1][k] - vel->vx[j][i - 2][k]) +
-                           b3 * (vel->vx[j][i + 2][k] - vel->vx[j][i - 3][k]) +
-                           b4 * (vel->vx[j][i + 3][k] - vel->vx[j][i - 4][k]) +
-                           b5 * (vel->vx[j][i + 4][k] - vel->vx[j][i - 5][k]) +
-                           b6 * (vel->vx[j][i + 5][k] - vel->vx[j][i - 6][k])) * oodx;
-
-                    vxy = (b1 * (vel->vx[j + 1][i][k] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j + 2][i][k] - vel->vx[j - 1][i][k]) +
-                           b3 * (vel->vx[j + 3][i][k] - vel->vx[j - 2][i][k]) +
-                           b4 * (vel->vx[j + 4][i][k] - vel->vx[j - 3][i][k]) +
-                           b5 * (vel->vx[j + 5][i][k] - vel->vx[j - 4][i][k]) +
-                           b6 * (vel->vx[j + 6][i][k] - vel->vx[j - 5][i][k])) * oody;
-
-                    vxz = (b1 * (vel->vx[j][i][k + 1] - vel->vx[j][i][k]) +
-                           b2 * (vel->vx[j][i][k + 2] - vel->vx[j][i][k - 1]) +
-                           b3 * (vel->vx[j][i][k + 3] - vel->vx[j][i][k - 2]) +
-                           b4 * (vel->vx[j][i][k + 4] - vel->vx[j][i][k - 3]) +
-                           b5 * (vel->vx[j][i][k + 5] - vel->vx[j][i][k - 4]) +
-                           b6 * (vel->vx[j][i][k + 6] - vel->vx[j][i][k - 5])) * oodz;
-
-                    vyx = (b1 * (vel->vy[j][i + 1][k] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i + 2][k] - vel->vy[j][i - 1][k]) +
-                           b3 * (vel->vy[j][i + 3][k] - vel->vy[j][i - 2][k]) +
-                           b4 * (vel->vy[j][i + 4][k] - vel->vy[j][i - 3][k]) +
-                           b5 * (vel->vy[j][i + 5][k] - vel->vy[j][i - 4][k]) +
-                           b6 * (vel->vy[j][i + 6][k] - vel->vy[j][i - 5][k])) * oodx;
-
-                    vyy = (b1 * (vel->vy[j][i][k] - vel->vy[j - 1][i][k]) +
-                           b2 * (vel->vy[j + 1][i][k] - vel->vy[j - 2][i][k]) +
-                           b3 * (vel->vy[j + 2][i][k] - vel->vy[j - 3][i][k]) +
-                           b4 * (vel->vy[j + 3][i][k] - vel->vy[j - 4][i][k]) +
-                           b5 * (vel->vy[j + 4][i][k] - vel->vy[j - 5][i][k]) +
-                           b6 * (vel->vy[j + 5][i][k] - vel->vy[j - 6][i][k])) * oody;
-
-                    vyz = (b1 * (vel->vy[j][i][k + 1] - vel->vy[j][i][k]) +
-                           b2 * (vel->vy[j][i][k + 2] - vel->vy[j][i][k - 1]) +
-                           b3 * (vel->vy[j][i][k + 3] - vel->vy[j][i][k - 2]) +
-                           b4 * (vel->vy[j][i][k + 4] - vel->vy[j][i][k - 3]) +
-                           b5 * (vel->vy[j][i][k + 5] - vel->vy[j][i][k - 4]) +
-                           b6 * (vel->vy[j][i][k + 6] - vel->vy[j][i][k - 5])) * oodz;
-
-                    vzx = (b1 * (vel->vz[j][i + 1][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j][i + 2][k] - vel->vz[j][i - 1][k]) +
-                           b3 * (vel->vz[j][i + 3][k] - vel->vz[j][i - 2][k]) +
-                           b4 * (vel->vz[j][i + 4][k] - vel->vz[j][i - 3][k]) +
-                           b5 * (vel->vz[j][i + 5][k] - vel->vz[j][i - 4][k]) +
-                           b6 * (vel->vz[j][i + 6][k] - vel->vz[j][i - 5][k])) * oodx;
-
-                    vzy = (b1 * (vel->vz[j + 1][i][k] - vel->vz[j][i][k]) +
-                           b2 * (vel->vz[j + 2][i][k] - vel->vz[j - 1][i][k]) +
-                           b3 * (vel->vz[j + 3][i][k] - vel->vz[j - 2][i][k]) +
-                           b4 * (vel->vz[j + 4][i][k] - vel->vz[j - 3][i][k]) +
-                           b5 * (vel->vz[j + 5][i][k] - vel->vz[j - 4][i][k]) +
-                           b6 * (vel->vz[j + 6][i][k] - vel->vz[j - 5][i][k])) * oody;
-
-                    vzz = (b1 * (vel->vz[j][i][k] - vel->vz[j][i][k - 1]) +
-                           b2 * (vel->vz[j][i][k + 1] - vel->vz[j][i][k - 2]) +
-                           b3 * (vel->vz[j][i][k + 2] - vel->vz[j][i][k - 3]) +
-                           b4 * (vel->vz[j][i][k + 3] - vel->vz[j][i][k - 4]) +
-                           b5 * (vel->vz[j][i][k + 4] - vel->vz[j][i][k - 5]) +
-                           b6 * (vel->vz[j][i][k + 5] - vel->vz[j][i][k - 6])) * oodz;
-
-                    fipjp = mod_av->uipjp[j][i][k] * gv->DT;
-                    fjpkp = mod_av->ujpkp[j][i][k] * gv->DT;
-                    fipkp = mod_av->uipkp[j][i][k] * gv->DT;
-                    g = mod->pi[j][i][k];
-                    f = 2.0f * mod->u[j][i][k];
+                    vxx = (b1 * (vel.vx[j, i, k] - vel.vx[j, i - 1, k]) +
+                           b2 * (vel.vx[j, i + 1, k] - vel.vx[j, i - 2, k]) +
+                           b3 * (vel.vx[j, i + 2, k] - vel.vx[j, i - 3, k]) +
+                           b4 * (vel.vx[j, i + 3, k] - vel.vx[j, i - 4, k]) +
+                           b5 * (vel.vx[j, i + 4, k] - vel.vx[j, i - 5, k]) +
+                           b6 * (vel.vx[j, i + 5, k] - vel.vx[j, i - 6, k])) * oodx;
+
+                    vxy = (b1 * (vel.vx[j + 1, i, k] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j + 2, i, k] - vel.vx[j - 1, i, k]) +
+                           b3 * (vel.vx[j + 3, i, k] - vel.vx[j - 2, i, k]) +
+                           b4 * (vel.vx[j + 4, i, k] - vel.vx[j - 3, i, k]) +
+                           b5 * (vel.vx[j + 5, i, k] - vel.vx[j - 4, i, k]) +
+                           b6 * (vel.vx[j + 6, i, k] - vel.vx[j - 5, i, k])) * oody;
+
+                    vxz = (b1 * (vel.vx[j, i, k + 1] - vel.vx[j, i, k]) +
+                           b2 * (vel.vx[j, i, k + 2] - vel.vx[j, i, k - 1]) +
+                           b3 * (vel.vx[j, i, k + 3] - vel.vx[j, i, k - 2]) +
+                           b4 * (vel.vx[j, i, k + 4] - vel.vx[j, i, k - 3]) +
+                           b5 * (vel.vx[j, i, k + 5] - vel.vx[j, i, k - 4]) +
+                           b6 * (vel.vx[j, i, k + 6] - vel.vx[j, i, k - 5])) * oodz;
+
+                    vyx = (b1 * (vel.vy[j, i + 1, k] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i + 2, k] - vel.vy[j, i - 1, k]) +
+                           b3 * (vel.vy[j, i + 3, k] - vel.vy[j, i - 2, k]) +
+                           b4 * (vel.vy[j, i + 4, k] - vel.vy[j, i - 3, k]) +
+                           b5 * (vel.vy[j, i + 5, k] - vel.vy[j, i - 4, k]) +
+                           b6 * (vel.vy[j, i + 6, k] - vel.vy[j, i - 5, k])) * oodx;
+
+                    vyy = (b1 * (vel.vy[j, i, k] - vel.vy[j - 1, i, k]) +
+                           b2 * (vel.vy[j + 1, i, k] - vel.vy[j - 2, i, k]) +
+                           b3 * (vel.vy[j + 2, i, k] - vel.vy[j - 3, i, k]) +
+                           b4 * (vel.vy[j + 3, i, k] - vel.vy[j - 4, i, k]) +
+                           b5 * (vel.vy[j + 4, i, k] - vel.vy[j - 5, i, k]) +
+                           b6 * (vel.vy[j + 5, i, k] - vel.vy[j - 6, i, k])) * oody;
+
+                    vyz = (b1 * (vel.vy[j, i, k + 1] - vel.vy[j, i, k]) +
+                           b2 * (vel.vy[j, i, k + 2] - vel.vy[j, i, k - 1]) +
+                           b3 * (vel.vy[j, i, k + 3] - vel.vy[j, i, k - 2]) +
+                           b4 * (vel.vy[j, i, k + 4] - vel.vy[j, i, k - 3]) +
+                           b5 * (vel.vy[j, i, k + 5] - vel.vy[j, i, k - 4]) +
+                           b6 * (vel.vy[j, i, k + 6] - vel.vy[j, i, k - 5])) * oodz;
+
+                    vzx = (b1 * (vel.vz[j, i + 1, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j, i + 2, k] - vel.vz[j, i - 1, k]) +
+                           b3 * (vel.vz[j, i + 3, k] - vel.vz[j, i - 2, k]) +
+                           b4 * (vel.vz[j, i + 4, k] - vel.vz[j, i - 3, k]) +
+                           b5 * (vel.vz[j, i + 5, k] - vel.vz[j, i - 4, k]) +
+                           b6 * (vel.vz[j, i + 6, k] - vel.vz[j, i - 5, k])) * oodx;
+
+                    vzy = (b1 * (vel.vz[j + 1, i, k] - vel.vz[j, i, k]) +
+                           b2 * (vel.vz[j + 2, i, k] - vel.vz[j - 1, i, k]) +
+                           b3 * (vel.vz[j + 3, i, k] - vel.vz[j - 2, i, k]) +
+                           b4 * (vel.vz[j + 4, i, k] - vel.vz[j - 3, i, k]) +
+                           b5 * (vel.vz[j + 5, i, k] - vel.vz[j - 4, i, k]) +
+                           b6 * (vel.vz[j + 6, i, k] - vel.vz[j - 5, i, k])) * oody;
+
+                    vzz = (b1 * (vel.vz[j, i, k] - vel.vz[j, i, k - 1]) +
+                           b2 * (vel.vz[j, i, k + 1] - vel.vz[j, i, k - 2]) +
+                           b3 * (vel.vz[j, i, k + 2] - vel.vz[j, i, k - 3]) +
+                           b4 * (vel.vz[j, i, k + 3] - vel.vz[j, i, k - 4]) +
+                           b5 * (vel.vz[j, i, k + 4] - vel.vz[j, i, k - 5]) +
+                           b6 * (vel.vz[j, i, k + 5] - vel.vz[j, i, k - 6])) * oodz;
+
+                    fipjp = mod_av.uipjp[j, i, k] * gv->DT;
+                    fjpkp = mod_av.ujpkp[j, i, k] * gv->DT;
+                    fipkp = mod_av.uipkp[j, i, k] * gv->DT;
+                    g = mod.pi[j, i, k];
+                    f = 2.0f * mod.u[j, i, k];
 
                     vxyyx = vxy + vyx;
                     vyzzy = vyz + vzy;
@@ -528,12 +525,12 @@ double update_s_elastic(st_boundary *nb, st_velocity *vel,
                     vxxzz = vxx + vzz;
                     vxxyy = vxx + vyy;
 
-                    stress->sxy[j][i][k] += (fipjp * vxyyx);
-                    stress->syz[j][i][k] += (fjpkp * vyzzy);
-                    stress->sxz[j][i][k] += (fipkp * vxzzx);
-                    stress->sxx[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
-                    stress->syy[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
-                    stress->szz[j][i][k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
+                    stress.sxy[j, i, k] += (fipjp * vxyyx);
+                    stress.syz[j, i, k] += (fjpkp * vyzzy);
+                    stress.sxz[j, i, k] += (fipkp * vxzzx);
+                    stress.sxx[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vyyzz));
+                    stress.syy[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxzz));
+                    stress.szz[j, i, k] += gv->DT * ((g * vxxyyzz) - (f * vxxyy));
                 }
             }
         }
diff --git a/src/update_v_ssg.cpp b/src/update_v_ssg.cpp
index 11fc65b0b4a1af5733c10c05046daac0d4159539..b5037a1b838304dea2f1a6bbe0906dec6806c852 100644
--- a/src/update_v_ssg.cpp
+++ b/src/update_v_ssg.cpp
@@ -25,8 +25,8 @@
 #include "fd.hpp"
 #include "loop_blocking.hpp"
 
-void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *__restrict__ stress, st_model_av *mod_av,
-              float ***absorb_coeff, const GlobVar *gv)
+void update_v(const st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+    float3DTensorT &absorb_coeff, const GlobVar *gv)
 {
     float b1, b2, b3, b4, b5, b6;
     float sxx_x, sxy_y, sxz_z, syy_y, sxy_x, syz_z;
@@ -42,10 +42,10 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sxx_x = dx * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]);
-                    sxy_y = dy * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]);
-                    sxz_z = dz * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]);
-                    vel->vx[j][i][k] += ((sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k]);
+                    sxx_x = dx * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]);
+                    sxy_y = dy * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]);
+                    sxz_z = dz * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]);
+                    vel.vx[j, i, k] += ((sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k]);
                 }
             }
         }
@@ -53,10 +53,10 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    syy_y = dy * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]);
-                    sxy_x = dx * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]);
-                    syz_z = dz * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]);
-                    vel->vy[j][i][k] += ((syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k]);
+                    syy_y = dy * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]);
+                    sxy_x = dx * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]);
+                    syz_z = dz * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]);
+                    vel.vy[j, i, k] += ((syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k]);
                 }
             }
         }
@@ -64,10 +64,10 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    szz_z = dz * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]);
-                    sxz_x = dx * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]);
-                    syz_y = dy * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]);
-                    vel->vz[j][i][k] += ((szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k]);
+                    szz_z = dz * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]);
+                    sxz_x = dx * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]);
+                    syz_y = dy * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]);
+                    vel.vz[j, i, k] += ((szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k]);
                 }
             }
         }
@@ -96,43 +96,40 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
                             gv->LEVEL2_CACHE_SIZE / (160 * min(nb->nz2 - nb->nz1, 1024)), , 1024)
         for (int j = j_start; j <= j_end; j++) {
             for (int i = i_start; i <= i_end; i++) {
-                float *vx_j_i = vel->vx[j][i];
-                float *vy_j_i = vel->vy[j][i];
-                float *vz_j_i = vel->vz[j][i];
-                #pragma omp simd nontemporal(vx_j_i, vy_j_i, vz_j_i)
+                #pragma omp simd
                 for (int k = k_start; k <= k_end; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
-                    vx_j_i[k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
 
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
-                    vy_j_i[k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
 
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
-                    vz_j_i[k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -152,37 +149,37 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sxx_x = dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                                  b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]) +
-                                  b3 * (stress->sxx[j][i + 3][k] - stress->sxx[j][i - 2][k]));
-                    sxy_y = dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                                  b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]) +
-                                  b3 * (stress->sxy[j + 2][i][k] - stress->sxy[j - 3][i][k]));
-                    sxz_z = dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                                  b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]) +
-                                  b3 * (stress->sxz[j][i][k + 2] - stress->sxz[j][i][k - 3]));
+                    sxx_x = dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                                  b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]) +
+                                  b3 * (stress.sxx[j, i + 3, k] - stress.sxx[j, i - 2, k]));
+                    sxy_y = dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                                  b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]) +
+                                  b3 * (stress.sxy[j + 2, i, k] - stress.sxy[j - 3, i, k]));
+                    sxz_z = dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                                  b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]) +
+                                  b3 * (stress.sxz[j, i, k + 2] - stress.sxz[j, i, k - 3]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    syy_y = dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                                  b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]) +
-                                  b3 * (stress->syy[j + 3][i][k] - stress->syy[j - 2][i][k]));
-                    sxy_x = dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                                  b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]) +
-                                  b3 * (stress->sxy[j][i + 2][k] - stress->sxy[j][i - 3][k]));
-                    syz_z = dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                                  b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]) +
-                                  b3 * (stress->syz[j][i][k + 2] - stress->syz[j][i][k - 3]));
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    szz_z = dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                                  b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]) +
-                                  b3 * (stress->szz[j][i][k + 3] - stress->szz[j][i][k - 2]));
-                    sxz_x = dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                                  b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]) +
-                                  b3 * (stress->sxz[j][i + 2][k] - stress->sxz[j][i - 3][k]));
-                    syz_y = dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                                  b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]) +
-                                  b3 * (stress->syz[j + 2][i][k] - stress->syz[j - 3][i][k]));
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    syy_y = dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                                  b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]) +
+                                  b3 * (stress.syy[j + 3, i, k] - stress.syy[j - 2, i, k]));
+                    sxy_x = dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                                  b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]) +
+                                  b3 * (stress.sxy[j, i + 2, k] - stress.sxy[j, i - 3, k]));
+                    syz_z = dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                                  b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]) +
+                                  b3 * (stress.syz[j, i, k + 2] - stress.syz[j, i, k - 3]));
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    szz_z = dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                                  b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]) +
+                                  b3 * (stress.szz[j, i, k + 3] - stress.szz[j, i, k - 2]));
+                    sxz_x = dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                                  b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]) +
+                                  b3 * (stress.sxz[j, i + 2, k] - stress.sxz[j, i - 3, k]));
+                    syz_y = dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                                  b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]) +
+                                  b3 * (stress.syz[j + 2, i, k] - stress.syz[j - 3, i, k]));
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -202,46 +199,46 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sxx_x = dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                                  b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]) +
-                                  b3 * (stress->sxx[j][i + 3][k] - stress->sxx[j][i - 2][k]) +
-                                  b4 * (stress->sxx[j][i + 4][k] - stress->sxx[j][i - 3][k]));
-                    sxy_y = dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                                  b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]) +
-                                  b3 * (stress->sxy[j + 2][i][k] - stress->sxy[j - 3][i][k]) +
-                                  b4 * (stress->sxy[j + 3][i][k] - stress->sxy[j - 4][i][k]));
-                    sxz_z = dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                                  b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]) +
-                                  b3 * (stress->sxz[j][i][k + 2] - stress->sxz[j][i][k - 3]) +
-                                  b4 * (stress->sxz[j][i][k + 3] - stress->sxz[j][i][k - 4]));
+                    sxx_x = dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                                  b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]) +
+                                  b3 * (stress.sxx[j, i + 3, k] - stress.sxx[j, i - 2, k]) +
+                                  b4 * (stress.sxx[j, i + 4, k] - stress.sxx[j, i - 3, k]));
+                    sxy_y = dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                                  b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]) +
+                                  b3 * (stress.sxy[j + 2, i, k] - stress.sxy[j - 3, i, k]) +
+                                  b4 * (stress.sxy[j + 3, i, k] - stress.sxy[j - 4, i, k]));
+                    sxz_z = dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                                  b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]) +
+                                  b3 * (stress.sxz[j, i, k + 2] - stress.sxz[j, i, k - 3]) +
+                                  b4 * (stress.sxz[j, i, k + 3] - stress.sxz[j, i, k - 4]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    syy_y = dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                                  b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]) +
-                                  b3 * (stress->syy[j + 3][i][k] - stress->syy[j - 2][i][k]) +
-                                  b4 * (stress->syy[j + 4][i][k] - stress->syy[j - 3][i][k]));
-                    sxy_x = dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                                  b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]) +
-                                  b3 * (stress->sxy[j][i + 2][k] - stress->sxy[j][i - 3][k]) +
-                                  b4 * (stress->sxy[j][i + 3][k] - stress->sxy[j][i - 4][k]));
-                    syz_z = dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                                  b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]) +
-                                  b3 * (stress->syz[j][i][k + 2] - stress->syz[j][i][k - 3]) +
-                                  b4 * (stress->syz[j][i][k + 3] - stress->syz[j][i][k - 4]));
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    szz_z = dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                                  b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]) +
-                                  b3 * (stress->szz[j][i][k + 3] - stress->szz[j][i][k - 2]) +
-                                  b4 * (stress->szz[j][i][k + 4] - stress->szz[j][i][k - 3]));
-                    sxz_x = dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                                  b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]) +
-                                  b3 * (stress->sxz[j][i + 2][k] - stress->sxz[j][i - 3][k]) +
-                                  b4 * (stress->sxz[j][i + 3][k] - stress->sxz[j][i - 4][k]));
-                    syz_y = dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                                  b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]) +
-                                  b3 * (stress->syz[j + 2][i][k] - stress->syz[j - 3][i][k]) +
-                                  b4 * (stress->syz[j + 3][i][k] - stress->syz[j - 4][i][k]));
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    syy_y = dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                                  b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]) +
+                                  b3 * (stress.syy[j + 3, i, k] - stress.syy[j - 2, i, k]) +
+                                  b4 * (stress.syy[j + 4, i, k] - stress.syy[j - 3, i, k]));
+                    sxy_x = dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                                  b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]) +
+                                  b3 * (stress.sxy[j, i + 2, k] - stress.sxy[j, i - 3, k]) +
+                                  b4 * (stress.sxy[j, i + 3, k] - stress.sxy[j, i - 4, k]));
+                    syz_z = dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                                  b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]) +
+                                  b3 * (stress.syz[j, i, k + 2] - stress.syz[j, i, k - 3]) +
+                                  b4 * (stress.syz[j, i, k + 3] - stress.syz[j, i, k - 4]));
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    szz_z = dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                                  b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]) +
+                                  b3 * (stress.szz[j, i, k + 3] - stress.szz[j, i, k - 2]) +
+                                  b4 * (stress.szz[j, i, k + 4] - stress.szz[j, i, k - 3]));
+                    sxz_x = dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                                  b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]) +
+                                  b3 * (stress.sxz[j, i + 2, k] - stress.sxz[j, i - 3, k]) +
+                                  b4 * (stress.sxz[j, i + 3, k] - stress.sxz[j, i - 4, k]));
+                    syz_y = dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                                  b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]) +
+                                  b3 * (stress.syz[j + 2, i, k] - stress.syz[j - 3, i, k]) +
+                                  b4 * (stress.syz[j + 3, i, k] - stress.syz[j - 4, i, k]));
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -263,55 +260,55 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sxx_x = dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                                  b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]) +
-                                  b3 * (stress->sxx[j][i + 3][k] - stress->sxx[j][i - 2][k]) +
-                                  b4 * (stress->sxx[j][i + 4][k] - stress->sxx[j][i - 3][k]) +
-                                  b5 * (stress->sxx[j][i + 5][k] - stress->sxx[j][i - 4][k]));
-                    sxy_y = dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                                  b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]) +
-                                  b3 * (stress->sxy[j + 2][i][k] - stress->sxy[j - 3][i][k]) +
-                                  b4 * (stress->sxy[j + 3][i][k] - stress->sxy[j - 4][i][k]) +
-                                  b5 * (stress->sxy[j + 4][i][k] - stress->sxy[j - 5][i][k]));
-                    sxz_z = dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                                  b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]) +
-                                  b3 * (stress->sxz[j][i][k + 2] - stress->sxz[j][i][k - 3]) +
-                                  b4 * (stress->sxz[j][i][k + 3] - stress->sxz[j][i][k - 4]) +
-                                  b5 * (stress->sxz[j][i][k + 4] - stress->sxz[j][i][k - 5]));
+                    sxx_x = dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                                  b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]) +
+                                  b3 * (stress.sxx[j, i + 3, k] - stress.sxx[j, i - 2, k]) +
+                                  b4 * (stress.sxx[j, i + 4, k] - stress.sxx[j, i - 3, k]) +
+                                  b5 * (stress.sxx[j, i + 5, k] - stress.sxx[j, i - 4, k]));
+                    sxy_y = dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                                  b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]) +
+                                  b3 * (stress.sxy[j + 2, i, k] - stress.sxy[j - 3, i, k]) +
+                                  b4 * (stress.sxy[j + 3, i, k] - stress.sxy[j - 4, i, k]) +
+                                  b5 * (stress.sxy[j + 4, i, k] - stress.sxy[j - 5, i, k]));
+                    sxz_z = dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                                  b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]) +
+                                  b3 * (stress.sxz[j, i, k + 2] - stress.sxz[j, i, k - 3]) +
+                                  b4 * (stress.sxz[j, i, k + 3] - stress.sxz[j, i, k - 4]) +
+                                  b5 * (stress.sxz[j, i, k + 4] - stress.sxz[j, i, k - 5]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    syy_y = dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                                  b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]) +
-                                  b3 * (stress->syy[j + 3][i][k] - stress->syy[j - 2][i][k]) +
-                                  b4 * (stress->syy[j + 4][i][k] - stress->syy[j - 3][i][k]) +
-                                  b5 * (stress->syy[j + 5][i][k] - stress->syy[j - 4][i][k]));
-                    sxy_x = dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                                  b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]) +
-                                  b3 * (stress->sxy[j][i + 2][k] - stress->sxy[j][i - 3][k]) +
-                                  b4 * (stress->sxy[j][i + 3][k] - stress->sxy[j][i - 4][k]) +
-                                  b5 * (stress->sxy[j][i + 4][k] - stress->sxy[j][i - 5][k]));
-                    syz_z = dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                                  b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]) +
-                                  b3 * (stress->syz[j][i][k + 2] - stress->syz[j][i][k - 3]) +
-                                  b4 * (stress->syz[j][i][k + 3] - stress->syz[j][i][k - 4]) +
-                                  b5 * (stress->syz[j][i][k + 4] - stress->syz[j][i][k - 5]));
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    szz_z = dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                                  b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]) +
-                                  b3 * (stress->szz[j][i][k + 3] - stress->szz[j][i][k - 2]) +
-                                  b4 * (stress->szz[j][i][k + 4] - stress->szz[j][i][k - 3]) +
-                                  b5 * (stress->szz[j][i][k + 5] - stress->szz[j][i][k - 4]));
-                    sxz_x = dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                                  b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]) +
-                                  b3 * (stress->sxz[j][i + 2][k] - stress->sxz[j][i - 3][k]) +
-                                  b4 * (stress->sxz[j][i + 3][k] - stress->sxz[j][i - 4][k]) +
-                                  b5 * (stress->sxz[j][i + 4][k] - stress->sxz[j][i - 5][k]));
-                    syz_y = dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                                  b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]) +
-                                  b3 * (stress->syz[j + 2][i][k] - stress->syz[j - 3][i][k]) +
-                                  b4 * (stress->syz[j + 3][i][k] - stress->syz[j - 4][i][k]) +
-                                  b5 * (stress->syz[j + 4][i][k] - stress->syz[j - 5][i][k]));
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    syy_y = dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                                  b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]) +
+                                  b3 * (stress.syy[j + 3, i, k] - stress.syy[j - 2, i, k]) +
+                                  b4 * (stress.syy[j + 4, i, k] - stress.syy[j - 3, i, k]) +
+                                  b5 * (stress.syy[j + 5, i, k] - stress.syy[j - 4, i, k]));
+                    sxy_x = dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                                  b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]) +
+                                  b3 * (stress.sxy[j, i + 2, k] - stress.sxy[j, i - 3, k]) +
+                                  b4 * (stress.sxy[j, i + 3, k] - stress.sxy[j, i - 4, k]) +
+                                  b5 * (stress.sxy[j, i + 4, k] - stress.sxy[j, i - 5, k]));
+                    syz_z = dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                                  b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]) +
+                                  b3 * (stress.syz[j, i, k + 2] - stress.syz[j, i, k - 3]) +
+                                  b4 * (stress.syz[j, i, k + 3] - stress.syz[j, i, k - 4]) +
+                                  b5 * (stress.syz[j, i, k + 4] - stress.syz[j, i, k - 5]));
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    szz_z = dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                                  b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]) +
+                                  b3 * (stress.szz[j, i, k + 3] - stress.szz[j, i, k - 2]) +
+                                  b4 * (stress.szz[j, i, k + 4] - stress.szz[j, i, k - 3]) +
+                                  b5 * (stress.szz[j, i, k + 5] - stress.szz[j, i, k - 4]));
+                    sxz_x = dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                                  b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]) +
+                                  b3 * (stress.sxz[j, i + 2, k] - stress.sxz[j, i - 3, k]) +
+                                  b4 * (stress.sxz[j, i + 3, k] - stress.sxz[j, i - 4, k]) +
+                                  b5 * (stress.sxz[j, i + 4, k] - stress.sxz[j, i - 5, k]));
+                    syz_y = dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                                  b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]) +
+                                  b3 * (stress.syz[j + 2, i, k] - stress.syz[j - 3, i, k]) +
+                                  b4 * (stress.syz[j + 3, i, k] - stress.syz[j - 4, i, k]) +
+                                  b5 * (stress.syz[j + 4, i, k] - stress.syz[j - 5, i, k]));
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -337,64 +334,64 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sxx_x = dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                                  b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]) +
-                                  b3 * (stress->sxx[j][i + 3][k] - stress->sxx[j][i - 2][k]) +
-                                  b4 * (stress->sxx[j][i + 4][k] - stress->sxx[j][i - 3][k]) +
-                                  b5 * (stress->sxx[j][i + 5][k] - stress->sxx[j][i - 4][k]) +
-                                  b6 * (stress->sxx[j][i + 6][k] - stress->sxx[j][i - 5][k]));
-                    sxy_y = dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                                  b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]) +
-                                  b3 * (stress->sxy[j + 2][i][k] - stress->sxy[j - 3][i][k]) +
-                                  b4 * (stress->sxy[j + 3][i][k] - stress->sxy[j - 4][i][k]) +
-                                  b5 * (stress->sxy[j + 4][i][k] - stress->sxy[j - 5][i][k]) +
-                                  b6 * (stress->sxy[j + 5][i][k] - stress->sxy[j - 6][i][k]));
-                    sxz_z = dz * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i][k - 1]) +
-                                  b2 * (stress->sxy[j][i][k + 1] - stress->sxy[j][i][k - 2]) +
-                                  b3 * (stress->sxy[j][i][k + 2] - stress->sxy[j][i][k - 3]) +
-                                  b4 * (stress->sxy[j][i][k + 3] - stress->sxy[j][i][k - 4]) +
-                                  b5 * (stress->sxy[j][i][k + 4] - stress->sxy[j][i][k - 5]) +
-                                  b6 * (stress->sxy[j][i][k + 5] - stress->sxy[j][i][k - 6]));
+                    sxx_x = dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                                  b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]) +
+                                  b3 * (stress.sxx[j, i + 3, k] - stress.sxx[j, i - 2, k]) +
+                                  b4 * (stress.sxx[j, i + 4, k] - stress.sxx[j, i - 3, k]) +
+                                  b5 * (stress.sxx[j, i + 5, k] - stress.sxx[j, i - 4, k]) +
+                                  b6 * (stress.sxx[j, i + 6, k] - stress.sxx[j, i - 5, k]));
+                    sxy_y = dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                                  b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]) +
+                                  b3 * (stress.sxy[j + 2, i, k] - stress.sxy[j - 3, i, k]) +
+                                  b4 * (stress.sxy[j + 3, i, k] - stress.sxy[j - 4, i, k]) +
+                                  b5 * (stress.sxy[j + 4, i, k] - stress.sxy[j - 5, i, k]) +
+                                  b6 * (stress.sxy[j + 5, i, k] - stress.sxy[j - 6, i, k]));
+                    sxz_z = dz * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i, k - 1]) +
+                                  b2 * (stress.sxy[j, i, k + 1] - stress.sxy[j, i, k - 2]) +
+                                  b3 * (stress.sxy[j, i, k + 2] - stress.sxy[j, i, k - 3]) +
+                                  b4 * (stress.sxy[j, i, k + 3] - stress.sxy[j, i, k - 4]) +
+                                  b5 * (stress.sxy[j, i, k + 4] - stress.sxy[j, i, k - 5]) +
+                                  b6 * (stress.sxy[j, i, k + 5] - stress.sxy[j, i, k - 6]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    syy_y = dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                                  b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]) +
-                                  b3 * (stress->syy[j + 3][i][k] - stress->syy[j - 2][i][k]) +
-                                  b4 * (stress->syy[j + 4][i][k] - stress->syy[j - 3][i][k]) +
-                                  b5 * (stress->syy[j + 5][i][k] - stress->syy[j - 4][i][k]) +
-                                  b6 * (stress->syy[j + 6][i][k] - stress->syy[j - 5][i][k]));
-                    sxy_x = dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                                  b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]) +
-                                  b3 * (stress->sxy[j][i + 2][k] - stress->sxy[j][i - 3][k]) +
-                                  b4 * (stress->sxy[j][i + 3][k] - stress->sxy[j][i - 4][k]) +
-                                  b5 * (stress->sxy[j][i + 4][k] - stress->sxy[j][i - 5][k]) +
-                                  b6 * (stress->sxy[j][i + 5][k] - stress->sxy[j][i - 6][k]));
-                    syz_z = dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                                  b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]) +
-                                  b3 * (stress->syz[j][i][k + 2] - stress->syz[j][i][k - 3]) +
-                                  b4 * (stress->syz[j][i][k + 3] - stress->syz[j][i][k - 4]) +
-                                  b5 * (stress->syz[j][i][k + 4] - stress->syz[j][i][k - 5]) +
-                                  b6 * (stress->syz[j][i][k + 5] - stress->syz[j][i][k - 6]));
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    szz_z = dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                                  b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]) +
-                                  b3 * (stress->szz[j][i][k + 3] - stress->szz[j][i][k - 2]) +
-                                  b4 * (stress->szz[j][i][k + 4] - stress->szz[j][i][k - 3]) +
-                                  b5 * (stress->szz[j][i][k + 5] - stress->szz[j][i][k - 4]) +
-                                  b6 * (stress->szz[j][i][k + 6] - stress->szz[j][i][k - 5]));
-                    sxz_x = dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                                  b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]) +
-                                  b3 * (stress->sxz[j][i + 2][k] - stress->sxz[j][i - 3][k]) +
-                                  b4 * (stress->sxz[j][i + 3][k] - stress->sxz[j][i - 4][k]) +
-                                  b5 * (stress->sxz[j][i + 4][k] - stress->sxz[j][i - 5][k]) +
-                                  b6 * (stress->sxz[j][i + 5][k] - stress->sxz[j][i - 6][k]));
-                    syz_y = dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                                  b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]) +
-                                  b3 * (stress->syz[j + 2][i][k] - stress->syz[j - 3][i][k]) +
-                                  b4 * (stress->syz[j + 3][i][k] - stress->syz[j - 4][i][k]) +
-                                  b5 * (stress->syz[j + 4][i][k] - stress->syz[j - 5][i][k]) +
-                                  b6 * (stress->syz[j + 5][i][k] - stress->syz[j - 6][i][k]));
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    syy_y = dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                                  b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]) +
+                                  b3 * (stress.syy[j + 3, i, k] - stress.syy[j - 2, i, k]) +
+                                  b4 * (stress.syy[j + 4, i, k] - stress.syy[j - 3, i, k]) +
+                                  b5 * (stress.syy[j + 5, i, k] - stress.syy[j - 4, i, k]) +
+                                  b6 * (stress.syy[j + 6, i, k] - stress.syy[j - 5, i, k]));
+                    sxy_x = dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                                  b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]) +
+                                  b3 * (stress.sxy[j, i + 2, k] - stress.sxy[j, i - 3, k]) +
+                                  b4 * (stress.sxy[j, i + 3, k] - stress.sxy[j, i - 4, k]) +
+                                  b5 * (stress.sxy[j, i + 4, k] - stress.sxy[j, i - 5, k]) +
+                                  b6 * (stress.sxy[j, i + 5, k] - stress.sxy[j, i - 6, k]));
+                    syz_z = dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                                  b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]) +
+                                  b3 * (stress.syz[j, i, k + 2] - stress.syz[j, i, k - 3]) +
+                                  b4 * (stress.syz[j, i, k + 3] - stress.syz[j, i, k - 4]) +
+                                  b5 * (stress.syz[j, i, k + 4] - stress.syz[j, i, k - 5]) +
+                                  b6 * (stress.syz[j, i, k + 5] - stress.syz[j, i, k - 6]));
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    szz_z = dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                                  b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]) +
+                                  b3 * (stress.szz[j, i, k + 3] - stress.szz[j, i, k - 2]) +
+                                  b4 * (stress.szz[j, i, k + 4] - stress.szz[j, i, k - 3]) +
+                                  b5 * (stress.szz[j, i, k + 5] - stress.szz[j, i, k - 4]) +
+                                  b6 * (stress.szz[j, i, k + 6] - stress.szz[j, i, k - 5]));
+                    sxz_x = dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                                  b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]) +
+                                  b3 * (stress.sxz[j, i + 2, k] - stress.sxz[j, i - 3, k]) +
+                                  b4 * (stress.sxz[j, i + 3, k] - stress.sxz[j, i - 4, k]) +
+                                  b5 * (stress.sxz[j, i + 4, k] - stress.sxz[j, i - 5, k]) +
+                                  b6 * (stress.sxz[j, i + 5, k] - stress.sxz[j, i - 6, k]));
+                    syz_y = dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                                  b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]) +
+                                  b3 * (stress.syz[j + 2, i, k] - stress.syz[j - 3, i, k]) +
+                                  b4 * (stress.syz[j + 3, i, k] - stress.syz[j - 4, i, k]) +
+                                  b5 * (stress.syz[j + 4, i, k] - stress.syz[j - 5, i, k]) +
+                                  b6 * (stress.syz[j + 5, i, k] - stress.syz[j - 6, i, k]));
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -407,15 +404,15 @@ void update_v(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *_
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    vel->vx[j][i][k] *= absorb_coeff[j][i][k];
-                    vel->vy[j][i][k] *= absorb_coeff[j][i][k];
-                    vel->vz[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->sxy[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->syz[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->sxz[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->sxx[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->syy[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->szz[j][i][k] *= absorb_coeff[j][i][k];
+                    vel.vx[j, i, k] *= absorb_coeff[j, i, k];
+                    vel.vy[j, i, k] *= absorb_coeff[j, i, k];
+                    vel.vz[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.sxy[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.syz[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.sxz[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.sxx[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.syy[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.szz[j, i, k] *= absorb_coeff[j, i, k];
                 }
             }
         }
diff --git a/src/update_v_ssg_CPML.cpp b/src/update_v_ssg_CPML.cpp
index 77449dc6618dfae25864eccd7cf3e3591159a3be..37a607a62d76930e3ba122311011b56619f0f07c 100644
--- a/src/update_v_ssg_CPML.cpp
+++ b/src/update_v_ssg_CPML.cpp
@@ -30,8 +30,8 @@
 
 #define UNUSED(x) (void)(x)
 
-void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_model_av *mod_av,
-                   st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, const GlobVar *gv)
+void update_v_CPML(st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+                   st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     float sxx_x = 0.0, sxy_y = 0.0, sxz_z = 0.0, syy_y = 0.0, sxy_x = 0.0, syz_z = 0.0;
     float szz_z = 0.0, sxz_x = 0.0, syz_y = 0.0;
@@ -57,95 +57,95 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
-                    pml_wfd->psi_sxx_x[j][i][k] =
-                        pml_coeff->b_x_half[i] * pml_wfd->psi_sxx_x[j][i][k] + pml_coeff->a_x_half[i] * sxx_x;
-                    sxx_x = sxx_x / pml_coeff->K_x_half[i] + pml_wfd->psi_sxx_x[j][i][k];
-                    pml_wfd->psi_sxy_x[j][i][k] =
-                        pml_coeff->b_x[i] * pml_wfd->psi_sxy_x[j][i][k] + pml_coeff->a_x[i] * sxy_x;
-                    sxy_x = sxy_x / pml_coeff->K_x[i] + pml_wfd->psi_sxy_x[j][i][k];
-                    pml_wfd->psi_sxz_x[j][i][k] =
-                        pml_coeff->b_x[i] * pml_wfd->psi_sxz_x[j][i][k] + pml_coeff->a_x[i] * sxz_x;
-                    sxz_x = sxz_x / pml_coeff->K_x[i] + pml_wfd->psi_sxz_x[j][i][k];
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
+                    pml_wfd.psi_sxx_x[j, i, k] =
+                        pml_coeff->b_x_half[i] * pml_wfd.psi_sxx_x[j, i, k] + pml_coeff->a_x_half[i] * sxx_x;
+                    sxx_x = sxx_x / pml_coeff->K_x_half[i] + pml_wfd.psi_sxx_x[j, i, k];
+                    pml_wfd.psi_sxy_x[j, i, k] =
+                        pml_coeff->b_x[i] * pml_wfd.psi_sxy_x[j, i, k] + pml_coeff->a_x[i] * sxy_x;
+                    sxy_x = sxy_x / pml_coeff->K_x[i] + pml_wfd.psi_sxy_x[j, i, k];
+                    pml_wfd.psi_sxz_x[j, i, k] =
+                        pml_coeff->b_x[i] * pml_wfd.psi_sxz_x[j, i, k] + pml_coeff->a_x[i] * sxz_x;
+                    sxz_x = sxz_x / pml_coeff->K_x[i] + pml_wfd.psi_sxz_x[j, i, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_sxy_y[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_sxy_y[j][i][k] + pml_coeff->a_y[j] * sxy_y;
-                        sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd->psi_sxy_y[j][i][k];
-                        pml_wfd->psi_syy_y[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_syy_y[j][i][k] + pml_coeff->a_y_half[j] * syy_y;
-                        syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd->psi_syy_y[j][i][k];
-                        pml_wfd->psi_syz_y[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_syz_y[j][i][k] + pml_coeff->a_y[j] * syz_y;
-                        syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd->psi_syz_y[j][i][k];
+                        pml_wfd.psi_sxy_y[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_sxy_y[j, i, k] + pml_coeff->a_y[j] * sxy_y;
+                        sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd.psi_sxy_y[j, i, k];
+                        pml_wfd.psi_syy_y[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_syy_y[j, i, k] + pml_coeff->a_y_half[j] * syy_y;
+                        syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd.psi_syy_y[j, i, k];
+                        pml_wfd.psi_syz_y[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_syz_y[j, i, k] + pml_coeff->a_y[j] * syz_y;
+                        syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd.psi_syz_y[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
-                        pml_wfd->psi_sxy_y[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_sxy_y[h1][i][k] + pml_coeff->a_y[h1] * sxy_y;
-                        sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd->psi_sxy_y[h1][i][k];
-                        pml_wfd->psi_syy_y[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_syy_y[h1][i][k] + pml_coeff->a_y_half[h1] * syy_y;
-                        syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_syy_y[h1][i][k];
-                        pml_wfd->psi_syz_y[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_syz_y[h1][i][k] + pml_coeff->a_y[h1] * syz_y;
-                        syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd->psi_syz_y[h1][i][k];
+                        pml_wfd.psi_sxy_y[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_sxy_y[h1, i, k] + pml_coeff->a_y[h1] * sxy_y;
+                        sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd.psi_sxy_y[h1, i, k];
+                        pml_wfd.psi_syy_y[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_syy_y[h1, i, k] + pml_coeff->a_y_half[h1] * syy_y;
+                        syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_syy_y[h1, i, k];
+                        pml_wfd.psi_syz_y[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_syz_y[h1, i, k] + pml_coeff->a_y[h1] * syz_y;
+                        syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd.psi_syz_y[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sxz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_sxz_z[j][i][k] + pml_coeff->a_z[k] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd->psi_sxz_z[j][i][k];
-                        pml_wfd->psi_syz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_syz_z[j][i][k] + pml_coeff->a_z[k] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd->psi_syz_z[j][i][k];
-                        pml_wfd->psi_szz_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_szz_z[j][i][k] + pml_coeff->a_z_half[k] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd->psi_szz_z[j][i][k];
+                        pml_wfd.psi_sxz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_sxz_z[j, i, k] + pml_coeff->a_z[k] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd.psi_sxz_z[j, i, k];
+                        pml_wfd.psi_syz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_syz_z[j, i, k] + pml_coeff->a_z[k] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd.psi_syz_z[j, i, k];
+                        pml_wfd.psi_szz_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_szz_z[j, i, k] + pml_coeff->a_z_half[k] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd.psi_szz_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sxz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_sxz_z[j][i][h1] + pml_coeff->a_z[h1] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd->psi_sxz_z[j][i][h1];
-                        pml_wfd->psi_syz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_syz_z[j][i][h1] + pml_coeff->a_z[h1] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd->psi_syz_z[j][i][h1];
-                        pml_wfd->psi_szz_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_szz_z[j][i][h1] + pml_coeff->a_z_half[h1] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_szz_z[j][i][h1];
+                        pml_wfd.psi_sxz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_sxz_z[j, i, h1] + pml_coeff->a_z[h1] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd.psi_sxz_z[j, i, h1];
+                        pml_wfd.psi_syz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_syz_z[j, i, h1] + pml_coeff->a_z[h1] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd.psi_syz_z[j, i, h1];
+                        pml_wfd.psi_szz_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_szz_z[j, i, h1] + pml_coeff->a_z_half[h1] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_szz_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -157,96 +157,96 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
                     h1 = (i - nb->nx2 + gv->FW);
-                    pml_wfd->psi_sxx_x[j][h1][k] =
-                        pml_coeff->b_x_half[h1] * pml_wfd->psi_sxx_x[j][h1][k] + pml_coeff->a_x_half[h1] * sxx_x;
-                    sxx_x = sxx_x / pml_coeff->K_x_half[h1] + pml_wfd->psi_sxx_x[j][h1][k];
-                    pml_wfd->psi_sxy_x[j][h1][k] =
-                        pml_coeff->b_x[h1] * pml_wfd->psi_sxy_x[j][h1][k] + pml_coeff->a_x[h1] * sxy_x;
-                    sxy_x = sxy_x / pml_coeff->K_x[h1] + pml_wfd->psi_sxy_x[j][h1][k];
-                    pml_wfd->psi_sxz_x[j][h1][k] =
-                        pml_coeff->b_x[h1] * pml_wfd->psi_sxz_x[j][h1][k] + pml_coeff->a_x[h1] * sxz_x;
-                    sxz_x = sxz_x / pml_coeff->K_x[h1] + pml_wfd->psi_sxz_x[j][h1][k];
+                    pml_wfd.psi_sxx_x[j, h1, k] =
+                        pml_coeff->b_x_half[h1] * pml_wfd.psi_sxx_x[j, h1, k] + pml_coeff->a_x_half[h1] * sxx_x;
+                    sxx_x = sxx_x / pml_coeff->K_x_half[h1] + pml_wfd.psi_sxx_x[j, h1, k];
+                    pml_wfd.psi_sxy_x[j, h1, k] =
+                        pml_coeff->b_x[h1] * pml_wfd.psi_sxy_x[j, h1, k] + pml_coeff->a_x[h1] * sxy_x;
+                    sxy_x = sxy_x / pml_coeff->K_x[h1] + pml_wfd.psi_sxy_x[j, h1, k];
+                    pml_wfd.psi_sxz_x[j, h1, k] =
+                        pml_coeff->b_x[h1] * pml_wfd.psi_sxz_x[j, h1, k] + pml_coeff->a_x[h1] * sxz_x;
+                    sxz_x = sxz_x / pml_coeff->K_x[h1] + pml_wfd.psi_sxz_x[j, h1, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_sxy_y[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_sxy_y[j][i][k] + pml_coeff->a_y[j] * sxy_y;
-                        sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd->psi_sxy_y[j][i][k];
-                        pml_wfd->psi_syy_y[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_syy_y[j][i][k] + pml_coeff->a_y_half[j] * syy_y;
-                        syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd->psi_syy_y[j][i][k];
-                        pml_wfd->psi_syz_y[j][i][k] =
-                            pml_coeff->b_y[j] * pml_wfd->psi_syz_y[j][i][k] + pml_coeff->a_y[j] * syz_y;
-                        syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd->psi_syz_y[j][i][k];
+                        pml_wfd.psi_sxy_y[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_sxy_y[j, i, k] + pml_coeff->a_y[j] * sxy_y;
+                        sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd.psi_sxy_y[j, i, k];
+                        pml_wfd.psi_syy_y[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_syy_y[j, i, k] + pml_coeff->a_y_half[j] * syy_y;
+                        syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd.psi_syy_y[j, i, k];
+                        pml_wfd.psi_syz_y[j, i, k] =
+                            pml_coeff->b_y[j] * pml_wfd.psi_syz_y[j, i, k] + pml_coeff->a_y[j] * syz_y;
+                        syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd.psi_syz_y[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
-                        pml_wfd->psi_sxy_y[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_sxy_y[h1][i][k] + pml_coeff->a_y[h1] * sxy_y;
-                        sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd->psi_sxy_y[h1][i][k];
-                        pml_wfd->psi_syy_y[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_syy_y[h1][i][k] + pml_coeff->a_y_half[h1] * syy_y;
-                        syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_syy_y[h1][i][k];
-                        pml_wfd->psi_syz_y[h1][i][k] =
-                            pml_coeff->b_y[h1] * pml_wfd->psi_syz_y[h1][i][k] + pml_coeff->a_y[h1] * syz_y;
-                        syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd->psi_syz_y[h1][i][k];
+                        pml_wfd.psi_sxy_y[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_sxy_y[h1, i, k] + pml_coeff->a_y[h1] * sxy_y;
+                        sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd.psi_sxy_y[h1, i, k];
+                        pml_wfd.psi_syy_y[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_syy_y[h1, i, k] + pml_coeff->a_y_half[h1] * syy_y;
+                        syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_syy_y[h1, i, k];
+                        pml_wfd.psi_syz_y[h1, i, k] =
+                            pml_coeff->b_y[h1] * pml_wfd.psi_syz_y[h1, i, k] + pml_coeff->a_y[h1] * syz_y;
+                        syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd.psi_syz_y[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sxz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_sxz_z[j][i][k] + pml_coeff->a_z[k] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd->psi_sxz_z[j][i][k];
-                        pml_wfd->psi_syz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_syz_z[j][i][k] + pml_coeff->a_z[k] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd->psi_syz_z[j][i][k];
-                        pml_wfd->psi_szz_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_szz_z[j][i][k] + pml_coeff->a_z_half[k] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd->psi_szz_z[j][i][k];
+                        pml_wfd.psi_sxz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_sxz_z[j, i, k] + pml_coeff->a_z[k] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd.psi_sxz_z[j, i, k];
+                        pml_wfd.psi_syz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_syz_z[j, i, k] + pml_coeff->a_z[k] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd.psi_syz_z[j, i, k];
+                        pml_wfd.psi_szz_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_szz_z[j, i, k] + pml_coeff->a_z_half[k] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd.psi_szz_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sxz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_sxz_z[j][i][h1] + pml_coeff->a_z[h1] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd->psi_sxz_z[j][i][h1];
-                        pml_wfd->psi_syz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_syz_z[j][i][h1] + pml_coeff->a_z[h1] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd->psi_syz_z[j][i][h1];
-                        pml_wfd->psi_szz_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_szz_z[j][i][h1] + pml_coeff->a_z_half[h1] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_szz_z[j][i][h1];
+                        pml_wfd.psi_sxz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_sxz_z[j, i, h1] + pml_coeff->a_z[h1] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd.psi_sxz_z[j, i, h1];
+                        pml_wfd.psi_syz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_syz_z[j, i, h1] + pml_coeff->a_z[h1] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd.psi_syz_z[j, i, h1];
+                        pml_wfd.psi_szz_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_szz_z[j, i, h1] + pml_coeff->a_z_half[h1] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_szz_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -258,70 +258,70 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
-                    pml_wfd->psi_sxy_y[j][i][k] =
-                        pml_coeff->b_y[j] * pml_wfd->psi_sxy_y[j][i][k] + pml_coeff->a_y[j] * sxy_y;
-                    sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd->psi_sxy_y[j][i][k];
-                    pml_wfd->psi_syy_y[j][i][k] =
-                        pml_coeff->b_y_half[j] * pml_wfd->psi_syy_y[j][i][k] + pml_coeff->a_y_half[j] * syy_y;
-                    syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd->psi_syy_y[j][i][k];
-                    pml_wfd->psi_syz_y[j][i][k] =
-                        pml_coeff->b_y[j] * pml_wfd->psi_syz_y[j][i][k] + pml_coeff->a_y[j] * syz_y;
-                    syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd->psi_syz_y[j][i][k];
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
+                    pml_wfd.psi_sxy_y[j, i, k] =
+                        pml_coeff->b_y[j] * pml_wfd.psi_sxy_y[j, i, k] + pml_coeff->a_y[j] * sxy_y;
+                    sxy_y = sxy_y / pml_coeff->K_y[j] + pml_wfd.psi_sxy_y[j, i, k];
+                    pml_wfd.psi_syy_y[j, i, k] =
+                        pml_coeff->b_y_half[j] * pml_wfd.psi_syy_y[j, i, k] + pml_coeff->a_y_half[j] * syy_y;
+                    syy_y = syy_y / pml_coeff->K_y_half[j] + pml_wfd.psi_syy_y[j, i, k];
+                    pml_wfd.psi_syz_y[j, i, k] =
+                        pml_coeff->b_y[j] * pml_wfd.psi_syz_y[j, i, k] + pml_coeff->a_y[j] * syz_y;
+                    syz_y = syz_y / pml_coeff->K_y[j] + pml_wfd.psi_syz_y[j, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sxz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_sxz_z[j][i][k] + pml_coeff->a_z[k] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd->psi_sxz_z[j][i][k];
-                        pml_wfd->psi_syz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_syz_z[j][i][k] + pml_coeff->a_z[k] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd->psi_syz_z[j][i][k];
-                        pml_wfd->psi_szz_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_szz_z[j][i][k] + pml_coeff->a_z_half[k] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd->psi_szz_z[j][i][k];
+                        pml_wfd.psi_sxz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_sxz_z[j, i, k] + pml_coeff->a_z[k] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd.psi_sxz_z[j, i, k];
+                        pml_wfd.psi_syz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_syz_z[j, i, k] + pml_coeff->a_z[k] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd.psi_syz_z[j, i, k];
+                        pml_wfd.psi_szz_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_szz_z[j, i, k] + pml_coeff->a_z_half[k] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd.psi_szz_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sxz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_sxz_z[j][i][h1] + pml_coeff->a_z[h1] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd->psi_sxz_z[j][i][h1];
-                        pml_wfd->psi_syz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_syz_z[j][i][h1] + pml_coeff->a_z[h1] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd->psi_syz_z[j][i][h1];
-                        pml_wfd->psi_szz_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_szz_z[j][i][h1] + pml_coeff->a_z_half[h1] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_szz_z[j][i][h1];
+                        pml_wfd.psi_sxz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_sxz_z[j, i, h1] + pml_coeff->a_z[h1] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd.psi_sxz_z[j, i, h1];
+                        pml_wfd.psi_syz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_syz_z[j, i, h1] + pml_coeff->a_z[h1] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd.psi_syz_z[j, i, h1];
+                        pml_wfd.psi_szz_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_szz_z[j, i, h1] + pml_coeff->a_z_half[h1] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_szz_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -333,71 +333,71 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
                     h1 = (j - nb->ny2 + gv->FW);
-                    pml_wfd->psi_sxy_y[h1][i][k] =
-                        pml_coeff->b_y[h1] * pml_wfd->psi_sxy_y[h1][i][k] + pml_coeff->a_y[h1] * sxy_y;
-                    sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd->psi_sxy_y[h1][i][k];
-                    pml_wfd->psi_syy_y[h1][i][k] =
-                        pml_coeff->b_y_half[h1] * pml_wfd->psi_syy_y[h1][i][k] + pml_coeff->a_y_half[h1] * syy_y;
-                    syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_syy_y[h1][i][k];
-                    pml_wfd->psi_syz_y[h1][i][k] =
-                        pml_coeff->b_y[h1] * pml_wfd->psi_syz_y[h1][i][k] + pml_coeff->a_y[h1] * syz_y;
-                    syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd->psi_syz_y[h1][i][k];
+                    pml_wfd.psi_sxy_y[h1, i, k] =
+                        pml_coeff->b_y[h1] * pml_wfd.psi_sxy_y[h1, i, k] + pml_coeff->a_y[h1] * sxy_y;
+                    sxy_y = sxy_y / pml_coeff->K_y[h1] + pml_wfd.psi_sxy_y[h1, i, k];
+                    pml_wfd.psi_syy_y[h1, i, k] =
+                        pml_coeff->b_y_half[h1] * pml_wfd.psi_syy_y[h1, i, k] + pml_coeff->a_y_half[h1] * syy_y;
+                    syy_y = syy_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_syy_y[h1, i, k];
+                    pml_wfd.psi_syz_y[h1, i, k] =
+                        pml_coeff->b_y[h1] * pml_wfd.psi_syz_y[h1, i, k] + pml_coeff->a_y[h1] * syz_y;
+                    syz_y = syz_y / pml_coeff->K_y[h1] + pml_wfd.psi_syz_y[h1, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sxz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_sxz_z[j][i][k] + pml_coeff->a_z[k] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd->psi_sxz_z[j][i][k];
-                        pml_wfd->psi_syz_z[j][i][k] =
-                            pml_coeff->b_z[k] * pml_wfd->psi_syz_z[j][i][k] + pml_coeff->a_z[k] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd->psi_syz_z[j][i][k];
-                        pml_wfd->psi_szz_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_szz_z[j][i][k] + pml_coeff->a_z_half[k] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd->psi_szz_z[j][i][k];
+                        pml_wfd.psi_sxz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_sxz_z[j, i, k] + pml_coeff->a_z[k] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd.psi_sxz_z[j, i, k];
+                        pml_wfd.psi_syz_z[j, i, k] =
+                            pml_coeff->b_z[k] * pml_wfd.psi_syz_z[j, i, k] + pml_coeff->a_z[k] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd.psi_syz_z[j, i, k];
+                        pml_wfd.psi_szz_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_szz_z[j, i, k] + pml_coeff->a_z_half[k] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd.psi_szz_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sxz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_sxz_z[j][i][h1] + pml_coeff->a_z[h1] * sxz_z;
-                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd->psi_sxz_z[j][i][h1];
-                        pml_wfd->psi_syz_z[j][i][h1] =
-                            pml_coeff->b_z[h1] * pml_wfd->psi_syz_z[j][i][h1] + pml_coeff->a_z[h1] * syz_z;
-                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd->psi_syz_z[j][i][h1];
-                        pml_wfd->psi_szz_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_szz_z[j][i][h1] + pml_coeff->a_z_half[h1] * szz_z;
-                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_szz_z[j][i][h1];
+                        pml_wfd.psi_sxz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_sxz_z[j, i, h1] + pml_coeff->a_z[h1] * sxz_z;
+                        sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd.psi_sxz_z[j, i, h1];
+                        pml_wfd.psi_syz_z[j, i, h1] =
+                            pml_coeff->b_z[h1] * pml_wfd.psi_syz_z[j, i, h1] + pml_coeff->a_z[h1] * syz_z;
+                        syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd.psi_syz_z[j, i, h1];
+                        pml_wfd.psi_szz_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_szz_z[j, i, h1] + pml_coeff->a_z_half[h1] * szz_z;
+                        szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_szz_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -411,45 +411,45 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = 1; k <= gv->FW; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
-                    pml_wfd->psi_sxz_z[j][i][k] =
-                        pml_coeff->b_z[k] * pml_wfd->psi_sxz_z[j][i][k] + pml_coeff->a_z[k] * sxz_z;
-                    sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd->psi_sxz_z[j][i][k];
-                    pml_wfd->psi_syz_z[j][i][k] =
-                        pml_coeff->b_z[k] * pml_wfd->psi_syz_z[j][i][k] + pml_coeff->a_z[k] * syz_z;
-                    syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd->psi_syz_z[j][i][k];
-                    pml_wfd->psi_szz_z[j][i][k] =
-                        pml_coeff->b_z_half[k] * pml_wfd->psi_szz_z[j][i][k] + pml_coeff->a_z_half[k] * szz_z;
-                    szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd->psi_szz_z[j][i][k];
-
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
+                    pml_wfd.psi_sxz_z[j, i, k] =
+                        pml_coeff->b_z[k] * pml_wfd.psi_sxz_z[j, i, k] + pml_coeff->a_z[k] * sxz_z;
+                    sxz_z = sxz_z / pml_coeff->K_z[k] + pml_wfd.psi_sxz_z[j, i, k];
+                    pml_wfd.psi_syz_z[j, i, k] =
+                        pml_coeff->b_z[k] * pml_wfd.psi_syz_z[j, i, k] + pml_coeff->a_z[k] * syz_z;
+                    syz_z = syz_z / pml_coeff->K_z[k] + pml_wfd.psi_syz_z[j, i, k];
+                    pml_wfd.psi_szz_z[j, i, k] =
+                        pml_coeff->b_z_half[k] * pml_wfd.psi_szz_z[j, i, k] + pml_coeff->a_z_half[k] * szz_z;
+                    szz_z = szz_z / pml_coeff->K_z_half[k] + pml_wfd.psi_szz_z[j, i, k];
+
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -461,46 +461,46 @@ void update_v_CPML(st_boundary *nb, st_velocity *vel, st_stress *stress, st_mode
                 #pragma omp simd
                 for (int k = nb->nz2 + 1; k <= nb->nz2 + gv->FW; k++) {
                     sxx_x =
-                        dx * (b1 * (stress->sxx[j][i + 1][k] - stress->sxx[j][i][k]) +
-                              b2 * (stress->sxx[j][i + 2][k] - stress->sxx[j][i - 1][k]));
+                        dx * (b1 * (stress.sxx[j, i + 1, k] - stress.sxx[j, i, k]) +
+                              b2 * (stress.sxx[j, i + 2, k] - stress.sxx[j, i - 1, k]));
                     sxy_x =
-                        dx * (b1 * (stress->sxy[j][i][k] - stress->sxy[j][i - 1][k]) +
-                              b2 * (stress->sxy[j][i + 1][k] - stress->sxy[j][i - 2][k]));
+                        dx * (b1 * (stress.sxy[j, i, k] - stress.sxy[j, i - 1, k]) +
+                              b2 * (stress.sxy[j, i + 1, k] - stress.sxy[j, i - 2, k]));
                     sxz_x =
-                        dx * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i - 1][k]) +
-                              b2 * (stress->sxz[j][i + 1][k] - stress->sxz[j][i - 2][k]));
+                        dx * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i - 1, k]) +
+                              b2 * (stress.sxz[j, i + 1, k] - stress.sxz[j, i - 2, k]));
                     sxy_y =
-                        dy * (b1 * (stress->sxy[j][i][k] - stress->sxy[j - 1][i][k]) +
-                              b2 * (stress->sxy[j + 1][i][k] - stress->sxy[j - 2][i][k]));
+                        dy * (b1 * (stress.sxy[j, i, k] - stress.sxy[j - 1, i, k]) +
+                              b2 * (stress.sxy[j + 1, i, k] - stress.sxy[j - 2, i, k]));
                     syy_y =
-                        dy * (b1 * (stress->syy[j + 1][i][k] - stress->syy[j][i][k]) +
-                              b2 * (stress->syy[j + 2][i][k] - stress->syy[j - 1][i][k]));
+                        dy * (b1 * (stress.syy[j + 1, i, k] - stress.syy[j, i, k]) +
+                              b2 * (stress.syy[j + 2, i, k] - stress.syy[j - 1, i, k]));
                     syz_y =
-                        dy * (b1 * (stress->syz[j][i][k] - stress->syz[j - 1][i][k]) +
-                              b2 * (stress->syz[j + 1][i][k] - stress->syz[j - 2][i][k]));
+                        dy * (b1 * (stress.syz[j, i, k] - stress.syz[j - 1, i, k]) +
+                              b2 * (stress.syz[j + 1, i, k] - stress.syz[j - 2, i, k]));
                     sxz_z =
-                        dz * (b1 * (stress->sxz[j][i][k] - stress->sxz[j][i][k - 1]) +
-                              b2 * (stress->sxz[j][i][k + 1] - stress->sxz[j][i][k - 2]));
+                        dz * (b1 * (stress.sxz[j, i, k] - stress.sxz[j, i, k - 1]) +
+                              b2 * (stress.sxz[j, i, k + 1] - stress.sxz[j, i, k - 2]));
                     syz_z =
-                        dz * (b1 * (stress->syz[j][i][k] - stress->syz[j][i][k - 1]) +
-                              b2 * (stress->syz[j][i][k + 1] - stress->syz[j][i][k - 2]));
+                        dz * (b1 * (stress.syz[j, i, k] - stress.syz[j, i, k - 1]) +
+                              b2 * (stress.syz[j, i, k + 1] - stress.syz[j, i, k - 2]));
                     szz_z =
-                        dz * (b1 * (stress->szz[j][i][k + 1] - stress->szz[j][i][k]) +
-                              b2 * (stress->szz[j][i][k + 2] - stress->szz[j][i][k - 1]));
+                        dz * (b1 * (stress.szz[j, i, k + 1] - stress.szz[j, i, k]) +
+                              b2 * (stress.szz[j, i, k + 2] - stress.szz[j, i, k - 1]));
                     h1 = (k - nb->nz2 + gv->FW);
-                    pml_wfd->psi_sxz_z[j][i][h1] =
-                        pml_coeff->b_z[h1] * pml_wfd->psi_sxz_z[j][i][h1] + pml_coeff->a_z[h1] * sxz_z;
-                    sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd->psi_sxz_z[j][i][h1];
-                    pml_wfd->psi_syz_z[j][i][h1] =
-                        pml_coeff->b_z[h1] * pml_wfd->psi_syz_z[j][i][h1] + pml_coeff->a_z[h1] * syz_z;
-                    syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd->psi_syz_z[j][i][h1];
-                    pml_wfd->psi_szz_z[j][i][h1] =
-                        pml_coeff->b_z_half[h1] * pml_wfd->psi_szz_z[j][i][h1] + pml_coeff->a_z_half[h1] * szz_z;
-                    szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_szz_z[j][i][h1];
-
-                    vel->vx[j][i][k] += (sxx_x + sxy_y + sxz_z) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (syy_y + sxy_x + syz_z) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (szz_z + sxz_x + syz_y) / mod_av->rkp[j][i][k];
+                    pml_wfd.psi_sxz_z[j, i, h1] =
+                        pml_coeff->b_z[h1] * pml_wfd.psi_sxz_z[j, i, h1] + pml_coeff->a_z[h1] * sxz_z;
+                    sxz_z = sxz_z / pml_coeff->K_z[h1] + pml_wfd.psi_sxz_z[j, i, h1];
+                    pml_wfd.psi_syz_z[j, i, h1] =
+                        pml_coeff->b_z[h1] * pml_wfd.psi_syz_z[j, i, h1] + pml_coeff->a_z[h1] * syz_z;
+                    syz_z = syz_z / pml_coeff->K_z[h1] + pml_wfd.psi_syz_z[j, i, h1];
+                    pml_wfd.psi_szz_z[j, i, h1] =
+                        pml_coeff->b_z_half[h1] * pml_wfd.psi_szz_z[j, i, h1] + pml_coeff->a_z_half[h1] * szz_z;
+                    szz_z = szz_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_szz_z[j, i, h1];
+
+                    vel.vx[j, i, k] += (sxx_x + sxy_y + sxz_z) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (syy_y + sxy_x + syz_z) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (szz_z + sxz_x + syz_y) / mod_av.rkp[j, i, k];
                 }
             }
         }
diff --git a/src/update_v_ssg_CPML_acoustic.cpp b/src/update_v_ssg_CPML_acoustic.cpp
index 3947d20bcc0c6d578197de54bd5daede589ce87c..e8e0b3e588632ec7af697c66b766c93250947f7c 100644
--- a/src/update_v_ssg_CPML_acoustic.cpp
+++ b/src/update_v_ssg_CPML_acoustic.cpp
@@ -30,8 +30,8 @@
 
 #define UNUSED(x) (void)(x)
 
-void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress, st_model_av *mod_av,
-                            st_pml_coeff *pml_coeff, st_pml_wfd *pml_wfd, const GlobVar *gv)
+void update_v_CPML_acoustic(st_boundary *nb, st_velocity &vel, st_stress &stress, st_model_av &mod_av,
+                            st_pml_coeff *pml_coeff, st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     float sp_x = 0.0, sp_y = 0.0, sp_z = 0.0;
     int h1;
@@ -56,47 +56,47 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
-                    pml_wfd->psi_sp_x[j][i][k] =
-                        pml_coeff->b_x_half[i] * pml_wfd->psi_sp_x[j][i][k] + pml_coeff->a_x_half[i] * sp_x;
-                    sp_x = sp_x / pml_coeff->K_x_half[i] + pml_wfd->psi_sp_x[j][i][k];
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
+                    pml_wfd.psi_sp_x[j, i, k] =
+                        pml_coeff->b_x_half[i] * pml_wfd.psi_sp_x[j, i, k] + pml_coeff->a_x_half[i] * sp_x;
+                    sp_x = sp_x / pml_coeff->K_x_half[i] + pml_wfd.psi_sp_x[j, i, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_sp_y[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_sp_y[j][i][k] + pml_coeff->a_y_half[j] * sp_y;
-                        sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd->psi_sp_y[j][i][k];
+                        pml_wfd.psi_sp_y[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_sp_y[j, i, k] + pml_coeff->a_y_half[j] * sp_y;
+                        sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd.psi_sp_y[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
-                        pml_wfd->psi_sp_y[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_sp_y[h1][i][k] + pml_coeff->a_y_half[h1] * sp_y;
-                        sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_sp_y[h1][i][k];
+                        pml_wfd.psi_sp_y[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_sp_y[h1, i, k] + pml_coeff->a_y_half[h1] * sp_y;
+                        sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_sp_y[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sp_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_sp_z[j][i][k] + pml_coeff->a_z_half[k] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd->psi_sp_z[j][i][k];
+                        pml_wfd.psi_sp_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_sp_z[j, i, k] + pml_coeff->a_z_half[k] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd.psi_sp_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sp_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_sp_z[j][i][h1] + pml_coeff->a_z_half[h1] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_sp_z[j][i][h1];
+                        pml_wfd.psi_sp_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_sp_z[j, i, h1] + pml_coeff->a_z_half[h1] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_sp_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -108,48 +108,48 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
                     h1 = (i - nb->nx2 + gv->FW);
-                    pml_wfd->psi_sp_x[j][h1][k] =
-                        pml_coeff->b_x_half[h1] * pml_wfd->psi_sp_x[j][h1][k] + pml_coeff->a_x_half[h1] * sp_x;
-                    sp_x = sp_x / pml_coeff->K_x_half[h1] + pml_wfd->psi_sp_x[j][h1][k];
+                    pml_wfd.psi_sp_x[j, h1, k] =
+                        pml_coeff->b_x_half[h1] * pml_wfd.psi_sp_x[j, h1, k] + pml_coeff->a_x_half[h1] * sp_x;
+                    sp_x = sp_x / pml_coeff->K_x_half[h1] + pml_wfd.psi_sp_x[j, h1, k];
 
                     if ((gv->POS[2] == 0 && gv->FREE_SURF == 0) && (j <= gv->FW)) {
-                        pml_wfd->psi_sp_y[j][i][k] =
-                            pml_coeff->b_y_half[j] * pml_wfd->psi_sp_y[j][i][k] + pml_coeff->a_y_half[j] * sp_y;
-                        sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd->psi_sp_y[j][i][k];
+                        pml_wfd.psi_sp_y[j, i, k] =
+                            pml_coeff->b_y_half[j] * pml_wfd.psi_sp_y[j, i, k] + pml_coeff->a_y_half[j] * sp_y;
+                        sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd.psi_sp_y[j, i, k];
                     }
 
                     if ((gv->POS[2] == gv->NPROCY - 1) && (j >= nb->ny2 + 1)) {
                         h1 = (j - nb->ny2 + gv->FW);
-                        pml_wfd->psi_sp_y[h1][i][k] =
-                            pml_coeff->b_y_half[h1] * pml_wfd->psi_sp_y[h1][i][k] + pml_coeff->a_y_half[h1] * sp_y;
-                        sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_sp_y[h1][i][k];
+                        pml_wfd.psi_sp_y[h1, i, k] =
+                            pml_coeff->b_y_half[h1] * pml_wfd.psi_sp_y[h1, i, k] + pml_coeff->a_y_half[h1] * sp_y;
+                        sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_sp_y[h1, i, k];
                     }
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sp_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_sp_z[j][i][k] + pml_coeff->a_z_half[k] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd->psi_sp_z[j][i][k];
+                        pml_wfd.psi_sp_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_sp_z[j, i, k] + pml_coeff->a_z_half[k] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd.psi_sp_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sp_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_sp_z[j][i][h1] + pml_coeff->a_z_half[h1] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_sp_z[j][i][h1];
+                        pml_wfd.psi_sp_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_sp_z[j, i, h1] + pml_coeff->a_z_half[h1] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_sp_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -161,34 +161,34 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
-                    pml_wfd->psi_sp_y[j][i][k] =
-                        pml_coeff->b_y_half[j] * pml_wfd->psi_sp_y[j][i][k] + pml_coeff->a_y_half[j] * sp_y;
-                    sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd->psi_sp_y[j][i][k];
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
+                    pml_wfd.psi_sp_y[j, i, k] =
+                        pml_coeff->b_y_half[j] * pml_wfd.psi_sp_y[j, i, k] + pml_coeff->a_y_half[j] * sp_y;
+                    sp_y = sp_y / pml_coeff->K_y_half[j] + pml_wfd.psi_sp_y[j, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sp_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_sp_z[j][i][k] + pml_coeff->a_z_half[k] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd->psi_sp_z[j][i][k];
+                        pml_wfd.psi_sp_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_sp_z[j, i, k] + pml_coeff->a_z_half[k] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd.psi_sp_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sp_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_sp_z[j][i][h1] + pml_coeff->a_z_half[h1] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_sp_z[j][i][h1];
+                        pml_wfd.psi_sp_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_sp_z[j, i, h1] + pml_coeff->a_z_half[h1] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_sp_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -200,35 +200,35 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
                     h1 = (j - nb->ny2 + gv->FW);
-                    pml_wfd->psi_sp_y[h1][i][k] =
-                        pml_coeff->b_y_half[h1] * pml_wfd->psi_sp_y[h1][i][k] + pml_coeff->a_y_half[h1] * sp_y;
-                    sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd->psi_sp_y[h1][i][k];
+                    pml_wfd.psi_sp_y[h1, i, k] =
+                        pml_coeff->b_y_half[h1] * pml_wfd.psi_sp_y[h1, i, k] + pml_coeff->a_y_half[h1] * sp_y;
+                    sp_y = sp_y / pml_coeff->K_y_half[h1] + pml_wfd.psi_sp_y[h1, i, k];
 
                     if ((gv->POS[3] == 0) && (k <= gv->FW)) {
-                        pml_wfd->psi_sp_z[j][i][k] =
-                            pml_coeff->b_z_half[k] * pml_wfd->psi_sp_z[j][i][k] + pml_coeff->a_z_half[k] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd->psi_sp_z[j][i][k];
+                        pml_wfd.psi_sp_z[j, i, k] =
+                            pml_coeff->b_z_half[k] * pml_wfd.psi_sp_z[j, i, k] + pml_coeff->a_z_half[k] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd.psi_sp_z[j, i, k];
                     }
 
                     if ((gv->POS[3] == gv->NPROCZ - 1) && (k >= nb->nz2 + 1)) {
                         h1 = (k - nb->nz2 + gv->FW);
-                        pml_wfd->psi_sp_z[j][i][h1] =
-                            pml_coeff->b_z_half[h1] * pml_wfd->psi_sp_z[j][i][h1] + pml_coeff->a_z_half[h1] * sp_z;
-                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_sp_z[j][i][h1];
+                        pml_wfd.psi_sp_z[j, i, h1] =
+                            pml_coeff->b_z_half[h1] * pml_wfd.psi_sp_z[j, i, h1] + pml_coeff->a_z_half[h1] * sp_z;
+                        sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_sp_z[j, i, h1];
                     }
 
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -242,21 +242,21 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = 1; k <= gv->FW; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
-                    pml_wfd->psi_sp_z[j][i][k] =
-                        pml_coeff->b_z_half[k] * pml_wfd->psi_sp_z[j][i][k] + pml_coeff->a_z_half[k] * sp_z;
-                    sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd->psi_sp_z[j][i][k];
-
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
+                    pml_wfd.psi_sp_z[j, i, k] =
+                        pml_coeff->b_z_half[k] * pml_wfd.psi_sp_z[j, i, k] + pml_coeff->a_z_half[k] * sp_z;
+                    sp_z = sp_z / pml_coeff->K_z_half[k] + pml_wfd.psi_sp_z[j, i, k];
+
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -268,22 +268,22 @@ void update_v_CPML_acoustic(st_boundary *nb, st_velocity *vel, st_stress *stress
                 #pragma omp simd
                 for (int k = nb->nz2 + 1; k <= nb->nz2 + gv->FW; k++) {
                     sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
                     h1 = (k - nb->nz2 + gv->FW);
-                    pml_wfd->psi_sp_z[j][i][h1] =
-                        pml_coeff->b_z_half[h1] * pml_wfd->psi_sp_z[j][i][h1] + pml_coeff->a_z_half[h1] * sp_z;
-                    sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd->psi_sp_z[j][i][h1];
+                    pml_wfd.psi_sp_z[j, i, h1] =
+                        pml_coeff->b_z_half[h1] * pml_wfd.psi_sp_z[j, i, h1] + pml_coeff->a_z_half[h1] * sp_z;
+                    sp_z = sp_z / pml_coeff->K_z_half[h1] + pml_wfd.psi_sp_z[j, i, h1];
 
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
diff --git a/src/update_v_ssg_acoustic.cpp b/src/update_v_ssg_acoustic.cpp
index 03dbe733e5c097764ae12d021ccf50f2afefa577..116205208a83833de0997a351273e3d7e1ddf096 100644
--- a/src/update_v_ssg_acoustic.cpp
+++ b/src/update_v_ssg_acoustic.cpp
@@ -24,8 +24,8 @@
 
 #include "fd.hpp"
 
-void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_stress *__restrict__ stress,
-                       st_model_av *mod_av, float ***absorb_coeff, const GlobVar *gv)
+void update_v_acoustic(const st_boundary *nb, st_velocity &vel, st_stress &stress,
+                       st_model_av &mod_av, float3DTensorT &absorb_coeff, const GlobVar *gv)
 {
     float b1, b2, b3, b4, b5, b6;
     float sp_x, sp_y, sp_z;
@@ -34,81 +34,74 @@ void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_
     float dz = gv->DT / gv->DZ;
 
     switch (gv->FDORDER) {
-    case 2:
-    {
+    case 2: {
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    float sp_x = dx * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]);
-                    vel->vx[j][i][k] += sp_x / mod_av->rip[j][i][k];
-                    float sp_y = dy * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]);
-                    vel->vy[j][i][k] += sp_y / mod_av->rjp[j][i][k];
-                    float sp_z = dz * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]);
-                    vel->vz[j][i][k] += sp_z / mod_av->rkp[j][i][k];
+                    float sp_x = dx * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]);
+                    vel.vx[j, i, k] += sp_x / mod_av.rip[j, i, k];
+                    float sp_y = dy * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]);
+                    vel.vy[j, i, k] += sp_y / mod_av.rjp[j, i, k];
+                    float sp_z = dz * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]);
+                    vel.vz[j, i, k] += sp_z / mod_av.rkp[j, i, k];
                 }
             }
         }
-    }
-    break;
-    case 4:
-    {
-        float b1 = 9.0 / 8.0;          /* Taylor coefficients */
+    } break;
+    case 4: {
+        float b1 = 9.0 / 8.0;   /* Taylor coefficients */
         float b2 = -1.0 / 24.0;
-        if (gv->FDCOEFF == 2) {        /* Holberg coefficients E=0.1 % */
+        if (gv->FDCOEFF == 2) { /* Holberg coefficients E=0.1 % */
             b1 = 1.1382;
             b2 = -0.046414;
         }
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
-                float *vx_j_i = vel->vx[j][i];
-                float *vy_j_i = vel->vy[j][i];
-                float *vz_j_i = vel->vz[j][i];
-                #pragma omp simd nontemporal(vx_j_i, vy_j_i, vz_j_i)
+                #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
                     float sp_x =
-                        dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]));
+                        dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]));
                     float sp_y =
-                        dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]));
+                        dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]));
                     float sp_z =
-                        dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                              b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]));
-                    vx_j_i[k] += sp_x / mod_av->rip[j][i][k];
-                    vy_j_i[k] += sp_y / mod_av->rjp[j][i][k];
-                    vz_j_i[k] += sp_z / mod_av->rkp[j][i][k];
+                        dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                              b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]));
+                    vel.vx[j, i, k] += sp_x / mod_av.rip[j, i, k];
+                    vel.vy[j, i, k] += sp_y / mod_av.rjp[j, i, k];
+                    vel.vz[j, i, k] += sp_z / mod_av.rkp[j, i, k];
                 }
             }
         }
-    }
-    break;
+    } break;
     case 6:
         b1 = 75.0 / 64.0;
         b2 = -25.0 / 384.0;
-        b3 = 3.0 / 640.0;     /* Taylor coefficients */
+        b3 = 3.0 / 640.0; /* Taylor coefficients */
         if (gv->FDCOEFF == 2) {
             b1 = 1.1965;
             b2 = -0.078804;
             b3 = 0.0081781;
-        }                     /* Holberg coefficients E=0.1 % */
+        } /* Holberg coefficients E=0.1 % */
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sp_x = dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]) +
-                                 b3 * (stress->sp[j][i + 3][k] - stress->sp[j][i - 2][k]));
+                    sp_x = dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]) +
+                                 b3 * (stress.sp[j, i + 3, k] - stress.sp[j, i - 2, k]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    sp_y = dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]) +
-                                 b3 * (stress->sp[j + 3][i][k] - stress->sp[j - 2][i][k]));
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    sp_z = dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]) +
-                                 b3 * (stress->sp[j][i][k + 3] - stress->sp[j][i][k - 2]));
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    sp_y = dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]) +
+                                 b3 * (stress.sp[j + 3, i, k] - stress.sp[j - 2, i, k]));
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    sp_z = dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]) +
+                                 b3 * (stress.sp[j, i, k + 3] - stress.sp[j, i, k - 2]));
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -117,36 +110,33 @@ void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_
         b1 = 1225.0 / 1024.0;
         b2 = -245.0 / 3072.0;
         b3 = 49.0 / 5120.0;
-        b4 = -5.0 / 7168.0;   /* Taylor coefficients */
+        b4 = -5.0 / 7168.0; /* Taylor coefficients */
         if (gv->FDCOEFF == 2) {
             b1 = 1.2257;
             b2 = -0.099537;
             b3 = 0.018063;
             b4 = -0.0026274;
-        }                     /* Holberg coefficients E=0.1 % */
+        } /* Holberg coefficients E=0.1 % */
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
-                float *vx_j_i = vel->vx[j][i];
-                float *vy_j_i = vel->vy[j][i];
-                float *vz_j_i = vel->vz[j][i];
-                #pragma omp simd nontemporal(vx_j_i, vy_j_i, vz_j_i)
+                #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sp_x = dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]) +
-                                 b3 * (stress->sp[j][i + 3][k] - stress->sp[j][i - 2][k]) +
-                                 b4 * (stress->sp[j][i + 4][k] - stress->sp[j][i - 3][k]));
+                    sp_x = dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]) +
+                                 b3 * (stress.sp[j, i + 3, k] - stress.sp[j, i - 2, k]) +
+                                 b4 * (stress.sp[j, i + 4, k] - stress.sp[j, i - 3, k]));
                     /* updating components of particle velocities */
-                    vx_j_i[k] += (sp_x) / mod_av->rip[j][i][k];
-                    sp_y = dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]) +
-                                 b3 * (stress->sp[j + 3][i][k] - stress->sp[j - 2][i][k]) +
-                                 b4 * (stress->sp[j + 4][i][k] - stress->sp[j - 3][i][k]));
-                    vy_j_i[k] += (sp_y) / mod_av->rjp[j][i][k];
-                    sp_z = dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]) +
-                                 b3 * (stress->sp[j][i][k + 3] - stress->sp[j][i][k - 2]) +
-                                 b4 * (stress->sp[j][i][k + 4] - stress->sp[j][i][k - 3]));
-                    vz_j_i[k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    sp_y = dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]) +
+                                 b3 * (stress.sp[j + 3, i, k] - stress.sp[j - 2, i, k]) +
+                                 b4 * (stress.sp[j + 4, i, k] - stress.sp[j - 3, i, k]));
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    sp_z = dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]) +
+                                 b3 * (stress.sp[j, i, k + 3] - stress.sp[j, i, k - 2]) +
+                                 b4 * (stress.sp[j, i, k + 4] - stress.sp[j, i, k - 3]));
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -163,30 +153,30 @@ void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_
             b3 = 0.026191;
             b4 = -0.0064682;
             b5 = 0.001191;
-        }                     /* Holberg coefficients E=0.1 % */
+        } /* Holberg coefficients E=0.1 % */
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sp_x = dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]) +
-                                 b3 * (stress->sp[j][i + 3][k] - stress->sp[j][i - 2][k]) +
-                                 b4 * (stress->sp[j][i + 4][k] - stress->sp[j][i - 3][k]) +
-                                 b5 * (stress->sp[j][i + 5][k] - stress->sp[j][i - 4][k]));
+                    sp_x = dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]) +
+                                 b3 * (stress.sp[j, i + 3, k] - stress.sp[j, i - 2, k]) +
+                                 b4 * (stress.sp[j, i + 4, k] - stress.sp[j, i - 3, k]) +
+                                 b5 * (stress.sp[j, i + 5, k] - stress.sp[j, i - 4, k]));
                     /* updating components of particle velocities */
-                    vel->vx[j][i][k] += (sp_x) / mod_av->rip[j][i][k];
-                    sp_y = dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]) +
-                                 b3 * (stress->sp[j + 3][i][k] - stress->sp[j - 2][i][k]) +
-                                 b4 * (stress->sp[j + 4][i][k] - stress->sp[j - 3][i][k]) +
-                                 b5 * (stress->sp[j + 5][i][k] - stress->sp[j - 4][i][k]));
-                    vel->vy[j][i][k] += (sp_y) / mod_av->rjp[j][i][k];
-                    sp_z = dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]) +
-                                 b3 * (stress->sp[j][i][k + 3] - stress->sp[j][i][k - 2]) +
-                                 b4 * (stress->sp[j][i][k + 4] - stress->sp[j][i][k - 3]) +
-                                 b5 * (stress->sp[j][i][k + 5] - stress->sp[j][i][k - 4]));
-                    vel->vz[j][i][k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    sp_y = dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]) +
+                                 b3 * (stress.sp[j + 3, i, k] - stress.sp[j - 2, i, k]) +
+                                 b4 * (stress.sp[j + 4, i, k] - stress.sp[j - 3, i, k]) +
+                                 b5 * (stress.sp[j + 5, i, k] - stress.sp[j - 4, i, k]));
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    sp_z = dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]) +
+                                 b3 * (stress.sp[j, i, k + 3] - stress.sp[j, i, k - 2]) +
+                                 b4 * (stress.sp[j, i, k + 4] - stress.sp[j, i, k - 3]) +
+                                 b5 * (stress.sp[j, i, k + 5] - stress.sp[j, i, k - 4]));
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -210,33 +200,30 @@ void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_
         }
         for (int j = nb->ny1; j <= nb->ny2; j++) {
             for (int i = nb->nx1; i <= nb->nx2; i++) {
-                float *vx_j_i = vel->vx[j][i];
-                float *vy_j_i = vel->vy[j][i];
-                float *vz_j_i = vel->vz[j][i];
-                #pragma omp simd nontemporal(vx_j_i, vy_j_i, vz_j_i)
+                #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    sp_x = dx * (b1 * (stress->sp[j][i + 1][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i + 2][k] - stress->sp[j][i - 1][k]) +
-                                 b3 * (stress->sp[j][i + 3][k] - stress->sp[j][i - 2][k]) +
-                                 b4 * (stress->sp[j][i + 4][k] - stress->sp[j][i - 3][k]) +
-                                 b5 * (stress->sp[j][i + 5][k] - stress->sp[j][i - 4][k]) +
-                                 b6 * (stress->sp[j][i + 6][k] - stress->sp[j][i - 5][k]));
+                    sp_x = dx * (b1 * (stress.sp[j, i + 1, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i + 2, k] - stress.sp[j, i - 1, k]) +
+                                 b3 * (stress.sp[j, i + 3, k] - stress.sp[j, i - 2, k]) +
+                                 b4 * (stress.sp[j, i + 4, k] - stress.sp[j, i - 3, k]) +
+                                 b5 * (stress.sp[j, i + 5, k] - stress.sp[j, i - 4, k]) +
+                                 b6 * (stress.sp[j, i + 6, k] - stress.sp[j, i - 5, k]));
                     /* updating components of particle velocities */
-                    vx_j_i[k] += (sp_x) / mod_av->rip[j][i][k];
-                    sp_y = dy * (b1 * (stress->sp[j + 1][i][k] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j + 2][i][k] - stress->sp[j - 1][i][k]) +
-                                 b3 * (stress->sp[j + 3][i][k] - stress->sp[j - 2][i][k]) +
-                                 b4 * (stress->sp[j + 4][i][k] - stress->sp[j - 3][i][k]) +
-                                 b5 * (stress->sp[j + 5][i][k] - stress->sp[j - 4][i][k]) +
-                                 b6 * (stress->sp[j + 6][i][k] - stress->sp[j - 5][i][k]));
-                    vy_j_i[k] += (sp_y) / mod_av->rjp[j][i][k];
-                    sp_z = dz * (b1 * (stress->sp[j][i][k + 1] - stress->sp[j][i][k]) +
-                                 b2 * (stress->sp[j][i][k + 2] - stress->sp[j][i][k - 1]) +
-                                 b3 * (stress->sp[j][i][k + 3] - stress->sp[j][i][k - 2]) +
-                                 b4 * (stress->sp[j][i][k + 4] - stress->sp[j][i][k - 3]) +
-                                 b5 * (stress->sp[j][i][k + 5] - stress->sp[j][i][k - 4]) +
-                                 b6 * (stress->sp[j][i][k + 6] - stress->sp[j][i][k - 5]));
-                    vz_j_i[k] += (sp_z) / mod_av->rkp[j][i][k];
+                    vel.vx[j, i, k] += (sp_x) / mod_av.rip[j, i, k];
+                    sp_y = dy * (b1 * (stress.sp[j + 1, i, k] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j + 2, i, k] - stress.sp[j - 1, i, k]) +
+                                 b3 * (stress.sp[j + 3, i, k] - stress.sp[j - 2, i, k]) +
+                                 b4 * (stress.sp[j + 4, i, k] - stress.sp[j - 3, i, k]) +
+                                 b5 * (stress.sp[j + 5, i, k] - stress.sp[j - 4, i, k]) +
+                                 b6 * (stress.sp[j + 6, i, k] - stress.sp[j - 5, i, k]));
+                    vel.vy[j, i, k] += (sp_y) / mod_av.rjp[j, i, k];
+                    sp_z = dz * (b1 * (stress.sp[j, i, k + 1] - stress.sp[j, i, k]) +
+                                 b2 * (stress.sp[j, i, k + 2] - stress.sp[j, i, k - 1]) +
+                                 b3 * (stress.sp[j, i, k + 3] - stress.sp[j, i, k - 2]) +
+                                 b4 * (stress.sp[j, i, k + 4] - stress.sp[j, i, k - 3]) +
+                                 b5 * (stress.sp[j, i, k + 5] - stress.sp[j, i, k - 4]) +
+                                 b6 * (stress.sp[j, i, k + 6] - stress.sp[j, i, k - 5]));
+                    vel.vz[j, i, k] += (sp_z) / mod_av.rkp[j, i, k];
                 }
             }
         }
@@ -250,10 +237,10 @@ void update_v_acoustic(const st_boundary *nb, st_velocity *__restrict__ vel, st_
             for (int i = nb->nx1; i <= nb->nx2; i++) {
                 #pragma omp simd
                 for (int k = nb->nz1; k <= nb->nz2; k++) {
-                    vel->vx[j][i][k] *= absorb_coeff[j][i][k];
-                    vel->vy[j][i][k] *= absorb_coeff[j][i][k];
-                    vel->vz[j][i][k] *= absorb_coeff[j][i][k];
-                    stress->sp[j][i][k] *= absorb_coeff[j][i][k];
+                    vel.vx[j, i, k] *= absorb_coeff[j, i, k];
+                    vel.vy[j, i, k] *= absorb_coeff[j, i, k];
+                    vel.vz[j, i, k] *= absorb_coeff[j, i, k];
+                    stress.sp[j, i, k] *= absorb_coeff[j, i, k];
                 }
             }
         }
diff --git a/src/zero_wavefield.cpp b/src/zero_wavefield.cpp
index ae3c689ec8dcfc11fdcb8ed7ca79d0bed5bcbf59..e3d0ad615e0803478d254cdb2324f597fc9439af 100644
--- a/src/zero_wavefield.cpp
+++ b/src/zero_wavefield.cpp
@@ -22,7 +22,7 @@
  * -------------------------------------------------------------------------*/
 
 #include "fd.hpp"
-void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pml_wfd *pml_wfd, const GlobVar *gv)
+void zero_wavefield(st_velocity &vel, st_stress &stress, st_visc_mem *mem, st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     int l = 1;
 
@@ -50,11 +50,11 @@ void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pm
         for (int i = nx1; i <= nx2; i++) {
             #pragma omp simd
             for (int k = nz1; k <= nz2; k++) {
-                vel->vx[j][i][k] = 0.0f;
-                vel->vy[j][i][k] = 0.0f;
-                vel->vz[j][i][k] = 0.0f;
-                stress->sxy[j][i][k] = 0.0f;
-                stress->syz[j][i][k] = 0.0f;
+                vel.vx[j, i, k] = 0.0f;
+                vel.vy[j, i, k] = 0.0f;
+                vel.vz[j, i, k] = 0.0f;
+                stress.sxy[j, i, k] = 0.0f;
+                stress.syz[j, i, k] = 0.0f;
             }
         }
     }
@@ -65,10 +65,10 @@ void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pm
         for (int i = nx1; i <= nx2; i++) {
             #pragma omp simd
             for (int k = nz1; k <= nz2; k++) {
-                stress->sxx[j][i][k] = 0.0f;
-                stress->sxz[j][i][k] = 0.0f;
-                stress->syy[j][i][k] = 0.0f;
-                stress->szz[j][i][k] = 0.0f;
+                stress.sxx[j, i, k] = 0.0f;
+                stress.sxz[j, i, k] = 0.0f;
+                stress.syy[j, i, k] = 0.0f;
+                stress.szz[j, i, k] = 0.0f;
             }
         }
     }
@@ -94,12 +94,12 @@ void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pm
             for (int i = 1; i <= gv->NX; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= 2 * gv->FW; k++) {
-                    pml_wfd->psi_sxz_z[j][i][k] = 0.0f;
-                    pml_wfd->psi_syz_z[j][i][k] = 0.0f;
-                    pml_wfd->psi_szz_z[j][i][k] = 0.0f;
-                    pml_wfd->psi_vxz[j][i][k] = 0.0f;
-                    pml_wfd->psi_vyz[j][i][k] = 0.0f;
-                    pml_wfd->psi_vzz[j][i][k] = 0.0f;
+                    pml_wfd.psi_sxz_z[j, i, k] = 0.0f;
+                    pml_wfd.psi_syz_z[j, i, k] = 0.0f;
+                    pml_wfd.psi_szz_z[j, i, k] = 0.0f;
+                    pml_wfd.psi_vxz[j, i, k] = 0.0f;
+                    pml_wfd.psi_vyz[j, i, k] = 0.0f;
+                    pml_wfd.psi_vzz[j, i, k] = 0.0f;
                 }
             }
         }
@@ -108,12 +108,12 @@ void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pm
             for (int i = 1; i <= 2 * gv->FW; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
-                    pml_wfd->psi_sxx_x[j][i][k] = 0.0f;
-                    pml_wfd->psi_sxy_x[j][i][k] = 0.0f;
-                    pml_wfd->psi_sxz_x[j][i][k] = 0.0f;
-                    pml_wfd->psi_vxx[j][i][k] = 0.0f;
-                    pml_wfd->psi_vyx[j][i][k] = 0.0f;
-                    pml_wfd->psi_vzx[j][i][k] = 0.0f;
+                    pml_wfd.psi_sxx_x[j, i, k] = 0.0f;
+                    pml_wfd.psi_sxy_x[j, i, k] = 0.0f;
+                    pml_wfd.psi_sxz_x[j, i, k] = 0.0f;
+                    pml_wfd.psi_vxx[j, i, k] = 0.0f;
+                    pml_wfd.psi_vyx[j, i, k] = 0.0f;
+                    pml_wfd.psi_vzx[j, i, k] = 0.0f;
                 }
             }
         }
@@ -122,12 +122,12 @@ void zero_wavefield(st_velocity *vel, st_stress *stress, st_visc_mem *mem, st_pm
             for (int i = 1; i <= gv->NX; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
-                    pml_wfd->psi_sxy_y[j][i][k] = 0.0f;
-                    pml_wfd->psi_syy_y[j][i][k] = 0.0f;
-                    pml_wfd->psi_syz_y[j][i][k] = 0.0f;
-                    pml_wfd->psi_vxy[j][i][k] = 0.0f;
-                    pml_wfd->psi_vyy[j][i][k] = 0.0f;
-                    pml_wfd->psi_vzy[j][i][k] = 0.0f;
+                    pml_wfd.psi_sxy_y[j, i, k] = 0.0f;
+                    pml_wfd.psi_syy_y[j, i, k] = 0.0f;
+                    pml_wfd.psi_syz_y[j, i, k] = 0.0f;
+                    pml_wfd.psi_vxy[j, i, k] = 0.0f;
+                    pml_wfd.psi_vyy[j, i, k] = 0.0f;
+                    pml_wfd.psi_vzy[j, i, k] = 0.0f;
                 }
             }
         }
diff --git a/src/zero_wavefield_acoustic.cpp b/src/zero_wavefield_acoustic.cpp
index 60a0729fe33e2cdaa5e71c409a62f5e680103b46..e9c700287ea008ae60da08a338d9265856184cb2 100644
--- a/src/zero_wavefield_acoustic.cpp
+++ b/src/zero_wavefield_acoustic.cpp
@@ -22,8 +22,8 @@
  * -------------------------------------------------------------------------*/
 
 #include "fd.hpp"
-void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *mem,
-                             st_pml_wfd *pml_wfd, const GlobVar *gv)
+void zero_wavefield_acoustic(st_velocity &vel, st_stress &stress, st_visc_mem *mem,
+                             st_pml_wfd &pml_wfd, const GlobVar *gv)
 {
     int l = 1;
 
@@ -51,9 +51,9 @@ void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *m
         for (int i = nx1; i <= nx2; i++) {
             #pragma omp simd
             for (int k = nz1; k <= nz2; k++) {
-                vel->vx[j][i][k] = 0.0f;
-                vel->vy[j][i][k] = 0.0f;
-                vel->vz[j][i][k] = 0.0f;
+                vel.vx[j, i, k] = 0.0f;
+                vel.vy[j, i, k] = 0.0f;
+                vel.vz[j, i, k] = 0.0f;
             }
         }
     }
@@ -64,7 +64,7 @@ void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *m
         for (int i = nx1; i <= nx2; i++) {
             #pragma omp simd
             for (int k = nz1; k <= nz2; k++) {
-                stress->sp[j][i][k] = 0.0f;
+                stress.sp[j, i, k] = 0.0f;
             }
         }
     }
@@ -85,8 +85,8 @@ void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *m
             for (int i = 1; i <= gv->NX; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= 2 * gv->FW; k++) {
-                    pml_wfd->psi_sp_z[j][i][k] = 0.0f;
-                    pml_wfd->psi_vzz[j][i][k] = 0.0f;
+                    pml_wfd.psi_sp_z[j, i, k] = 0.0f;
+                    pml_wfd.psi_vzz[j, i, k] = 0.0f;
                 }
             }
         }
@@ -95,8 +95,8 @@ void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *m
             for (int i = 1; i <= 2 * gv->FW; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
-                    pml_wfd->psi_sp_x[j][i][k] = 0.0f;
-                    pml_wfd->psi_vxx[j][i][k] = 0.0f;
+                    pml_wfd.psi_sp_x[j, i, k] = 0.0f;
+                    pml_wfd.psi_vxx[j, i, k] = 0.0f;
                 }
             }
         }
@@ -105,8 +105,8 @@ void zero_wavefield_acoustic(st_velocity *vel, st_stress *stress, st_visc_mem *m
             for (int i = 1; i <= gv->NX; i++) {
                 #pragma omp simd
                 for (int k = 1; k <= gv->NZ; k++) {
-                    pml_wfd->psi_sp_y[j][i][k] = 0.0f;
-                    pml_wfd->psi_vyy[j][i][k] = 0.0f;
+                    pml_wfd.psi_sp_y[j, i, k] = 0.0f;
+                    pml_wfd.psi_vyy[j, i, k] = 0.0f;
                 }
             }
         }