37 #include <boost/core/ignore_unused.hpp> 38 #include <boost/program_options.hpp> 39 #include <boost/algorithm/string/classification.hpp> 40 #include <boost/algorithm/string/split.hpp> 41 #include <boost/algorithm/string/predicate.hpp> 53 const std::weak_ptr<EquationSystem> &pEquation,
55 :
Filter(pSession, pEquation)
60 auto it = pParams.find(
"OutputFile");
61 if (it == pParams.end())
63 std::stringstream outname;
64 outname <<
m_session->GetSessionName() <<
".fld";
69 ASSERTL0(it->second.length() > 0,
"Missing parameter 'OutputFile'.");
70 if ( it->second.find_last_of(
'.') != std::string::npos)
76 std::stringstream outname;
77 outname << it->second <<
".fld";
83 it = pParams.find(
"RestartFile");
84 if (it == pParams.end())
90 ASSERTL0(it->second.length() > 0,
"Missing parameter 'RestartFile'.");
91 if ( it->second.find_last_of(
'.') != std::string::npos)
97 std::stringstream outname;
98 outname << it->second <<
".fld";
104 it = pParams.find(
"OutputFrequency");
105 if (it == pParams.end())
112 m_session->GetInterpreter(), it->second);
121 it = pParams.find(
"PhaseAverage");
122 if (it == pParams.end())
128 std::string sOption = it->second.c_str();
130 (boost::iequals(sOption,
"yes"));
135 auto itPeriod = pParams.find(
"PhaseAveragePeriod");
136 auto itPhase = pParams.find(
"PhaseAveragePhase");
139 ASSERTL0((itPeriod != pParams.end() && itPhase != pParams.end()),
140 "The phase sampling feature requires both 'PhaseAveragePeriod' and " 141 "'PhaseAveragePhase' to be set.");
144 m_session->GetInterpreter(), itPeriod->second);
148 m_session->GetInterpreter(), itPhase->second);
153 "PhaseAveragePeriod must be greater than 0.");
154 ASSERTL0(m_phaseSamplePhase >= 0 && m_phaseSamplePhase <= 1,
155 "PhaseAveragePhase must be between 0 and 1.");
158 it = pParams.find(
"SampleFrequency");
159 if (it == pParams.end())
161 m_sampleFrequency = 1;
166 m_session->GetInterpreter(), it->second);
167 m_sampleFrequency = round(equ.Evaluate());
172 (m_phaseSamplePeriod * 2);
176 if (
m_session->GetComm()->GetRank() == 0 &&
177 m_session->DefinesCmdLineArgument(
"verbose"))
179 std::cout <<
"Phase sampling activated with period " 180 << m_phaseSamplePeriod <<
" and phase " 181 << m_phaseSamplePhase <<
"." << std::endl
182 <<
"Sampling within a tolerance of " 183 << std::setprecision(6) << m_phaseTolerance <<
"." 195 m_f = std::shared_ptr<Field>(
new Field());
196 std::vector<std::string> modcmds;
198 std::stringstream moduleStream;
199 it = pParams.find(
"Modules");
200 if (it != pParams.end())
202 moduleStream.str(it->second);
204 while (!moduleStream.fail())
207 moduleStream >> sMod;
208 if (!moduleStream.fail())
210 modcmds.push_back(sMod);
218 std::vector<std::string> tmp;
240 nfield = (n < pFields.num_elements())? n: 0;
246 m_fieldMetaData[
"InitialTime"] = boost::lexical_cast<std::string>(time);
252 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fieldDef;
253 std::vector<std::vector<NekDouble> > fieldData;
257 fld->Import(
m_restartFile, fieldDef, fieldData, fieldMetaData);
265 for(k = 0; k < pFields.num_elements(); ++k)
267 if(pFields[k]->GetSession()->GetVariable(k)
279 for (
int i = 0; i < fieldData.size(); ++i)
281 pFields[nfield]->ExtractDataToCoeffs(
290 if (fieldMetaData.count(
"NumberOfFieldDumps"))
292 m_numSamples = atoi(fieldMetaData[
"NumberOfFieldDumps"].c_str());
299 if(fieldMetaData.count(
"InitialTime"))
321 int nfield = pFields.num_elements();
323 for (
int n = 0; n < nfield; ++n)
325 m_variables[n] = pFields[n]->GetSession()->GetVariable(n);
329 std::vector<Array<OneD, NekDouble> > coeffs(nfield);
330 for (
int n = 0; n < nfield; ++n)
332 coeffs[n] = pFields[n]->GetCoeffs();
335 auto equ =
m_equ.lock();
336 ASSERTL0(equ,
"Weak pointer expired");
351 int nfield = pFields.num_elements();
352 std::vector<Array<OneD, NekDouble> > coeffs(nfield);
353 for (
int n = 0; n < nfield; ++n)
355 coeffs[n] = pFields[n]->GetCoeffs();
358 auto equ =
m_equ.lock();
359 ASSERTL0(equ,
"Weak pointer expired");
360 equ->ExtraFldOutput(coeffs, variables);
382 if (
m_session->GetComm()->GetRank() == 0 &&
383 m_session->DefinesCmdLineArgument(
"verbose"))
385 std::cout <<
"Sample: " << std::setw(8) << std::left
387 << std::left << currentPhase << std::endl;
419 boost::ignore_unused(pFields, time);
448 std::stringstream outname;
455 outname << name << suffix << ext;
459 outname << name <<
"_" << dump << suffix << ext;
464 po::options_description desc(
"Available options");
467 "Force the output to be written without any checks");
468 po::variables_map vm;
469 vm.insert(std::make_pair(
"forceoutput", po::variable_value()));
475 for (
int i = 0; i <
m_modules.size(); ++i)
477 if(
m_modules[i]->GetModulePriority() == priority)
508 for (
int i = 0; i < modcmds.size(); ++i)
511 std::vector<std::string> tmp1;
515 boost::split(tmp1, modcmds[i], boost::is_any_of(
":"));
517 if (i == modcmds.size() - 1)
528 if (tmp1.size() == 1)
530 int dot = tmp1[0].find_last_of(
'.') + 1;
531 std::string ext = tmp1[0].substr(dot, tmp1[0].length() - dot);
534 tmp1.push_back(std::string(
"outfile=") + tmp1[0]);
538 module.second = tmp1[1];
539 tmp1.push_back(std::string(
"outfile=") + tmp1[0]);
546 module.second = tmp1[0];
555 for (
int j = offset; j < tmp1.size(); ++j)
557 std::vector<std::string> tmp2;
558 boost::split(tmp2, tmp1[j], boost::is_any_of(
"="));
560 if (tmp2.size() == 1)
562 mod->RegisterConfig(tmp2[0]);
564 else if (tmp2.size() == 2)
566 mod->RegisterConfig(tmp2[0], tmp2[1]);
570 std::cerr <<
"ERROR: Invalid module configuration: format is " 571 <<
"either :arg or :arg=val" << std::endl;
582 for (
int i = 0; i <
m_modules.size(); ++i)
584 ++modulesCount[
m_modules[i]->GetModulePriority()];
593 module.second = std::string(
"equispacedoutput");
608 m_f->m_graph = pFields[0]->GetGraph();
609 m_f->m_comm =
m_f->m_session->GetComm();
613 m_f->m_numHomogeneousDir = 0;
616 m_f->m_numHomogeneousDir = 1;
620 m_f->m_numHomogeneousDir = 2;
624 m_f->m_exp[0] = pFields[0];
629 nfield = (n < pFields.num_elements())? n: 0;
631 m_f->m_exp[n] =
m_f->AppendExpList(
633 m_f->m_exp[n]->SetWaveSpace(
false);
636 "pFields[nfield] does not have the " 637 "same number of coefficients as m_outFields[n]");
639 m_f->m_exp[n]->ExtractCoeffsToCoeffs(pFields[nfield],
m_outFields[n],
640 m_f->m_exp[n]->UpdateCoeffs());
642 m_f->m_exp[n]->BwdTrans(
m_f->m_exp[n]->GetCoeffs(),
643 m_f->m_exp[n]->UpdatePhys());
653 for (
int i = 0; i < modules.size(); ++i)
655 ++modulesCount[modules[i]->GetModulePriority()];
667 std::stringstream ss;
669 for (
int i = 0; i < modules.size(); ++i)
674 modules[i]->GetModulePriority() ==
eCreateExp ||
675 modules[i]->GetModulePriority() ==
eFillExp ||
676 modules[i]->GetModulePriority() ==
eCreatePts)
678 ss << modules[i]->GetModuleName()<<
" ";
681 ss <<
"not compatible with FilterFieldConvert.";
689 std::stringstream ss;
691 for (
int i = 0; i < modules.size(); ++i)
695 ss << modules[i]->GetModuleName()<<
" ";
698 ss <<
"is not compatible with module(s): ";
699 for (
int i = 0; i < modules.size(); ++i)
703 ss << modules[i]->GetModuleName()<<
" ";
void OutputField(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, int dump=-1)
LibUtilities::FieldMetaDataMap m_fieldMetaData
virtual SOLVER_UTILS_EXPORT ~FilterFieldConvert()
#define ASSERTL0(condition, msg)
static std::string className
Name of the class.
void CreateFields(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields)
std::vector< Array< OneD, NekDouble > > m_outFields
virtual SOLVER_UTILS_EXPORT void v_Initialise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
std::map< std::string, std::string > FieldMetaDataMap
static FilterSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const std::weak_ptr< EquationSystem > &pEquation, const std::map< std::string, std::string > &pParams)
Creates an instance of this class.
virtual SOLVER_UTILS_EXPORT void v_FillVariablesName(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields)
virtual SOLVER_UTILS_EXPORT std::string v_GetFileSuffix()
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::pair< ModuleType, std::string > ModuleKey
unsigned int m_sampleFrequency
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
void CreateModules(std::vector< std::string > &modcmds)
const std::weak_ptr< EquationSystem > m_equ
virtual SOLVER_UTILS_EXPORT NekDouble v_GetScale()
std::map< std::string, std::string > ParamMap
LibUtilities::SessionReaderSharedPtr m_session
std::shared_ptr< Module > ModuleSharedPtr
virtual SOLVER_UTILS_EXPORT void v_Update(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
static PtsFieldSharedPtr NullPtsField
void CheckModules(std::vector< ModuleSharedPtr > &modules)
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
std::string m_restartFile
std::vector< ModuleSharedPtr > m_modules
unsigned int m_outputFrequency
virtual SOLVER_UTILS_EXPORT void v_ProcessSample(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, std::vector< Array< OneD, NekDouble > > &fieldcoeffs, const NekDouble &time)
FilterFactory & GetFilterFactory()
unsigned int m_outputIndex
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
NekDouble m_phaseSamplePeriod
virtual SOLVER_UTILS_EXPORT void v_Finalise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
virtual SOLVER_UTILS_EXPORT bool v_IsTimeDependent()
virtual SOLVER_UTILS_EXPORT void v_PrepareOutput(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
std::shared_ptr< FieldIO > FieldIOSharedPtr
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
NekDouble m_phaseTolerance
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
NekDouble m_phaseSamplePhase
SOLVER_UTILS_EXPORT FilterFieldConvert(const LibUtilities::SessionReaderSharedPtr &pSession, const std::weak_ptr< EquationSystem > &pEquation, const ParamMap &pParams)
std::vector< std::string > m_variables
std::shared_ptr< SessionReader > SessionReaderSharedPtr
unsigned int m_numSamples
ModuleFactory & GetModuleFactory()