32#include "simpleControl.H"
33#include "simpleControl.H"
34#include "fvMeshSubset.H"
39#include "hyperReduction.templates.H"
47 static volScalarField evaluate_expression(volScalarField& S, Eigen::MatrixXd mu)
49 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
50 volScalarField xPos = S.mesh().C().component(vector::X).ref();
52 for (
auto i = 0; i < S.size(); i++)
54 S[i] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1,
55 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
61 static Eigen::VectorXd evaluate_expression(volScalarField& S,
62 Eigen::MatrixXd mu, List<label> nodesList)
64 Eigen::VectorXd ret(nodesList.size());
65 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
66 volScalarField xPos = S.mesh().C().component(vector::X).ref();
68 for (
auto i = 0; i < nodesList.size(); i++)
70 ret[i] = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1,
71 2) - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
77 Eigen::VectorXd onlineCoeffs(volScalarField& S, Eigen::MatrixXd mu)
90 static volVectorField evaluate_expression(volVectorField& S, Eigen::MatrixXd mu)
92 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
93 volScalarField xPos = S.mesh().C().component(vector::X).ref();
95 for (
auto i = 0; i < S.size(); i++)
97 S[i][0] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1,
98 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
99 S[i][1] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 0.5,
100 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
101 S[i][2] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1.5,
102 2) - 2 * std::pow(yPos[i] - mu(1) - 0., 2));
108 static Eigen::VectorXd evaluate_expression(volVectorField& S,
109 Eigen::MatrixXd mu, List<label> nodesList)
111 Eigen::VectorXd ret(nodesList.size() * 3);
112 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
113 volScalarField xPos = S.mesh().C().component(vector::X).ref();
115 for (
auto i = 0; i < nodesList.size(); i++)
117 ret(3 * i) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1, 2)
118 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
119 ret(3 * i + 1) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 0.5, 2)
120 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
121 ret(3 * i + 2) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1.5, 2)
122 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0., 2));
128 Eigen::VectorXd onlineCoeffs(volVectorField& S, Eigen::MatrixXd mu)
137 HyperReduction<PtrList<volVectorField> &, PtrList<volScalarField> & >
141 static std::pair<volVectorField, volScalarField> evaluate_expression(
142 volVectorField& V, volScalarField& S, Eigen::MatrixXd mu)
144 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
145 volScalarField xPos = S.mesh().C().component(vector::X).ref();
147 for (
auto i = 0; i < S.size(); i++)
149 V[i][0] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1,
150 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
151 V[i][1] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 0.5,
152 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
153 V[i][2] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1.5,
154 2) - 2 * std::pow(yPos[i] - mu(1) - 0., 2));
155 S[i] = std::exp(- 2 * std::pow(xPos[i] - mu(0) - 1,
156 2) - 2 * std::pow(yPos[i] - mu(1) - 0.5, 2));
159 return std::make_pair(V, S);
162 static Eigen::VectorXd evaluate_expression(volScalarField& S,
163 Eigen::MatrixXd mu, List<label> nodesList)
165 Eigen::VectorXd ret(nodesList.size() * 4);
166 volScalarField yPos = S.mesh().C().component(vector::Y).ref();
167 volScalarField xPos = S.mesh().C().component(vector::X).ref();
169 for (
auto i = 0; i < nodesList.size(); i++)
171 ret(4 * i) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1, 2)
172 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
173 ret(4 * i + 1) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 0.5, 2)
174 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
175 ret(4 * i + 2) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1.5, 2)
176 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0., 2));
177 ret(4 * i + 3) = std::exp(- 2 * std::pow(xPos[nodesList[i]] - mu(0) - 1, 2)
178 - 2 * std::pow(yPos[nodesList[i]] - mu(1) - 0.5, 2));
184 Eigen::VectorXd onlineCoeffs(volScalarField& S, Eigen::MatrixXd mu)
195 int n_modes = para->ITHACAdict->lookupOrDefault<
int>(
"Modes", 15);
196 int n_nodes = para->ITHACAdict->lookupOrDefault<
int>(
"Nodes", 15);
197 simpleControl simple(mesh);
198 word methodName = para->ITHACAdict->lookupOrDefault<word>(
"HyperReduction",
200#include "createFields.H"
202 PtrList<volScalarField> Sp;
215 dimensionedScalar(
"zero", dimensionSet(0, 0, -1, 1, 0, 0, 0), 0)
222 for (
int i = 0; i < 100; i++)
224 HyperReduction_function::evaluate_expression(S, pars.row(i));
225 Sp.append((S).clone());
233 Eigen::VectorXi initSeeds;
236 if (methodName ==
"GappyDEIM")
239 Eigen::MatrixXd snapshotsModes;
240 Eigen::VectorXd normalizingWeights;
241 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights);
242 c.offlineGappyDEIM(snapshotsModes, normalizingWeights);
244 unsigned int layers{2};
245 c.generateSubmesh(layers, mesh);
246 auto sfield = c.interpolateField<volScalarField>(Sp[0]);
247 PtrList<volScalarField> testTrueFields;
248 PtrList<volScalarField> testRecFields;
250 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
253 Eigen::VectorXd aprfield = c.renormalizedBasisMatrix * c.onlineCoeffs(sfield(),
254 parTest.row(idTest));
258 HyperReduction_function::evaluate_expression(S, parTest.row(idTest));
259 testRecFields.append(S2.clone());
260 testTrueFields.append(S.clone());
267 Info <<
"GappyDEIM max relative error: " << err.maxCoeff() << endl;
268 Info <<
"GappyDEIM mean relative error: " << err.array().mean() << endl;
270 else if (methodName ==
"ECP")
273 bool saveOFModes{
true};
274 Eigen::MatrixXd snapshotsModes;
275 Eigen::VectorXd normalizingWeights;
276 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights,
278 c.offlineECP(snapshotsModes, normalizingWeights);
280 unsigned int layers{2};
281 c.generateSubmesh(layers, mesh);
282 auto sfield = c.interpolateField<volScalarField>(Sp[0]);
283 Eigen::VectorXd results(parTest.rows());
285 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
288 Eigen::VectorXd f = c.evaluate_expression(sfield(), parTest.row(idTest),
291 parTest.row(idTest)));
292 double trueIntegral = (normalizingWeights.cwiseInverse().asDiagonal() *
294 double testIntegral = (c.wPU * f).array().sum();
297 results(idTest) = trueIntegral - testIntegral;
300 Info <<
"ECP max error: " << results.cwiseAbs().maxCoeff() << endl;
301 Info <<
"ECP mean error: " << results.cwiseAbs().mean() << endl;
308 int n_modes = para->ITHACAdict->lookupOrDefault<
int>(
"Modes", 15);
309 int n_nodes = para->ITHACAdict->lookupOrDefault<
int>(
"Nodes", 15);
310 simpleControl simple(mesh);
311 word methodName = para->ITHACAdict->lookupOrDefault<word>(
"HyperReduction",
313#include "createFields.H"
315 PtrList<volVectorField> Sp;
328 dimensionedVector(
"zero", dimensionSet(0, 0, -1, 1, 0, 0, 0), vector(0, 0, 0))
335 for (
int i = 0; i < 100; i++)
337 HyperReduction_vectorFunction::evaluate_expression(S, pars.row(i));
338 Sp.append((S).clone());
346 Eigen::VectorXi initSeeds;
349 if (methodName ==
"GappyDEIM")
352 "Gaussian_function", Sp);
353 Eigen::MatrixXd snapshotsModes;
354 Eigen::VectorXd normalizingWeights;
355 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights);
356 c.offlineGappyDEIM(snapshotsModes, normalizingWeights);
358 unsigned int layers{2};
359 c.generateSubmesh(layers, mesh);
360 auto sfield = c.interpolateField<volVectorField>(Sp[0]);
361 PtrList<volVectorField> testTrueFields;
362 PtrList<volVectorField> testRecFields;
364 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
367 Eigen::VectorXd aprfield = c.renormalizedBasisMatrix * c.onlineCoeffs(sfield(),
368 parTest.row(idTest));
372 HyperReduction_vectorFunction::evaluate_expression(S, parTest.row(idTest));
373 testRecFields.append(S2.clone());
374 testTrueFields.append(S.clone());
381 Info <<
"GappyDEIM max relative error: " << err.maxCoeff() << endl;
382 Info <<
"GappyDEIM mean relative error: " << err.array().mean() << endl;
384 else if (methodName ==
"ECP")
387 "Gaussian_function", Sp);
388 bool saveOFModes{
true};
389 Eigen::MatrixXd snapshotsModes;
390 Eigen::VectorXd normalizingWeights;
391 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights,
393 c.offlineECP(snapshotsModes, normalizingWeights);
395 unsigned int layers{2};
396 c.generateSubmesh(layers, mesh);
397 auto sfield = c.interpolateField<volVectorField>(Sp[0]);
398 Eigen::VectorXd results(parTest.rows());
400 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
403 Eigen::VectorXd f = c.evaluate_expression(sfield(), parTest.row(idTest),
405 auto wholeField = c.evaluate_expression(Sp[0], parTest.row(idTest));
407 double trueIntegral = (normalizingWeights.cwiseInverse().asDiagonal() *
409 double testIntegral = (c.wPU * f).array().sum();
412 results(idTest) = trueIntegral - testIntegral;
415 Info <<
"ECP max error: " << results.cwiseAbs().maxCoeff() << endl;
416 Info <<
"ECP mean error: " << results.cwiseAbs().mean() << endl;
423 int n_modes = para->ITHACAdict->lookupOrDefault<
int>(
"Modes", 15);
424 int n_nodes = para->ITHACAdict->lookupOrDefault<
int>(
"Nodes", 15);
425 simpleControl simple(mesh);
426 word methodName = para->ITHACAdict->lookupOrDefault<word>(
"HyperReduction",
428#include "createFields.H"
430 PtrList<volVectorField> Vp;
431 PtrList<volScalarField> Sp;
444 dimensionedVector(
"zero", dimensionSet(0, 0, -1, 1, 0, 0, 0), vector(0, 0, 0))
458 dimensionedScalar(
"zero", dimensionSet(0, 0, -1, 1, 0, 0, 0), 0)
465 for (
int i = 0; i < 100; i++)
467 HyperReduction_vectorScalarFunction::evaluate_expression(V, S, pars.row(i));
468 Vp.append((V).clone());
469 Sp.append((S).clone());
478 Eigen::VectorXi initSeeds;
481 if (methodName ==
"GappyDEIM")
484 "Gaussian_function", Vp, Sp);
485 Eigen::MatrixXd snapshotsModes;
486 Eigen::VectorXd normalizingWeights;
487 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights);
488 c.offlineGappyDEIM(snapshotsModes, normalizingWeights);
490 unsigned int layers{2};
491 c.generateSubmesh(layers, mesh);
492 auto vfield = c.interpolateField<volVectorField>(Vp[0]);
493 auto sfield = c.interpolateField<volScalarField>(Sp[0]);
494 PtrList<volVectorField> testTrueFieldsV;
495 PtrList<volVectorField> testRecFieldsV;
496 PtrList<volScalarField> testTrueFieldsS;
497 PtrList<volScalarField> testRecFieldsS;
499 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
502 auto theta = c.onlineCoeffs(sfield(), parTest.row(idTest));
503 Eigen::VectorXd aprfield = c.renormalizedBasisMatrix * theta;
504 Eigen::VectorXd recvec = aprfield.head(3 * S.size());
505 Eigen::VectorXd recsca = aprfield.tail(S.size());
510 HyperReduction_vectorScalarFunction::evaluate_expression(V, S,
511 parTest.row(idTest));
512 testRecFieldsV.append(V2.clone());
513 testTrueFieldsV.append(V.clone());
516 testRecFieldsS.append(S2.clone());
517 testTrueFieldsS.append(S.clone());
524 Info <<
"GappyDEIM vector field max relative error: " << errV.maxCoeff() <<
526 Info <<
"GappyDEIM vector field mean relative error: " << errV.array().mean() <<
529 Info <<
"GappyDEIM scalar max relative error: " << errS.maxCoeff() << endl;
530 Info <<
"GappyDEIM scalar mean relative error: " << errS.array().mean() << endl;
532 else if (methodName ==
"ECP")
535 "Gaussian_function", Vp, Sp);
536 bool saveOFModes{
true};
537 Eigen::MatrixXd snapshotsModes;
538 Eigen::VectorXd normalizingWeights;
539 c.getModesSVD(c.snapshotsListTuple, snapshotsModes, normalizingWeights,
541 c.offlineECP(snapshotsModes, normalizingWeights);
543 unsigned int layers{2};
544 c.generateSubmesh(layers, mesh);
545 auto vfield = c.interpolateField<volVectorField>(Vp[0]);
546 auto sfield = c.interpolateField<volScalarField>(Sp[0]);
547 Eigen::VectorXd results(parTest.rows());
549 for (
unsigned int idTest = 0; idTest < parTest.rows(); idTest++)
552 Eigen::VectorXd f = c.evaluate_expression(sfield(), parTest.row(idTest),
554 HyperReduction_vectorScalarFunction::evaluate_expression(V, S,
555 parTest.row(idTest));
558 Eigen::VectorXd ff(ffV.rows() + ffS.rows());
559 ff.head(ffV.rows()) = ffV;
560 ff.tail(ffS.rows()) = ffS;
561 double trueIntegral = (normalizingWeights.cwiseInverse().asDiagonal() *
563 double testIntegral = (c.wPU * f).array().sum();
566 results(idTest) = trueIntegral - testIntegral;
569 Info <<
"ECP max error: " << results.cwiseAbs().maxCoeff() << endl;
570 Info <<
"ECP mean error: " << results.cwiseAbs().mean() << endl;
574int main(
int argc,
char* argv[])
577 argList::addOption(
"test",
"scalar",
"Perform scalar test");
578 argList::addOption(
"test",
"vector",
"Perform vector test");
579 argList::addOption(
"test",
"vs",
"Perform (vector, scalar) test");
581 HashTable<string> validParOptions;
598#include "setRootCase.H"
599 Foam::Time runTime(Foam::Time::controlDictName, args);
604 Foam::fvMesh::defaultRegion,
607 Foam::IOobject::MUST_READ
612 if (args.get(
"test").match(
"scalar"))
614 Info <<
"Init scalar testcase\n";
615 test_scalar(para, mesh, runTime);
617 else if (args.get(
"test").match(
"vector"))
619 Info <<
"Init vector testcase\n";
620 test_vector(para, mesh, runTime);
622 else if (args.get(
"test").match(
"vs"))
624 Info <<
"Init vector scalar testcase\n";
625 test_vector_scalar(para, mesh, runTime);
629 Info <<
"Pass '-test scalar', '-test vector', '-test vs'" << endl;
Header file of the Foam2Eigen class.
Header file of the ITHACAPOD class.
Header file of the ITHACAstream class, it contains the implementation of several methods for input ou...
Header file of the ITHACAutilities namespace.
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 Eigen::MatrixXd field2Eigen(GeometricField< Type, PatchField, GeoMesh > &field)
Convert a vector OpenFOAM field into an Eigen Vector.
HyperReduction(label n_modes, label n_nodes, Eigen::VectorXi initialSeeds, word problemName, SnapshotsLists &&...snapshotsLists)
Construct HyperReduction class, interpolation-based.
HyperReduction(label n_modes, label n_nodes, Eigen::VectorXi initialSeeds, word problemName, SnapshotsLists &&...snapshotsLists)
Construct HyperReduction class, interpolation-based.
HyperReduction(label n_modes, label n_nodes, Eigen::VectorXi initialSeeds, word problemName, SnapshotsLists &&...snapshotsLists)
Construct HyperReduction class, interpolation-based.
List< label > localNodePoints
HyperReduction(label n_modes, label n_nodes, Eigen::VectorXi initialSeeds, word problemName, SnapshotsLists &&...snapshotsLists)
Construct HyperReduction class, interpolation-based.
Class for the definition of some general parameters, the parameters must be defined from the file ITH...
static ITHACAparameters * getInstance()
Gets an instance of ITHACAparameters, to be used if the instance is already existing.
void exportSolution(GeometricField< Type, PatchField, GeoMesh > &s, fileName subfolder, fileName folder, word fieldName)
Export a field to file in a certain folder and subfolder.
double errorL2Rel(GeometricField< T, fvPatchField, volMesh > &field1, GeometricField< T, fvPatchField, volMesh > &field2, List< label > *labels)
Computes the relative error between two geometric Fields in L2 norm.
Eigen::MatrixXd rand(label rows, label cols, double min, double max)
Generates random matrix with random values in an interval.