diff --git a/src/trapping/cfrfme.cpp b/src/trapping/cfrfme.cpp
index 5d55db92cbb9378a861dd4f60fb4ce073c429e32..8432ca9cd8f0f7460f52b870d484a79acca6a7a2 100644
--- a/src/trapping/cfrfme.cpp
+++ b/src/trapping/cfrfme.cpp
@@ -60,6 +60,10 @@
 #include <nvtx3/nvToolsExt.h>
 #endif
 
+#ifdef USE_TARGET_OFFLOAD
+#pragma omp requires unified_shared_memory
+#endif
+
 using namespace std;
 
 /*! \brief C++ implementation of FRFME
@@ -377,11 +381,14 @@ void frfme(string data_file, string output_path) {
 #ifdef USE_NVTX
 	  nvtxRangePush("j80 loop");
 #endif
-#pragma omp parallel for
+#pragma omp target parallel for
 	  for (int j80 = jlmf; j80 <= jlml; j80++) {
-	    dcomplex *vec_w = new dcomplex[nkv * nkv]();
-	    dcomplex **w = new dcomplex*[nkv];
-	    dcomplex *wk_local = new dcomplex[nlmmt]();
+	    // dcomplex *vec_w = new dcomplex[nkv * nkv]();
+	    // dcomplex **w = new dcomplex*[nkv];
+	    // dcomplex *wk_local = new dcomplex[nlmmt]();
+	    dcomplex *vec_w = (dcomplex *) calloc(nkv * nkv, sizeof(dcomplex));
+	    dcomplex **w = (dcomplex **) calloc(nkv, sizeof(dcomplex *));
+	    dcomplex *wk_local = (dcomplex *) calloc(nlmmt, sizeof(dcomplex));
 	    for (int wi = 0; wi < nkv; wi++) w[wi] = vec_w + wi * nkv;
 	    int wk_index = 0;
 	    for (int jy50 = 0; jy50 < nkv; jy50++) {
@@ -421,9 +428,12 @@ void frfme(string data_file, string output_path) {
 		} // ix65 loop
 	      } // iy70 loop
 	    } // iz75 loop
-	    delete[] vec_w;
-	    delete[] w;
-	    delete[] wk_local;
+	    // delete[] vec_w;
+	    // delete[] w;
+	    // delete[] wk_local;
+	    free(vec_w);
+	    free(w);
+	    free(wk_local);
 	  } // j80 loop
 #ifdef USE_NVTX
 	  nvtxRangePop();