1#include "HyperreductionConfiguration.H"
2#include "GeometricField.H"
3#include "fvPatchField.H"
4#include "volFieldsFwd.H"
6void HyperreductionConfiguration::setTracerGradOnMagicNeighborhoods(Foam::PtrList<Foam::volVectorField>& defT, Foam::label nModes)
8 m_tracerGradOnMagicNeighborhoods.resize(nModes);
9 for (Foam::label k = 0; k < nModes; k++)
11 m_tracerGradOnMagicNeighborhoods.set(k,
new Foam::volVectorField(defT[k]));
15void HyperreductionConfiguration::setTracerGradOnMagicPoints(Foam::PtrList<Foam::volVectorField>& defT, Foam::label nModes)
17 m_tracerGradOnMagicPoints.resize(nModes);
18 for (Foam::label k = 0; k < nModes; k++)
20 m_tracerGradOnMagicPoints.set(k,
new Foam::volVectorField(defT[k]));
24void HyperreductionConfiguration::setDeformationTensorOnMagicNeighborhoods(Foam::PtrList<Foam::volTensorField>& defT, Foam::label nModes)
26 m_deformationTensorOnMagicNeighborhoods.resize(nModes);
27 for (Foam::label k = 0; k < nModes; k++)
29 m_deformationTensorOnMagicNeighborhoods.set(k,
new Foam::volTensorField(defT[k]));
33void HyperreductionConfiguration::setDeformationTensorOnMagicPoints(Foam::PtrList<Foam::volTensorField>& defT, Foam::label nModes)
35 m_deformationTensorOnMagicPoints.resize(nModes);
36 for (Foam::label k = 0; k < nModes; k++)
38 m_deformationTensorOnMagicPoints.set(k,
new Foam::volTensorField(defT[k]));
42void HyperreductionConfiguration::setMeanVectorDEIM(
const Foam::volVectorField& mean)
44 m_meanVectorDEIM =
new Foam::volVectorField(mean);
47void HyperreductionConfiguration::setMeanScalarDEIM(
const Foam::volScalarField& mean)
49 m_meanScalarDEIM =
new Foam::volScalarField(mean);
52void HyperreductionConfiguration::setMeanVectorDEIMMagic(
const Foam::volVectorField& mean)
54 m_meanVectorDEIMMagic =
new Foam::volVectorField(mean);
57void HyperreductionConfiguration::setMeanScalarDEIMMagic(
const Foam::volScalarField& mean)
59 m_meanScalarDEIMMagic =
new Foam::volScalarField(mean);
62void HyperreductionConfiguration::setDeltaWeight(
const Eigen::VectorXd& dw)
67void HyperreductionConfiguration::set_magicDelta(
const Foam::volScalarField& mD)
69 m_magicDelta =
new Foam::GeometricField<Foam::scalar, Foam::fvPatchField, Foam::volMesh>(mD);
72void HyperreductionConfiguration::initializeHyperreduction(std::unique_ptr<PODConfiguration>& PODConfig)
74 if (m_HRMethod ==
"GappyDEIM")
79 if (m_interpFieldCentered)
81 m_folderDEIM =
"./ITHACAoutput/Hyperreduction/" + m_HRMethod +
"_centered/";
85 m_folderDEIM =
"./ITHACAoutput/Hyperreduction/" + m_HRMethod +
"/";
88 std::string nbModesUInFolderDEIM =
"";
89 std::string ECPAlgoInFolderDEIM =
"";
94 initializeReducedField(m_HRInterpolatedField, PODConfig);
95 nbModesUInFolderDEIM = std::to_string(PODConfig->nModes()[
"U"]) +
"modesU/";
97 m_nMagicPoints = PODConfig->nModes()[m_HRInterpolatedField];
98 m_HRSnapshotsField = m_HRInterpolatedField;
100 if (m_HRMethod ==
"ECP")
102 if (!(m_ECPAlgo ==
"Global" || m_ECPAlgo ==
"EachMode"))
104 Foam::Info <<
"Error: ECPAlgo must be Global or EachMode" << Foam::endl;
108 if (m_HRInterpolatedField ==
"fullStressFunction")
110 m_HRSnapshotsField =
"projFullStressFunction_" + std::to_string(PODConfig->nModes()[
"U"]) +
"modes";
114 m_HRSnapshotsField =
"projReducedFullStressFunction_" + std::to_string(PODConfig->nModes()[
"U"]) +
"modes";
116 else if (m_HRInterpolatedField ==
"nut")
118 m_HRSnapshotsField =
"projSmagFromNut_" + std::to_string(PODConfig->nModes()[
"U"]) +
"modes";
122 m_HRSnapshotsField =
"projSmagFromReducedNut_" + std::to_string(PODConfig->nModes()[
"U"]) +
"modes";
126 Foam::Info <<
"Error: ECP method is coded only for fullStressFunction and nut" << Foam::endl;
130 ECPAlgoInFolderDEIM = m_ECPAlgo +
"/";
131 nbModesUInFolderDEIM = std::to_string(PODConfig->nModes()[
"U"]) +
"modesU/";
134 if (m_ECPAlgo ==
"EachMode")
136 nECPFields = PODConfig->nModes()[
"U"];
139 for (
int c = 0; c < nECPFields; c++)
143 Foam::word fieldNameModec = m_HRSnapshotsField;
144 if (m_ECPAlgo ==
"EachMode")
146 fieldNameModec +=
"_" + std::to_string(c + 1);
149 fieldNameModec +=
"_" + std::to_string(k);
152 PODConfig->appendField(fieldNameModec,
"scalar");
153 PODConfig->insert_nModes(fieldNameModec, PODConfig->nModes()[m_HRInterpolatedField]);
154 PODConfig->insert_hilbertSpacePOD(PODConfig->field_name().last(),
"L2");
155 PODConfig->set_varyingEnergy(PODConfig->field_name().last(), 0);
156 PODConfig->set_resolvedVaryingEnergy(PODConfig->field_name().last(), 0);
161 m_folderDEIM += m_HRInterpolatedField.substr(0, m_HRInterpolatedField.find(
"_")) +
"/" + nbModesUInFolderDEIM;
162 m_folderDEIM += std::to_string(m_nMagicPoints) +
"magicPoints/" + ECPAlgoInFolderDEIM;
165void HyperreductionConfiguration::initializeReducedField(
const Foam::word origField,
166 std::unique_ptr<PODConfiguration>& PODConfig)
168 Foam::word nameToReplace = origField.substr(7);
169 nameToReplace[0] = tolower(nameToReplace[0]);
170 Foam::word modifiedFieldName = createReducedFieldName(origField, PODConfig);
171 m_HRInterpolatedField = modifiedFieldName;
172 addReducedFieldToPOD(nameToReplace, modifiedFieldName, PODConfig);
175void HyperreductionConfiguration::addReducedFieldToPOD(
const Foam::word& nameToReplace,
176 const Foam::word& modifiedFieldName, std::unique_ptr<PODConfiguration>& PODConfig)
178 const auto& field_type = PODConfig->field_type();
179 const auto& field_name = PODConfig->field_name();
181 PODConfig->appendField(modifiedFieldName , field_type[find(field_name.begin(), field_name.end(), nameToReplace) - field_name.begin()]);
182 PODConfig->insert_nModes(modifiedFieldName, PODConfig->nModes()[nameToReplace]);
183 PODConfig->insert_hilbertSpacePOD(modifiedFieldName, PODConfig->hilbertSpacePOD()[nameToReplace]);
184 PODConfig->set_varyingEnergy(modifiedFieldName, 0);
185 PODConfig->set_resolvedVaryingEnergy(modifiedFieldName, 0);
188Foam::word HyperreductionConfiguration::createReducedFieldName(
const Foam::word& fieldName,
189 std::unique_ptr<PODConfiguration>& PODConfig)
191 return fieldName +
"_" + std::to_string(PODConfig->nModes()[
"U"]) +
"modes";
bool containsSubstring(std::string contain, std::string contained)
Returns true if contained is a substring of contain, false otherwise.