Loading...
Searching...
No Matches
HyperreductionConfiguration.H
1#pragma once
2#ifndef HyperreductionConfiguration_H
3#define HyperreductionConfiguration_H
4
5#include <Eigen/Eigen>
6#include <unsupported/Eigen/CXX11/Tensor>
7#include "List.H"
8#include "labelFwd.H"
9#include "volFieldsFwd.H"
10#include "fvMesh.H"
11#include "ITHACAutilities.H"
12#include "PODConfiguration.H"
13
14
15
22class HyperreductionConfiguration
23{
24public:
25 HyperreductionConfiguration():
26 m_nMagicPoints(0), m_Ck(0.0), m_Ce(0.0),
27 m_interpFieldCentered(false),
28 m_meanVectorDEIM(nullptr), m_meanScalarDEIM(nullptr),
29 m_meanVectorDEIMMagic(nullptr), m_meanScalarDEIMMagic(nullptr) { };
30
31 // Hyperreduction method: DEIM or ECP (itself Global or EachMode)
32 const Foam::word& HRMethod() const { return m_HRMethod; }
33 const Foam::word& ECPAlgo() const { return m_ECPAlgo; }
34
35 void setHRMethod(const Foam::word& method) { m_HRMethod = method; }
36 void setECPAlgo(const Foam::word& algo) { m_ECPAlgo = algo; }
37
38 // Hyperreduced field name
39 const Foam::word& HRSnapshotsField() const { return m_HRSnapshotsField; }
40 const Foam::word& HRInterpolatedField() const { return m_HRInterpolatedField; }
41 const bool& interpFieldCentered() const { return m_interpFieldCentered; }
42
43 void setHRInterpolatedField(const Foam::word& field) { m_HRInterpolatedField = field; }
44 void setHRSnapshotsField(const Foam::word& field) { m_HRSnapshotsField = field; }
45 void set_interpFieldCentered(const bool& b) { m_interpFieldCentered = b; }
46
47 // Magic points
48 const Foam::label& nMagicPoints() const { return m_nMagicPoints; }
49 const Foam::List<Foam::label>& magicPoints() const { return m_magicPoints; }
50 const Foam::List<Foam::label>& localMagicPoints() const { return m_localMagicPoints; }
51 const Foam::fvMesh& get_submesh() const { return *m_submesh; }
52
53 void setNMagicPoints(Foam::label n) { m_nMagicPoints = n; }
54 void setMagicPoints(const Foam::List<Foam::label>& points) { m_magicPoints = points; }
55 void setLocalMagicPoints(const Foam::List<Foam::label>& points) { m_localMagicPoints = points; }
56 void set_submesh(Foam::fvMesh& s) { m_submesh = &s; }
57
58 // Turbulence model coefficients
59 const float& Ck() const { return m_Ck; }
60 const float& Ce() const { return m_Ce; }
61 void setCk(float ck) { m_Ck = ck; }
62 void setCe(float ce) { m_Ce = ce; }
63
64 // DEIM folder
65 const Foam::word& folderDEIM() const { return m_folderDEIM; }
66 void setFolderDEIM(const Foam::word& folder) { m_folderDEIM = folder; }
67
68 // Deformation tensor modes
69 const Foam::PtrList<Foam::volTensorField>& deformationTensorOnMagicNeighborhoods() const
70 {
71 return m_deformationTensorOnMagicNeighborhoods;
72 }
73 const Foam::PtrList<Foam::volTensorField>& deformationTensorOnMagicPoints() const
74 {
75 return m_deformationTensorOnMagicPoints;
76 }
77 const Foam::PtrList<Foam::volVectorField>& tracerGradOnMagicNeighborhoods() const
78 {
79 return m_tracerGradOnMagicNeighborhoods;
80 }
81 const Foam::PtrList<Foam::volVectorField>& tracerGradOnMagicPoints() const
82 {
83 return m_tracerGradOnMagicPoints;
84 }
85
86 void setDeformationTensorOnMagicNeighborhoods(Foam::PtrList<Foam::volTensorField>& defT, Foam::label nModes);
87 void setDeformationTensorOnMagicPoints(Foam::PtrList<Foam::volTensorField>& defT, Foam::label nModes);
88 void setTracerGradOnMagicNeighborhoods(Foam::PtrList<Foam::volVectorField>& defT, Foam::label nModes);
89 void setTracerGradOnMagicPoints(Foam::PtrList<Foam::volVectorField>& defT, Foam::label nModes);
90
91 // DEIM matrices
92 const Eigen::MatrixXd& K_DEIM() const { return m_K_DEIM; }
93 const Eigen::MatrixXd& projectedK_DEIM() const { return m_projectedK_DEIM; }
94 const Eigen::MatrixXd& projectedMK_DEIM() const { return m_projectedMK_DEIM; }
95
96 void setK_DEIM(const Eigen::MatrixXd& K) { m_K_DEIM = K; }
97 void setProjectedK_DEIM(const Eigen::MatrixXd& K) { m_projectedK_DEIM = K; }
98 void setProjectedMK_DEIM(const Eigen::MatrixXd& MK) { m_projectedMK_DEIM = MK; }
99
100 // DEIM tensors for turbulence
101 const Eigen::Tensor<double, 3>& xiOnMagicPts() const { return m_xiOnMagicPts; }
102 const Eigen::Tensor<double, 3>& M_xiOnMagicPts() const { return m_M_xiOnMagicPts; }
103
104 void setXiOnMagicPts(const Eigen::Tensor<double, 3>& xi) { m_xiOnMagicPts = xi; }
105 void setM_XiOnMagicPts(const Eigen::Tensor<double, 3>& M_xi) { m_M_xiOnMagicPts = M_xi; }
106
107 // Mean fields for DEIM
108 const Foam::volVectorField* meanVectorDEIM() const { return m_meanVectorDEIM; }
109 const Foam::volScalarField* meanScalarDEIM() const { return m_meanScalarDEIM; }
110 const Foam::volVectorField* meanVectorDEIMMagic() const { return m_meanVectorDEIMMagic; }
111 const Foam::volScalarField* meanScalarDEIMMagic() const { return m_meanScalarDEIMMagic; }
112
113 void setMeanVectorDEIM(const Foam::volVectorField& mean);
114 void setMeanScalarDEIM(const Foam::volScalarField& mean);
115 void setMeanVectorDEIMMagic(const Foam::volVectorField& mean);
116 void setMeanScalarDEIMMagic(const Foam::volScalarField& mean);
117
118 // Delta weights for DEIM on dL2 nut
119 const Eigen::VectorXd deltaWeight() const { return m_deltaWeight; }
120 const Foam::volScalarField& get_magicDelta() const { return *m_magicDelta; }
121
122 void setDeltaWeight(const Eigen::VectorXd& dw);
123 void set_magicDelta(const Foam::volScalarField& mD);
124
125 // Initializers for the hyperreduction
126 void initializeHyperreduction(std::unique_ptr<PODConfiguration>& PODConfig);
127 void initializeReducedField(const Foam::word origField, std::unique_ptr<PODConfiguration>& PODConfig);
128 void addReducedFieldToPOD(const Foam::word& nameToReplace, const Foam::word& modifiedFieldName,
129 std::unique_ptr<PODConfiguration>& PODConfig);
130 Foam::word createReducedFieldName(const Foam::word& fieldName, std::unique_ptr<PODConfiguration>& PODConfig);
131
132private:
133
134 Foam::word m_HRMethod;
135 Foam::word m_ECPAlgo;
136
137 Foam::word m_HRInterpolatedField;
138 Foam::word m_HRSnapshotsField;
139 bool m_interpFieldCentered;
140
141 Foam::label m_nMagicPoints;
142 Foam::List<Foam::label> m_magicPoints;
143 Foam::List<Foam::label> m_localMagicPoints;
144 Foam::fvMesh* m_submesh;
145
146 float m_Ck; // Smagorinsky coefficient
147 float m_Ce; // Smagorinsky coefficient
148
149 Foam::word m_folderDEIM;
150
151 // Mode fields on magic points
152 Foam::PtrList<Foam::volTensorField> m_deformationTensorOnMagicPoints;
153 Foam::PtrList<Foam::volTensorField> m_deformationTensorOnMagicNeighborhoods;
154 Foam::PtrList<Foam::volVectorField> m_tracerGradOnMagicPoints;
155 Foam::PtrList<Foam::volVectorField> m_tracerGradOnMagicNeighborhoods;
156
157 // DEIM matrices
158 Eigen::MatrixXd m_K_DEIM;
159 Eigen::MatrixXd m_projectedK_DEIM;
160 Eigen::MatrixXd m_projectedMK_DEIM;
161
162 // Turbulence tensors
163 Eigen::Tensor<double, 3> m_xiOnMagicPts;
164 Eigen::Tensor<double, 3> m_M_xiOnMagicPts;
165
166 // Mean fields
167 Foam::volVectorField* m_meanVectorDEIM;
168 Foam::volScalarField* m_meanScalarDEIM;
169 Foam::volVectorField* m_meanVectorDEIMMagic;
170 Foam::volScalarField* m_meanScalarDEIMMagic;
171
172 Eigen::VectorXd m_deltaWeight;
173 Foam::volScalarField* m_magicDelta;
174};
175
176
177#endif // HyperreductionConfiguration_H
Header file of the ITHACAutilities namespace.