diff --git a/src/include/tfrfme.h b/src/include/tfrfme.h
index 6a6585c3431a0760ff1e01a9ca597dab9619703b..ba2954a742b5458f8cabb1ca64729befef232e20 100644
--- a/src/include/tfrfme.h
+++ b/src/include/tfrfme.h
@@ -10,9 +10,11 @@
  */
 class Swap1 {
 protected:
-  //! NLMMT = 2 * LM * (LM + 2)
+  //! Index of the last element to be filled.
   int last_index;
+  //! Number of vector coordinates. QUESTION: correct?
   int nkv;
+  //! NLMMT = 2 * LM * (LM + 2)
   int nlmmt;
 
   //! QUESTION: definition?
@@ -57,6 +59,8 @@ public:
   ~Swap1() { delete[] wk; }
 
   /*! \brief Append an element at the end of the vector.
+   *
+   * \param value: `complex<double>` The value to be added to the vector.
    */
   void append(std::complex<double> value) { wk[last_index++] = value; }
   
@@ -109,7 +113,11 @@ public:
  */
 class Swap2 {
 protected:
-  //! Number of vector coordinates
+  //! Index of the last vector element to be filled.
+  int last_vector;
+  //! Index of the last matrix element to be filled.
+  int last_matrix;
+  //! Number of vector coordinates. QUESTION: correct?
   int nkv;
   //! QUESTION: definition?
   double *vkv;
@@ -178,7 +186,7 @@ public:
   /*! \brief Swap2 instance destroyer.
    */
   ~Swap2();
-
+  
   /*! \brief Load a Swap2 instance from binary file.
    *
    * \param file_name: `string` Name of the file.
@@ -214,6 +222,26 @@ public:
    */
   double *get_vector() { return vkv; }
 
+  /*! \brief Append an element at the end of the matrix.
+   *
+   * \param value: `double` The value to be pushed in the matrix.
+   */
+  void push_matrix(double value);
+
+  /*! \brief Append an element at the end of the vector.
+   *
+   * \param value: `double` The value to be pushed in the vector.
+   */
+  void push_vector(double value) { vkv[last_vector++] = value; }
+
+  /*! \brief Bring the matrix pointer to the start of the array.
+   */
+  void reset_matrix() { last_matrix = 0; }
+
+  /*! \brief Bring the vector pointer to the start of the array.
+   */
+  void reset_vector() { last_vector = 0; }
+
   /*! \brief Set a parameter by its name and value.
    *
    * \param param_name: `string` Name of the parameter.
diff --git a/src/libnptm/tfrfme.cpp b/src/libnptm/tfrfme.cpp
index 8933c6577b5857b775bcc28a28ba95596cc1897b..b3478d3cc34850289b6a583a6db78fbd0ae0f663 100644
--- a/src/libnptm/tfrfme.cpp
+++ b/src/libnptm/tfrfme.cpp
@@ -207,6 +207,8 @@ Swap2::Swap2(int _nkv) {
   vkv = new double[nkv]();
   vkzm = new double*[nkv];
   for (int vi = 0; vi < nkv; vi++) vkzm[vi] = new double[nkv]();
+  last_vector = 0;
+  last_matrix = 0;
 }
 
 Swap2::~Swap2() {
@@ -332,7 +334,7 @@ Swap2* Swap2::from_legacy(string file_name) {
 }
 
 long Swap2::get_memory_requirement(int _nkv) {
-  long size = (long)(3 * sizeof(int) + 11 * sizeof(double));
+  long size = (long)(5 * sizeof(int) + 11 * sizeof(double));
   size += (long)(sizeof(double) * _nkv * (_nkv + 1));
   return size;
 }
@@ -360,6 +362,13 @@ double Swap2::get_param(string param_name) {
   return value;
 }
 
+void Swap2::push_matrix(double value) {
+  int col = last_matrix % (nkv - 1);
+  int row = last_matrix - (nkv * row);
+  vkzm[row][col] = value;
+  last_matrix++;
+}
+
 void Swap2::set_param(string param_name, double value) {
   if (param_name.compare("nkv") == 0) nkv = (int)value;
   else if (param_name.compare("apfafa") == 0) apfafa = value;
@@ -644,8 +653,6 @@ TFRFME* TFRFME::from_hdf5(string file_name) {
     instance->set_param("spd", spd);
     instance->set_param("frsh", frsh);
     instance->set_param("exril", exril);
-    // Vectors and matrix need to be copied element-wise and
-    // subsequently deleted.
     str_type = "FLOAT64_(" + to_string(nxv) + ")";
     status = hdf_file->read("XVEC", str_type, instance->xv);
     str_type = "FLOAT64_(" + to_string(nyv) + ")";
@@ -658,13 +665,14 @@ TFRFME* TFRFME::from_hdf5(string file_name) {
     elements = new double[num_elements]();
     str_type = "FLOAT64_(" + to_string(num_elements) + ")";
     status = hdf_file->read("WSUM", str_type, elements);
-    for (int wi = 0; wi < _nlmmt; wi++) {
-      for (int wj = 0; wj < _nrvc; wj++) {
-	int index = (2 * _nrvc) * wi + 2 * wj;
+    int index = 0;
+    for (int wj = 0; wj < _nrvc; wj++) {
+      for (int wi = 0; wi < _nlmmt; wi++) {
 	value = complex<double>(elements[index], elements[index + 1]);
 	_wsum[wi][wj] = value;
-      } // wj loop
-    } // wi loop
+	index += 2;
+      } // wi loop
+    } // wj loop
     delete[] elements;
     status = hdf_file->close();
     delete hdf_file;
@@ -723,14 +731,14 @@ TFRFME* TFRFME::from_legacy(string file_name) {
     }
     int _nlmmt = 2 * lm * (lm + 2);
     int _nrvc = nxv * nyv * nzv;
-    for (int wi = 0; wi < _nlmmt; wi++) {
-      for (int wj = 0; wj < _nrvc; wj++) {
+    for (int wj = 0; wj < _nrvc; wj++) {
+      for (int wi = 0; wi < _nlmmt; wi++) {
 	input.read(reinterpret_cast<char *>(&rval), sizeof(double));
 	input.read(reinterpret_cast<char *>(&ival), sizeof(double));
 	complex<double> value(rval, ival);
 	_wsum[wi][wj] = value;
-      } // wj loop
-    } // wi loop
+      } // wi loop
+    } // wj loop
     input.close();
   } else {
     printf("ERROR: could not open input file \"%s\"\n", file_name.c_str());
@@ -860,19 +868,19 @@ void TFRFME::write_hdf5(string file_name) {
   rec_type_list.append(str_type);
   rec_ptr_list.append(zv);
   rec_name_list.append("WSUM");
-  str_type = "FLOAT64_(" + to_string(nlmmt) + "," + to_string(2 * nrvc) + ")";
-  rec_type_list.append(str_type);
-  // The (N x M) matrix of complex is converted to a (N x 2M) matrix of double,
-  // where REAL(E_i,j) -> E_i,(2 j) and IMAG(E_i,j) -> E_i,(2 j + 1)
   int num_elements = 2 * nlmmt * nrvc;
+  str_type = "FLOAT64_(" + to_string(num_elements) + ")";
+  rec_type_list.append(str_type);
+  // The (N x M) matrix of complex is converted to a vector of double
+  // with length (2 * N * M)
   double *ptr_elements = new double[num_elements]();
-  for (int wi = 0; wi < nlmmt; wi++) {
-    for (int wj = 0; wj < nrvc; wj++) {
-      int index = (2 * nrvc) * wi + 2 * wj;
-      ptr_elements[index] = wsum[wi][wj].real();
-      ptr_elements[index + 1] = wsum[wi][wj].imag();
-    } // wj loop
-  } // wi loop
+  int index = 0;
+  for (int wj = 0; wj < nrvc; wj++) {
+    for (int wi = 0; wi < nlmmt; wi++) {
+      ptr_elements[index++] = wsum[wi][wj].real();
+      ptr_elements[index++] = wsum[wi][wj].imag();
+    } // wi loop
+  } // wj loop
   rec_ptr_list.append(ptr_elements);
 
   string *rec_names = rec_name_list.to_array();
@@ -916,14 +924,14 @@ void TFRFME::write_legacy(string file_name) {
       output.write(reinterpret_cast<char *>(&(yv[yi])), sizeof(double));
     for (int zi = 0; zi < nzv; zi++)
       output.write(reinterpret_cast<char *>(&(zv[zi])), sizeof(double));
-    for (int wi = 0; wi < nlmmt; wi++) {
-      for (int wj = 0; wj < nrvc; wj++) {
+    for (int wj = 0; wj < nrvc; wj++) {
+      for (int wi = 0; wi < nlmmt; wi++) {
 	double rval = wsum[wi][wj].real();
 	double ival = wsum[wi][wj].imag();
 	output.write(reinterpret_cast<char *>(&rval), sizeof(double));
 	output.write(reinterpret_cast<char *>(&ival), sizeof(double));
-      } // wj loop
-    } // wi loop
+      } // wi loop
+    } // wj loop
     output.close();
   } else { // Should never occur
     printf("ERROR: could not open output file \"%s\"\n", file_name.c_str());
diff --git a/src/trapping/cfrfme.cpp b/src/trapping/cfrfme.cpp
index d96a4fad6c2733531fc046c01c897759e48431dc..c4866e1f65073bcc2f61ec54d7a23a125ac315ca 100644
--- a/src/trapping/cfrfme.cpp
+++ b/src/trapping/cfrfme.cpp
@@ -68,6 +68,8 @@ void frfme(string data_file, string output_path) {
   double apfafa = 0.0, pmf = 0.0, spd = 0.0, rir = 0.0, ftcn = 0.0, fshmx = 0.0;
   double vxyzmx = 0.0, delxyz = 0.0, vknmx = 0.0, delk = 0.0, delks = 0.0;
   double frsh = 0.0, exril = 0.0;
+  double **vkzm = NULL;
+  double *vkv = NULL;
   int nlmmt = 0, nrvc = 0;
   // Vector size variables
   int wsum_size;
@@ -90,19 +92,11 @@ void frfme(string data_file, string output_path) {
       spd = tfrfme->get_param("spd");
       frsh = tfrfme->get_param("frsh");
       exril = tfrfme->get_param("exril");
-      //fstream temptape2;
       string tempname2 = output_path + "/c_TEMPTAPE2.hd5";
-      //temptape2.open(tempname2.c_str(), ios::in | ios::binary);
       if (tt2 == NULL) tt2 = Swap2::from_binary(tempname2, "HDF5");
       if (tt2 != NULL) {
-	/*for (int jx = 0; jx < nkv; jx++) temptape2.read(reinterpret_cast<char *>(&(vkv[jx])), sizeof(double));
-	vkzm = new double*[nkv];
-	for (int vki = 0; vki < nkv; vki++) vkzm[vki] = new double[nkv]();
-	for (int jy10 = 0; jy10 < nkv; jy10++) {
-	  for (int jx10 = 0; jx10 < nkv; jx10++) {
-	    temptape2.read(reinterpret_cast<char *>(&(vkzm[jx10][jy10])), sizeof(double));
-	  } //jx10 loop
-	  } // jy10 loop*/
+	vkv = tt2->get_vector();
+	vkzm = tt2->get_matrix();
 	apfafa = tt2->get_param("apfafa");
 	pmf = tt2->get_param("pmf");
 	spd = tt2->get_param("spd");
@@ -223,9 +217,6 @@ void frfme(string data_file, string output_path) {
 	nks = nksh * 2;
 	nkv = nks + 1;
 	// Array initialization
-	/*vkv = new double[nkv]();
-	vkzm = new double*[nkv];
-	for (int vi = 0; vi < nkv; vi++) vkzm[vi] = new double[nkv];*/
 	long swap1_size, swap2_size, tfrfme_size;
 	double size_mb;
 	printf("INFO: calculation memory requirements\n");
@@ -236,8 +227,8 @@ void frfme(string data_file, string output_path) {
 	size_mb = 1.0 * swap2_size / 1024.0 / 1024.0;
 	printf("Swap 2: %.2lg MB\n", size_mb);
 	tt2 = new Swap2(nkv);
-	double *_vkv = tt2->get_vector();
-	double **_vkzm = tt2->get_matrix();
+	vkv = tt2->get_vector();
+	vkzm = tt2->get_matrix();
 	// End of array initialization
 	double vkm = vk * exri;
 	vknmx = vk * an;
@@ -280,8 +271,8 @@ void frfme(string data_file, string output_path) {
 	int nrvc = nxv * nyv * nzv;
 	int nkshpo = nksh + 1;
 	for (int i28 = nkshpo; i28 <= nks; i28++) {
-	  _vkv[i28] = _vkv[i28 - 1] + delk;
-	  _vkv[nkv - i28 - 1] = -_vkv[i28];
+	  vkv[i28] = vkv[i28 - 1] + delk;
+	  vkv[nkv - i28 - 1] = -vkv[i28];
 	} // i28 loop
 	if (tfrfme != NULL) {
 	  tfrfme->set_param("vk", vk);
@@ -297,9 +288,6 @@ void frfme(string data_file, string output_path) {
 	  string temp_name2 = output_path + "/c_TEMPTAPE2.hd5";
 	  //temptape1.open(temp_name1.c_str(), ios::out | ios::binary);
 	  tt1 = new Swap1(lm, nkv);
-	  /*temptape2.open(temp_name2.c_str(), ios::out | ios::binary);
-	  for (int jx = 0; jx < nkv; jx++)
-	  temptape2.write(reinterpret_cast<char *>(&(vkv[jx])), sizeof(double));*/
 	  if (wk != NULL) delete[] wk;
 	  wk = frfmer(nkv, vkm, vknmx, apfafa, tra, spd, rir, ftcn, lm, lmode, pmf, tt1, tt2);
 	  tt1->write_binary(temp_name1, "HDF5");
@@ -318,21 +306,7 @@ void frfme(string data_file, string output_path) {
 	  tt2->set_param("nlmmt", 1.0 * nlmmt);
 	  tt2->set_param("nrvc", 1.0 * nrvc);
 	  tt2->write_binary(temp_name2, "HDF5");
-	  //temptape2.open("c_TEMPTAPE2", ios::in | ios::binary);
-	  /*for (int jx = 0; jx < nkv; jx++) {
-	    double value = 0.0;
-	    temptape2.read(reinterpret_cast<char *>(&value), sizeof(double));
-	    vkv[jx] = value;
-	  }
-	  for (int jy40 = 0; jy40 < nkv; jy40++) {
-	    for (int jx40 = 0; jx40 < nkv; jx40++) {
-	      double value = 0.0;
-	      temptape2.read(reinterpret_cast<char *>(&value), sizeof(double));
-	      vkzm[jx40][jy40] = value;
-	    }
-	  } // jy40 loop
-	  temptape2.close();*/
-	  for (int j80 = jlmf - 1; j80 < jlml; j80++) {
+	  for (int j80 = jlmf; j80 <= jlml; j80++) {
 	    complex<double> *tt1_wk = tt1->get_vector();
 	    int wk_index = 0;
 	    // w matrix
@@ -342,24 +316,14 @@ void frfme(string data_file, string output_path) {
 	    }
 	    w = new complex<double>*[nkv];
 	    for (int wi = 0; wi < nkv; wi++) w[wi] = new complex<double>[nkv]();
-	    //if (wk != NULL) delete[] wk;
-	    //wk = new complex<double>[nlmmt]();
-	    //temptape1.open(temp_name1.c_str(), ios::in | ios::binary);
 	    for (int jy50 = 0; jy50 < nkv; jy50++) {
 	      for (int jx50 = 0; jx50 < nkv; jx50++) {
-		/*for (int i = 0; i < nlmmt; i++) {
-		  double vreal, vimag;
-		  temptape1.read(reinterpret_cast<char *>(&vreal), sizeof(double));
-		  temptape1.read(reinterpret_cast<char *>(&vimag), sizeof(double));
-		  wk[i] = complex<double>(vreal, vimag);
-		  }*/
 		for (int wi = 0; wi < nlmmt; wi++) wk[wi] = tt1_wk[wk_index++];
-		w[jx50][jy50] = wk[j80];
+		w[jx50][jy50] = wk[j80 - 1];
 	      } // jx50
 	    } // jy50 loop
-	    //temptape1.close();
 	    int ixyz = 0;
-	    for (int wj = 0; wj < nrvc; wj++) _wsum[j80][wj] = cc0;
+	    for (int wj = 0; wj < nrvc; wj++) _wsum[j80 - 1][wj] = cc0;
 	    for (int iz75 = 0; iz75 < nzv; iz75++) {
 	      double z = _zv[iz75]  + frsh;
 	      for (int iy70 = 0; iy70 < nyv; iy70++) {
@@ -369,43 +333,27 @@ void frfme(string data_file, string output_path) {
 		  ixyz++;
 		  complex<double> sumy = cc0;
 		  for (int jy60 = 0; jy60 < nkv; jy60++) {
-		    double vky = _vkv[jy60];
-		    double vkx = _vkv[nkv - 1];
-		    double vkzf = _vkzm[0][jy60];
+		    double vky = vkv[jy60];
+		    double vkx = vkv[nkv - 1];
+		    double vkzf = vkzm[0][jy60];
 		    complex<double> phasf = exp(uim * (-vkx * x + vky * y + vkzf * z));
-		    double vkzl = _vkzm[nkv - 1][jy60];
+		    double vkzl = vkzm[nkv - 1][jy60];
 		    complex<double> phasl = exp(uim * (vkx * x + vky * y + vkzl * z));
 		    complex<double> sumx = 0.5 * (w[0][jy60] * phasf + w[nkv - 1][jy60] * phasl);
 		    for (int jx55 = 2; jx55 <= nks; jx55++) {
-		      vkx = _vkv[jx55 - 1];
-		      double vkz = _vkzm[jx55 - 1][jy60];
+		      vkx = vkv[jx55 - 1];
+		      double vkz = vkzm[jx55 - 1][jy60];
 		      complex<double> phas = exp(uim * (vkx * x + vky * y + vkz * z));
 		      sumx += (w[jx55 - 1][jy60] * phas);
 		    } // jx55 loop
 		    if (jy60 == 0 || jy60 == nkv - 1) sumx *= 0.5;
 		    sumy += sumx;
 		  } // jy60 loop
-		  _wsum[j80][ixyz - 1] = sumy * delks;
+		  _wsum[j80 - 1][ixyz - 1] = sumy * delks;
 		} // ix65 loop
 	      } // iy70 loop
 	    } // iz75 loop
 	  } // j80 loop
-	  if (jlmf != 1) {
-	    lmode = (int)tfrfme->get_param("lmode");
-	    lm = (int)tfrfme->get_param("lm");
-	    nkv = (int)tfrfme->get_param("nkv");
-	    nxv = (int)tfrfme->get_param("nxv");
-	    nyv = (int)tfrfme->get_param("nyv");
-	    nzv = (int)tfrfme->get_param("nzv");
-	    vk = tfrfme->get_param("vk");
-	    exri = tfrfme->get_param("exri");
-	    an = tfrfme->get_param("an");
-	    ff = tfrfme->get_param("ff");
-	    tra = tfrfme->get_param("tra");
-	    spd = tfrfme->get_param("spd");
-	    frsh = tfrfme->get_param("frsh");
-	    exril = tfrfme->get_param("exril");
-	  }
 	  // label 88
 	  tfrfme->write_binary(tfrfme_name, "HDF5");
 	  string output_name = output_path + "/c_OFRFME";
diff --git a/src/trapping/clffft.cpp b/src/trapping/clffft.cpp
index e2c0793e6b52a2c83b2067cb6a97dc9d572dbf65..7e3619a252ada2d7102a4d88b3b2a2ba97e60f19 100644
--- a/src/trapping/clffft.cpp
+++ b/src/trapping/clffft.cpp
@@ -281,7 +281,7 @@ void lffft(string data_file, string output_path) {
 		  //binary_input.read(reinterpret_cast<char *>(&vreal), sizeof(double));
 		  //binary_input.read(reinterpret_cast<char *>(&vimag), sizeof(double));
 		  int row = i;
-		  int col = (nzv * iz475) + (nyv * iy475) + ix475;
+		  int col = (nyv * nxv * iz475) + (nxv * iy475) + ix475;
 		  complex<double> value = _wsum[row][col];
 		  if (lm <= le) {
 		    //ws[i] = complex<double>(vreal, vimag);