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", "");