46 const std::weak_ptr<SolverUtils::EquationSystem> &pEquation,
48 :
Filter(pSession, pEquation)
50 if (pParams.find(
"OutputFile") == pParams.end())
56 ASSERTL0(!(pParams.find(
"OutputFile")->second.empty()),
57 "Missing parameter 'OutputFile'.");
61 ASSERTL0(pParams.find(
"OutputFrequency") != pParams.end(),
62 "Missing parameter 'OutputFrequency'.");
65 pParams.find(
"OutputFrequency")->second);
68 ASSERTL0(pParams.find(
"WindowSize") != pParams.end(),
69 "Missing parameter 'WindowSize'.");
71 pParams.find(
"WindowSize")->second);
75 ASSERTL0(pParams.find(
"OverlapSize") != pParams.end(),
76 "Missing parameter 'OverlapSize'.");
78 pParams.find(
"OverlapSize")->second);
81 "'OverlapSize' must be smaller than 'WindowSize'.");
83 if (pParams.find(
"MeanV") != pParams.end())
87 pParams.find(
"MeanV")->second);
91 if (pParams.find(
"LinearTransitionOverlap") != pParams.end())
94 (pParams.find(
"LinearTransitionOverlap")->second ==
"true");
115 m_TimeStep = pFields[0]->GetSession()->GetParameter(
"TimeStep");
117 npoints = pFields[0]->GetPhys().size();
126 fftw_r2r_kind *fwd_kind =
new fftw_r2r_kind[
npoints];
127 std::fill_n(fwd_kind,
npoints, FFTW_R2HC);
132 fftw_r2r_kind *bwd_kind =
new fftw_r2r_kind[
npoints];
133 std::fill_n(bwd_kind,
npoints, FFTW_HC2R);
136 npoints, 1, &bwd_kind[0], FFTW_ESTIMATE);
164 for (
int j = 0; j <
npoints; ++j)
192 for (
int i = 1; i <
m_window / 2; ++i)
194 for (
int j = 0; j <
npoints; ++j)
212 std::stringstream vOutputFilename;
216 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef =
217 pFields[0]->GetFieldDefinitions();
218 std::vector<std::vector<NekDouble>> FieldData(FieldDef.size());
225 for (
int i = 0; i <
npoints; ++i)
236 for (
int i = 0; i <
npoints; ++i)
246 for (
int i = 0; i <
npoints; ++i)
248 phase[i] = atan2(
h[t *
npoints + i],
254 pFields[0]->FwdTransLocalElmt(phase, phase_coeff);
259 for (
int i = 0; i < FieldDef.size(); ++i)
261 FieldDef[i]->m_fields.push_back(
"phase");
262 pFields[0]->AppendFieldData(FieldDef[i], FieldData[i],
268 fieldMetaDataMap[
"Time"] = boost::lexical_cast<std::string>(
271 m_fld->Write(vOutputFilename.str(), FieldDef, FieldData,
279 for (
int i = 0; i <
npoints; ++i)
#define ASSERTL0(condition, msg)
Array< OneD, NekDouble > overlap_phase
FilterHilbertFFTPhase(const LibUtilities::SessionReaderSharedPtr &pSession, const std::weak_ptr< SolverUtils::EquationSystem > &pEquation, const ParamMap &pParams)
void v_Update(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
~FilterHilbertFFTPhase() override
void v_Finalise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
Array< OneD, NekDouble > oldV
Array< OneD, NekDouble > oldV_zero_mean
void v_Initialise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
Array< OneD, NekDouble > fcoef
bool v_IsTimeDependent() override
unsigned int m_outputIndex
LibUtilities::FieldIOSharedPtr m_fld
unsigned int m_outputFrequency
static SolverUtils::FilterSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const std::weak_ptr< SolverUtils::EquationSystem > &pEquation, const ParamMap &pParams)
Creates an instance of this class.
Array< OneD, NekDouble > h
static std::string className
Name of the class.
NekDouble Evaluate() const
static std::shared_ptr< FieldIO > CreateDefault(const LibUtilities::SessionReaderSharedPtr session)
Returns an object for the default FieldIO method.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
LibUtilities::SessionReaderSharedPtr m_session
std::map< std::string, std::string > ParamMap
std::map< std::string, std::string > FieldMetaDataMap
std::shared_ptr< SessionReader > SessionReaderSharedPtr
FilterFactory & GetFilterFactory()