diff --git a/inversion.cpp b/inversion.cpp
index 7b8fa15667d4fc0c355f5bb03926fc22229ab5ce..facc1258355420b6e434c3dd031c57c0e28e71a1 100644
--- a/inversion.cpp
+++ b/inversion.cpp
@@ -17,32 +17,14 @@ using namespace gmshfem::post;
 #include "common/model/macro.h"
 #include "specific/optimization/globalminimumsearch/newGlobalMinimumSearch.h"
 
-template <Physic T_Physic>
-int inversion(const GmshFem& gmshFem)
-{
-    std::string name = "";
-    gmshFem.userDefinedParameter(name, "prename");
-    std::string suffix = "noname";
-    gmshFem.userDefinedParameter(suffix, "name");
-    name += suffix;
-
-    const std::unique_ptr<const ParametrizationInterface> parametrization(newParametrization<T_Physic>(gmshFem));
-
-    auto configuration = newConfiguration(name, parametrization.get(), gmshFem);
-
-    for (unsigned int c = 0; c < parametrization->size(); c++)
-    {
-        save(configuration->m0()[c], configuration->model_unknown(Support::BLK), name+"_m_blkc"+std::to_string(c), "pos", "");
-        save(configuration->m0()[c], configuration->model_unknown(Support::BND), name+"_m_bndc"+std::to_string(c), "pos", "");
-    }
-
-    unsigned int n_freq_tot = 0;
-    if(!gmshFem.userDefinedParameter(n_freq_tot, "n_freq"))
+static void configureFrequencies(const GmshFem& gmshFem, unsigned int &n_freq_tot, std::vector<double>& frequency, std::vector<std::string>& filename) {
+    if (!gmshFem.userDefinedParameter(n_freq_tot, "n_freq"))
     {
         throw Exception("Total frequency number could not be found.");
     }
-    std::vector<double> frequency(n_freq_tot);
-    std::vector<std::string> filename(n_freq_tot);
+    frequency.resize(n_freq_tot);
+    filename.resize(n_freq_tot);
+
     for (unsigned int f = 0; f < n_freq_tot; f++)
     {
         std::string suffix = std::to_string(f);
@@ -61,13 +43,45 @@ int inversion(const GmshFem& gmshFem)
             msg::warning << "filename #"+suffix+" = "<< filename[f] << msg::endl;
         }
     }
-    const Data<T_Physic> d0(filename,frequency,configuration.get());
+}
 
+static unsigned int getNumberOfGroups(const GmshFem &gmshFem)
+{
     unsigned int n_group = 0;
-    if(!gmshFem.userDefinedParameter(n_group, "n_group"))
+    if (!gmshFem.userDefinedParameter(n_group, "n_group"))
     {
         throw Exception("Number of frequency group could not be found.");
     }
+    return n_group;
+}
+
+template <Physic T_Physic>
+int inversion(const GmshFem& gmshFem)
+{
+    std::string name = "";
+    gmshFem.userDefinedParameter(name, "prename");
+    std::string suffix = "noname";
+    gmshFem.userDefinedParameter(suffix, "name");
+    name += suffix;
+
+    const std::unique_ptr<const ParametrizationInterface> parametrization(newParametrization<T_Physic>(gmshFem));
+
+    auto configuration = newConfiguration(name, parametrization.get(), gmshFem);
+
+    for (unsigned int c = 0; c < parametrization->size(); c++)
+    {
+        save(configuration->m0()[c], configuration->model_unknown(Support::BLK), name+"_m_blkc"+std::to_string(c), "pos", "");
+        save(configuration->m0()[c], configuration->model_unknown(Support::BND), name+"_m_bndc"+std::to_string(c), "pos", "");
+    }
+
+    unsigned int n_freq_tot;
+    std::vector<double> frequency;
+    std::vector<std::string> filename;
+
+    configureFrequencies(gmshFem, n_freq_tot, frequency, filename);
+    const Data<T_Physic> d0(filename,frequency,configuration.get());
+
+    unsigned int n_group = getNumberOfGroups(gmshFem);
 
 
     msg::print << "Inverse data" << msg::endl;
@@ -155,7 +169,7 @@ int inversion(const GmshFem& gmshFem)
             pequation[f] = new ParametrizedEquation<T_Physic>(parametrization.get(),f,2.*M_PI*frequency[freq_idx[f]],configuration.get(),w_discret,gmshFem,suffix_f);
         }
 
-        GlobalMinimumSearchInterface<T_Physic>* const globalminimumsearch = newGlobalMinimumSearch<T_Physic>(name,configuration.get(), gmshFem, suffix_g);
+        std::unique_ptr<GlobalMinimumSearchInterface<T_Physic>> globalminimumsearch{newGlobalMinimumSearch<T_Physic>(name,configuration.get(), gmshFem, suffix_g)};
         (*globalminimumsearch)(&m,d0g,pequation);
         m.write(name+"_mg"+suffix_g, "pos", "");