35 void Foam::DMDModels::STDMD::filterIndexed
38 const UList<label>& indices
42 List<Type> lstWithin(indices.size());
46 for (
const auto& i : indices)
48 lstWithin[j] = lst[i];
51 lst.transfer(lstWithin);
55 template<
class MatrixType>
56 void Foam::DMDModels::STDMD::filterIndexed
59 const UList<label>& indices
63 MatrixType matWithin(
labelPair(mat.m(), indices.size()));
67 for (
const auto& i : indices)
69 matWithin.subColumn(j) = mat.subColumn(i);
72 mat.transfer(matWithin);
77 bool Foam::DMDModels::STDMD::modes()
79 typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
80 typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
82 if (mesh_.foundObject<VolFieldType>(fieldName_))
84 return calcModes<VolFieldType>();
86 else if (mesh_.foundObject<SurfaceFieldType>(fieldName_))
88 return calcModes<SurfaceFieldType>();
95 template<
class GeoFieldType>
96 bool Foam::DMDModels::STDMD::calcModes()
98 typedef typename GeoFieldType::value_type Type;
101 if (magsi_.size() > nModes_)
103 magsi_.resize(nModes_);
107 const RMatrix primitiveMode(Qupper_*RxInv_);
112 for (
const label i : magsi_)
118 "modeRe_" + std::to_string(modei)
119 +
"_" + fieldName_ +
"_" + name_,
120 mesh_.time().timeName(),
128 fixedValueFvPatchField<Type>::typeName
135 "modeIm_" + std::to_string(modei)
136 +
"_" + fieldName_ +
"_" + name_,
137 mesh_.time().timeName(),
145 fixedValueFvPatchField<Type>::typeName
148 if (modeRe.size() != 0 && !empty_)
152 auto& inModeRe = modeRe.primitiveFieldRef();
153 auto& inModeIm = modeIm.primitiveFieldRef();
155 calcMode(inModeRe, inModeIm, primitiveMode, i);
159 const label patchi = mesh_.boundaryMesh().findPatchID(patch_);
161 auto& bfModeRe = modeRe.boundaryFieldRef()[patchi];
162 auto& bfModeIm = modeIm.boundaryFieldRef()[patchi];
164 calcMode(bfModeRe, bfModeIm, primitiveMode, i);
177 template<
class GeoFieldType>
178 typename std::enable_if
180 std::is_same<Foam::scalar, typename GeoFieldType::value_type>::value,
182 >
::type Foam::DMDModels::STDMD::calcMode
184 GeoFieldType& modeRe,
185 GeoFieldType& modeIm,
186 const RMatrix& primitiveMode,
190 const label fieldSize = modeRe.size();
192 for (label
p = 0;
p < primitiveMode.m(); ++
p)
195 for (label q = 0; q < evecs_.m(); ++q)
197 mode += primitiveMode(
p, q)*evecs_(q, i);
199 label p1 =
p%fieldSize;
200 modeRe[p1] =
mode.real();
201 modeIm[p1] =
mode.imag();
206 template<
class GeoFieldType>
207 typename std::enable_if
209 !std::is_same<Foam::scalar, typename GeoFieldType::value_type>::value,
211 >
::type Foam::DMDModels::STDMD::calcMode
213 GeoFieldType& modeRe,
214 GeoFieldType& modeIm,
215 const RMatrix& primitiveMode,
219 const label fieldSize = modeRe.size();
221 for (label
p = 0;
p < primitiveMode.m(); ++
p)
224 for (label q = 0; q < evecs_.m(); ++q)
226 mode += primitiveMode(
p, q)*evecs_(q, i);
228 label p1 =
p%fieldSize;
229 label p2 =
p/fieldSize;
230 modeRe[p1][p2] =
mode.real();
231 modeIm[p1][p2] =
mode.imag();