diff --git a/src/include/tra_subs.h b/src/include/tra_subs.h
index 780c078c3dfede172593736f0e5e5d0b14d06baa..bf3b108a9d2ada949446800aa4d09c6721c2cbfe 100644
--- a/src/include/tra_subs.h
+++ b/src/include/tra_subs.h
@@ -7,11 +7,11 @@
 #endif
 
 //Structures for TRAPPING (that will probably move to Commons)
-struct cil {
+struct CIL {
   int le, nlem, nlemt, mxmpo, mxim;
 };
 
-struct ccr {
+struct CCR {
   double cof, cimu;
 };
 //End of TRAPPING structures
@@ -286,3 +286,40 @@ void frfmer(
   } // jy90 loop
   delete[] wk;
 }
+
+/*! C++ porting of SAMPOA
+ *
+ * \param ac: Vector of complex. QUESTION: definition?
+ * \param tms: Matrix of complex. QUESTION: definition?
+ * \param ws: Vector of complex. QUESTION: definition?
+ * \param cil: `CIL *` Pointer to a CIL structure.
+ *
+ * This function builds the AC vector using TMS and WS.
+ */
+void sampoa(
+	    std::complex<double> *ac, std::complex<double> **tms, std::complex<double> *ws,
+	    CIL *cil
+) {
+  std::complex<double> **tm = new std::complex<double>*[2];
+  tm[0] = new std::complex<double>[2]();
+  tm[1] = new std::complex<double>[2]();
+  int i = 0;
+  ac = new std::complex<double>[cil->nlemt]();
+  for (int l20 = 0; l20 < cil->le; l20++) {
+    tm[0][0] = tms[l20][0];
+    tm[0][1] = tms[l20][1];
+    tm[1][1] = tms[l20][2];
+    tm[1][0] = tm[0][1];
+    int l = l20 + 1;
+    int ltpo = l + l + 1;
+    for (int im20 = 0; im20 < ltpo; im20++) {
+      int ie = i + cil->nlem;
+      ac[i] = tm[0][0] * ws[i] + tm[0][1] * ws[ie];
+      ac[ie] = tm[1][0] * ws[i] + tm[1][1] * ws[ie];
+      i++;
+    } // im20 loop
+  } // l20 loop
+  delete[] tm[1];
+  delete[] tm[0];
+  delete[] tm;
+}
diff --git a/src/trapping/lffft.cpp b/src/trapping/lffft.cpp
index 500f4230139f5e82846af1b1d2b76c8e60f12272..33d516a5ae5929d5154f4d0821072751986f31de 100644
--- a/src/trapping/lffft.cpp
+++ b/src/trapping/lffft.cpp
@@ -22,14 +22,15 @@ using namespace std;
  */
 int main() {
   const complex<double> uim(0.0, 1.0);
+  const double sq2i = 1.0 / sqrt(2.0);
+  const complex<double> sq2iti = sq2i * uim;
+
+  fstream tlfff, tlfft;
   string data_file = "../../test_data/trapping/DLFFFT";
   string output_path = ".";
-  double ****zpv = NULL, *ac = NULL;
-  complex<double> *ws = NULL;
-  double *fffe = NULL, *fffs = NULL;
-  double *ffte = NULL, *ffts = NULL;
+  double ****zpv = NULL;
   double *xv = NULL, *yv = NULL, *zv = NULL;
-  complex<double> *wsl = NULL;
+  complex<double> *ac = NULL, *ws = NULL, *wsl = NULL;
   complex<double> **am0m = NULL;
   complex<double> **amd = NULL;
   int **indam = NULL;
@@ -37,8 +38,8 @@ int main() {
   int jft, jss, jtw;
   int is, le, nvam = 0;
   double vks, exris;
-  cil *p_cil = new cil();
-  ccr *p_ccr = new ccr();
+  CIL *cil = new CIL();
+  CCR *ccr = new CCR();
 
   int num_lines = 0;
   string *file_lines = load_file(data_file, &num_lines);
@@ -60,9 +61,9 @@ int main() {
     ttms.read(reinterpret_cast<char *>(&le), sizeof(int));
     ttms.read(reinterpret_cast<char *>(&vks), sizeof(double));
     ttms.read(reinterpret_cast<char *>(&exris), sizeof(double));
-    p_cil->le = le;
-    p_cil->nlem = le * (le + 2);
-    p_cil->nlemt = p_cil->nlem + p_cil->nlem;
+    cil->le = le;
+    cil->nlem = le * (le + 2);
+    cil->nlemt = cil->nlem + cil->nlem;
     if (is > 2222) { // label 120
       tms = new complex<double>*[le];
       for (int ti = 0; ti < le; ti++) tms[ti] = new complex<double>[3]();
@@ -93,10 +94,10 @@ int main() {
 	tmse[i] = complex<double>(vreal, vimag);
       } // i loop
     } else if (is >= 0) { // label 135
-      am0m = new complex<double>*[p_cil->nlemt];
-      for (int ai = 0; ai < p_cil->nlemt; ai++) am0m[ai] = new complex<double>[p_cil->nlemt]();
-      for (int i = 0; i < p_cil->nlemt; i++) {
-	for (int j = 0; j < p_cil->nlemt; j++) {
+      am0m = new complex<double>*[cil->nlemt];
+      for (int ai = 0; ai < cil->nlemt; ai++) am0m[ai] = new complex<double>[cil->nlemt]();
+      for (int i = 0; i < cil->nlemt; i++) {
+	for (int j = 0; j < cil->nlemt; j++) {
 	  double vreal, vimag;
 	  ttms.read(reinterpret_cast<char *>(&vreal), sizeof(double));
 	  ttms.read(reinterpret_cast<char *>(&vimag), sizeof(double));
@@ -125,8 +126,8 @@ int main() {
 	} // j loop
       } // i loop
       ttms.read(reinterpret_cast<char *>(&vint), sizeof(int));
-      p_cil->mxmpo = vint;
-      p_cil->mxim = vint * 2 - 1;
+      cil->mxmpo = vint;
+      cil->mxim = vint * 2 - 1;
     }
     // label 150
     ttms.close();
@@ -174,11 +175,10 @@ int main() {
 	    thdps(le, zpv);
 	    double exdc = exri * exri;
 	    double sqk = vk * vk * exdc;
-	    p_ccr->cof = 1.0 / sqk;
-	    p_ccr->cimu = p_ccr->cof / sqrt(2.0);
+	    ccr->cof = 1.0 / sqk;
+	    ccr->cimu = ccr->cof / sqrt(2.0);
 	    if (jss != 1) {
 	      string tlfff_name = output_path + "/c_TLFFF";
-	      fstream tlfff;
 	      tlfff.open(tlfff_name.c_str(), ios::out | ios::binary);
 	      if (tlfff.is_open()) {
 		tlfff.write(reinterpret_cast<char *>(&lmode), sizeof(int));
@@ -209,13 +209,121 @@ int main() {
 	  }
 	  // label 155
 	  if (!goto160) {
-	    const double sq2i = 1.0 / sqrt(2.0);
-	    const complex<double> sq2iti = sq2i * uim;
 	    if (jss != 1) {
 	      // Would open the ITT file.
+	      string tlfft_name = output_path + "/c_TLFFT";
+	      tlfft.open(tlfft_name.c_str(), ios::out | ios::binary);
+	      if (tlfft.is_open()) {
+		tlfft.write(reinterpret_cast<char *>(&lmode), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&le), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&nkv), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&nxv), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&nyv), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&nzv), sizeof(int));
+		tlfft.write(reinterpret_cast<char *>(&vk), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&exri), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&an), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&ff), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&tra), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&spd), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&frsh), sizeof(double));
+		tlfft.write(reinterpret_cast<char *>(&exril), sizeof(double));
+		for (int i = 0; i < nxv; i++)
+		  tlfft.write(reinterpret_cast<char *>(&(xv[i])), sizeof(double));
+		for (int i = 0; i < nyv; i++)
+		  tlfft.write(reinterpret_cast<char *>(&(yv[i])), sizeof(double));
+		for (int i = 0; i < nzv; i++)
+		  tlfft.write(reinterpret_cast<char *>(&(zv[i])), sizeof(double));
+	      } else { // Should never happen.
+		printf("ERROR: could not open TLFFT file.\n");
+	      }
 	    }
 	  }
 	  // label 160
+	  const int nlmm = lm * (lm + 2);
+	  const int nlmmt = nlmm + nlmm;
+	  ws = new complex<double>[nlmmt]();
+	  if (lm > le) wsl = new complex<double>[nlmmt]();
+	  for (int iz475 = 0; iz475 < nzv; iz475++) {
+	    for (int iy475 = 0; iy475 < nyv; iy475++) {
+	      for (int ix475 = 0; ix475 < nxv; ix475++) {
+		for (int i = 0; i < nlmmt; i++) {
+		  double vreal, vimag;
+		  binary_input.read(reinterpret_cast<char *>(&vreal), sizeof(double));
+		  binary_input.read(reinterpret_cast<char *>(&vimag), sizeof(double));
+		  if (lm <= le) {
+		    ws[i] = complex<double>(vreal, vimag);
+		  } else { // label 170
+		    wsl[i] = complex<double>(vreal, vimag);
+		    for (int i175 = 0; i175 < cil->nlem; i175++) {
+		      int ie = i175 + cil->nlem;
+		      int iel = i175 + nlmm;
+		      ws[i175] = wsl[i175];
+		      ws[ie] = wsl[iel];
+		    } // i175 loop
+		  }
+		} // i loop
+		// label 180
+		bool goto475 = false;
+		if (is != 2222) {
+		  if (is != 1111) {
+		    if (is > 0) { // Goes to 305
+		      // Would call CAMP(AC,AM0M,WS)
+		    } else if (is < 0) { // Goes to 405
+		      // Would call CZAMP(AC,AMD,INDAM,WS)
+		    }
+		  } else {
+		    // Would call SAMP(AC,TMSM,TMSE,WS)
+		  }
+		} else {
+		  sampoa(ac, tms, ws, cil);
+		}
+		// label 445
+		if (jft <= 0) {
+		  double *fffe = new double[3]();
+		  double *fffs = new double[3]();
+		  // Would call FFRF(ZPV,AC,WS,FFFE,FFFS)
+		  if (jss == 1) {
+		    // Writes to 66
+		  } else { // label 450
+		    for (int i = 0; i < 3; i++) {
+		      double value = fffe[i] - fffs[i];
+		      tlfff.write(reinterpret_cast<char *>(&value), sizeof(double));
+		    }
+		    if (jtw == 1) {
+		      // Writes to 66
+		    }
+		  }
+		  if (jft < 0) goto475 = true;
+		  delete[] fffe;
+		  delete[] fffs;
+		}
+		// label 460
+		if (!goto475) {
+		  double *ffte = new double[3]();
+		  double *ffts = new double[3]();
+		  // Would call FFRT(AC,WS,FFTE,FFTS)
+		  if (jss == 1) {
+		    // Writes to 67
+		  } else { // label 470
+		    for (int i = 0; i < 3; i++) {
+		      double value = ffte[i] - ffts[i];
+		      tlfft.write(reinterpret_cast<char *>(&value), sizeof(double));
+		    }
+		    if (jtw == 1) {
+		      // Writes to 67
+		    }
+		  }
+		  delete[] ffte;
+		  delete[] ffts;
+		}
+	      } // ix475 loop
+	    } // iy475 loop
+	  } // iz475 loop
+	  if (jss != 1) {
+	    if (jft <= 0) tlfff.close();
+	    if (jft >= 0) tlfft.close();
+	  }
 	}
       }
       binary_input.close();
@@ -229,10 +337,6 @@ int main() {
   // Clean up memory
   if (ac != NULL) delete[] ac;
   if (ws != NULL) delete[] ws;
-  if (fffe != NULL) delete[] fffe;
-  if (ffte != NULL) delete[] ffte;
-  if (fffs != NULL) delete[] fffs;
-  if (ffts != NULL) delete[] ffts;
   if (xv != NULL) delete[] xv;
   if (yv != NULL) delete[] yv;
   if (zv != NULL) delete[] zv;
@@ -244,7 +348,7 @@ int main() {
     delete[] tms;
   }
   if (am0m != NULL) {
-    for (int ai = p_cil->nlemt - 1; ai > -1; ai--) delete[] am0m[ai];
+    for (int ai = cil->nlemt - 1; ai > -1; ai--) delete[] am0m[ai];
     delete[] am0m;
   }
   if (amd != NULL) {
@@ -265,8 +369,8 @@ int main() {
     } // zi loop
     delete[] zpv;
   }
-  delete p_cil;
-  delete p_ccr;
+  delete cil;
+  delete ccr;
   delete[] file_lines;
   printf("Done.\n");
   return 0;