43 int NBC = f1.boundaryField().size();
46 for (label k = 0; k < f1v.size(); k++)
50 for (label l = 0; l < NBC; l++)
52 for (label k = 0; k < f1BC[l].size(); k++)
59 for (
int k = 0; k < f1BC.size(); k++)
64template void multField(volScalarField& f1,
double alpha);
65template void multField(volVectorField& f1,
double alpha);
66template void multField(volTensorField& f1,
double alpha);
69void multField(T &f1,
const Eigen::VectorXd alphaVec)
73 for (label k = 0; k < f1v.size(); k++)
75 f1v(k) *= (alphaVec[k]);
78 for (
int k = 0; k < f1BC.size(); k++)
83template void multField(volScalarField& f1,
const Eigen::VectorXd alphaVec);
84template void multField(volVectorField& f1,
const Eigen::VectorXd alphaVec);
85template void multField(volTensorField& f1,
const Eigen::VectorXd alphaVec);
88void multField(PtrList<T> &f1,
const Eigen::VectorXd alphaVec)
90 for(label ith_field = 0 ; ith_field < f1.size() ; ith_field++){
93 for (label k = 0; k < f1v.size(); k++)
95 f1v(k) *= (alphaVec[k]);
98 for (
int k = 0; k < f1BC.size(); k++)
100 assignBC(f1[ith_field], k, f1BC[k]);
104template void multField(PtrList<volScalarField>& f1,
const Eigen::VectorXd alphaVec);
105template void multField(PtrList<volVectorField>& f1,
const Eigen::VectorXd alphaVec);
106template void multField(PtrList<volTensorField>& f1,
const Eigen::VectorXd alphaVec);
113 int NBC = f1.boundaryField().size();
119 for (label k = 0; k < f1v.size(); k++)
121 f1v(k) += alpha * f2v(k);
123 for (label l = 0; l < NBC; l++)
125 for (label k = 0; k < f1BC[l].size(); k++)
127 f1BC[l](k) += alpha * f2BC[l](k);
132 for (
int k = 0; k < f1BC.size(); k++)
137template void addFields(volScalarField& f1,
const volScalarField& f2c,
double alpha);
138template void addFields(volVectorField& f1,
const volVectorField& f2c,
double alpha);
139template void addFields(volTensorField& f1,
const volTensorField& f2c,
double alpha);
147template void subtractFields(volScalarField& f1,
const volScalarField& f2);
148template void subtractFields(volVectorField& f1,
const volVectorField& f2);
149template void subtractFields(volTensorField& f1,
const volTensorField& f2);
182template<
class TypeField>
184 fields, Eigen::MatrixXd ind, PtrList<TypeField>& ave)
186 PtrList<TypeField> aveSubtracted;
187 Eigen::VectorXd newInd;
188 newInd.resize(ind.size() + 1);
189 newInd.head(ind.size()) = ind;
190 newInd(ind.size()) = fields.size();
192 for (label i = 0; i < ind.size(); i++)
194 TypeField aveTemp(
"nut", fields[0] * 0);
196 for (label j = newInd(i); j < newInd(i + 1); j++)
198 aveTemp += fields[j];
201 aveTemp /= newInd(i + 1) - newInd(i);
202 ave.append(aveTemp.clone());
205 for (label i = 0; i < ind.size(); i++)
207 for (label j = newInd(i); j < newInd(i + 1); j++)
209 TypeField newfield(
"nut", fields[0] * 0);
210 newfield = fields[j] - ave[i];
211 aveSubtracted.append(newfield.clone());
215 return aveSubtracted;
219 PtrList<volScalarField>
220 fields, Eigen::MatrixXd ind, PtrList<volScalarField>& ave);
222 PtrList<volVectorField>
223 fields, Eigen::MatrixXd ind, PtrList<volVectorField>& ave);
226template<
class TypeField>
229 TypeField av(fields[0]);
231 for (label i = 1; i < fields.size(); i++)
236 av = av / fields.size();
241 PtrList<volVectorField>& fields);
243 PtrList<volScalarField>& fields);
246template<
typename Type>
248 PtrList<GeometricField<Type, fvPatchField, volMesh >>& fields)
251 word normType = para->ITHACAdict->lookupOrDefault<word>(
"normalizationNorm",
253 M_Assert(normType ==
"L2" ||
254 normType ==
"Frobenius",
"The normalizationNorm can be only L2 or Frobenius" );
258 for (label i = 0; i < fields.size(); i++)
262 if (normType ==
"L2")
266 else if (normType ==
"Frobenius")
271 GeometricField<Type, fvPatchField, volMesh> tmp2(fields[0].name(),
273 Eigen::VectorXd vec = eigenFields.col(i) / norm;
277 for (label k = 0; k < tmp2.boundaryField().size(); k++)
279 Eigen::MatrixXd vec = eigenFieldsBC[k].col(i) / norm;
283 fields.set(i, tmp2.clone());
288 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields);
290 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields);
293template<
typename Type>
294Eigen::MatrixXd getValues(GeometricField<Type, fvPatchField,
295 volMesh>& field, labelList& indices)
297 List<Type> list(indices.size());
298 M_Assert(max(indices) < field.size(),
299 "The list indices are too large respect to field dimension");
301 for (label i = 0; i < indices.size(); i++)
303 list[i] = field[indices[i]];
310Eigen::MatrixXd getValues(GeometricField<vector, fvPatchField,
311 volMesh>& field, labelList& indices, labelList* xyz)
313 M_Assert(
max(indices) < field.size(),
314 "The list of indices is too large respect to field dimension. There is at least one value larger than the dimension of the list");
319 list.resize(indices.size());
320 M_Assert(
max(* xyz) <= 2,
321 "The list of xyz positions contains at list one value larger than 2");
324 for (label i = 0; i < indices.size(); i++)
326 list[i] = field[indices[i]][l[i]];
334 list.resize(indices.size());
336 for (label i = 0; i < indices.size(); i++)
338 list[i] = field[indices[i]];
346Eigen::MatrixXd getValues(GeometricField<scalar, fvPatchField,
347 volMesh>& field, labelList& indices, labelList* xyz)
349 M_Assert(
max(indices) < field.size(),
350 "The list of indices is too large respect to field dimension. There is at least one value larger than the dimension of the list");
352 list.resize(indices.size());
354 for (label i = 0; i < indices.size(); i++)
356 list[i] = field[indices[i]];
363Eigen::MatrixXd getValues(PtrList<GeometricField<T, fvPatchField,
364 volMesh >>& fields, labelList& indices, labelList* xyz)
367 Eigen::MatrixXd a = getValues(fields[0], indices, xyz);
368 out.resize(a.rows(), fields.size());
370 for (label i = 1; i < fields.size(); i++)
372 out.col(i) = getValues(fields[i], indices, xyz);
380Eigen::MatrixXd getValues(PtrList<GeometricField<scalar, fvPatchField,
381 volMesh >>& fields, labelList& indices, labelList* xyz);
383Eigen::MatrixXd getValues(PtrList<GeometricField<vector, fvPatchField,
384 volMesh >>& fields, labelList& indices, labelList* xyz);
Header file of the ITHACAfieldsOperations file.
static GeometricField< scalar, PatchField, GeoMesh > Eigen2field(GeometricField< scalar, PatchField, GeoMesh > &field, Eigen::VectorXd &eigen_vector, bool correctBC=true)
Convert a vector in Eigen format into an OpenFOAM scalar GeometricField.
static List< Eigen::VectorXd > field2EigenBC(GeometricField< scalar, PatchField, GeoMesh > &field)
Convert an OpenFOAM scalar field to a List of Eigen Vectors, one for each boundary.
static Eigen::MatrixXd field2Eigen(GeometricField< Type, PatchField, GeoMesh > &field)
Convert a vector OpenFOAM field into an Eigen Vector.
static List< Eigen::MatrixXd > PtrList2EigenBC(PtrList< GeometricField< scalar, PatchField, GeoMesh > > &fields, label Nfields=-1)
Convert an OpenFOAM scalar field to a List of Eigen Vectors, one for each boundary.
static Eigen::MatrixXd PtrList2Eigen(PtrList< GeometricField< Type, PatchField, GeoMesh > > &fields, label Nfields=-1)
Convert a PtrList of snapshots to Eigen matrix (only internal field).
Class for the definition of some general parameters, the parameters must be defined from the file ITH...
static ITHACAparameters * getInstance(const fvMesh &mesh, Time &localTime)
Gets an instance of ITHACAparameters, to be used if the instance is not existing.
T max(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the maximum of a sparse Matrix (Useful for DEIM).
Namespace to implement some useful assign operation of OF fields.
int dimensionField(const volTensorField &v)
Return the dimension of a volTensorField.
volTensorField tensorFieldProduct(const volScalarField &coef, const volTensorField &S)
Tensor field product between a volScalarField and a volTensorField.
void multField(T &f1, double alpha)
Multiplication between a field of type vol[Scalar|Vector|Tensor]Field and a double.
TypeField computeAverage(PtrList< TypeField > &fields)
Calculates the average of a list of fields.
void normalizeFields(PtrList< GeometricField< Type, fvPatchField, volMesh > > &fields)
Normalize list of Geometric fields.
double frobNorm(GeometricField< Type, PatchField, GeoMesh > &field)
Evaluate the Frobenius norm of a field.
double L2Norm(const T v)
Compute the L2 norm of v.
void addFields(T &f1, const T &f2c, double alpha)
Perform the following operation f1 + f2 * alpha with f1 and f2 being of type vol[Scalar|Vector|Tensor...
PtrList< TypeField > averageSubtract(PtrList< TypeField > fields, Eigen::MatrixXd ind, PtrList< TypeField > &ave)
A function to compute time-averaged fields for a set of different parameter samples and also the fiel...
void assignBC(GeometricField< scalar, fvPatchField, volMesh > &s, label BC_ind, double value)
Assign uniform Boundary Condition to a volScalarField.
void subtractFields(T &f1, const T &f2)
Perform the substraction (f1 - f2) between two fields of type vol[Scalar|Vector|Tensor]Field and alph...