33tutorial27_offline::tutorial27_offline(
int argc,
char* argv[]):
36 nModesU(m_parameters->get_nModes()[
"U"]),
37 interpolatedField(m_parameters->get_DEIMInterpolatedField()),
38 nModesHR(m_parameters->get_nModes()[interpolatedField]),
39 nMagicPoints(m_parameters->get_nMagicPoints()),
40 magicPoints(m_parameters->get_magicPoints())
44 Info <<
"Error: Hyperreduction InterpolatedField not valid: " << interpolatedField << endl;
45 Info <<
"Expects reducedFullStressFunction or reducedNut" << endl;
51void tutorial27_offline::decompose()
53 ITHACAPOD::PODTemplate<volVectorField> podU(m_parameters,
"U");
56 podU.getModes(spatialModesU, temporalModesU, temporalModesUSimulation, covMatrixU);
59 meanU =
new volVectorField(podU.get_mean());
60 m_parameters->set_meanU(*meanU);
62 volVectorField template_HRInterpField(interpolatedField, m_UnsteadyNSTurb->initSmagFunction());
63 m_parameters->set_template_field_fullStressFunction(template_HRInterpField);
67 bool mgPoints_0_Neighborhoods_1 =
true;
69 if (m_parameters->get_HRMethod() ==
"DEIM")
71 TurbDiffusionHyperreduction<volVectorField,volVectorField,volVectorField>*
72 turbDiffHR_fullStressFunction =
new TurbDiffusionHyperreduction<volVectorField,volVectorField,volVectorField>
73 (m_parameters, mgPoints_0_Neighborhoods_1, template_HRInterpField, template_HRInterpField, meanU, spatialModesU);
77 else if (m_parameters->get_HRMethod() ==
"ECP")
79 volScalarField template_HRSnapshotsField(m_parameters->get_HRSnapshotsField(),
80 m_UnsteadyNSTurb->initProjSmagFunction());
81 TurbDiffusionHyperreduction<volVectorField,volVectorField,volScalarField>*
82 turbDiffHR_projFullStressFunction =
new TurbDiffusionHyperreduction<volVectorField,volVectorField,volScalarField>
83 (m_parameters, mgPoints_0_Neighborhoods_1, template_HRInterpField, template_HRSnapshotsField, meanU, spatialModesU);
90 bool mgPoints_0_Neighborhoods_1 =
false;
91 volScalarField template_HRInterpField(interpolatedField, m_UnsteadyNSTurb->initNutFunction());
92 volScalarField template_HRSnapshotsField(m_UnsteadyNSTurb->initProjSmagFromNutFunction());
93 TurbDiffusionHyperreduction<volVectorField,volScalarField,volScalarField>*
94 turbDiffHR_nut =
new TurbDiffusionHyperreduction<volVectorField,volScalarField,volScalarField>
95 (m_parameters, mgPoints_0_Neighborhoods_1, template_HRInterpField, template_HRSnapshotsField, meanU, spatialModesU);
101 Info <<
"Error: Hyperreduction InterpolatedField not valid: " << interpolatedField << endl;
102 Info <<
"Expects reducedFullStressFunction or reducedNut" << endl;
108void tutorial27_offline::project()
110 word folder_DEIM = m_parameters->get_folder_DEIM();
113 Eigen::MatrixXd K_proj(nModesU, d*(nMagicPoints+1));
114 Eigen::MatrixXd K_DEIM = m_parameters->get_K_DEIM();
119 word file_projK_DEIM = folder_DEIM +
"projected_K_DEIM_" + std::to_string(nModesU) +
".npy";
122 if (!exist_projK_DEIM)
125 const volScalarField weight = sqrt(m_parameters->get_volume());
126 volVectorField meanSmag(m_parameters->get_meanVectorDEIM());
128 for (
int i = 0 ; i < nModesU ; i++)
130 Eigen::VectorXd K_proj_line_i(d*nMagicPoints);
131 if (m_parameters->get_HRMethod() ==
"DEIM")
133 volVectorField weightedSpatialModesU_OF = weight * spatialModesU[i];
135 K_proj_line_i = K_DEIM.transpose() * weightedSpatialModesU;
137 else if (m_parameters->get_HRMethod() ==
"ECP")
139 K_proj_line_i = K_DEIM.row(i);
142 K_proj.row(i).head(d*nMagicPoints) = K_proj_line_i;
144 K_proj(i, d*nMagicPoints + 1) = 0.0;
145 K_proj(i, d*nMagicPoints + 2) = 0.0;
148 cnpy::save(K_proj, file_projK_DEIM);
149 m_parameters->set_projected_K_DEIM(K_proj);
153 cnpy::load(K_proj, file_projK_DEIM);
154 m_parameters->set_projected_K_DEIM(K_proj);
159 Eigen::Tensor<double, 3> xi_onMagicPts(nModesU + 1, nMagicPoints + 1, nModesU);
160 word xi_onMagicPts_file(
"xi_onMagicPts.npy");
163 if (!exist_xi_onMagicPts)
165 volScalarField meanNut = m_parameters->get_meanScalarDEIM();
167 if (m_parameters->get_HRMethod() ==
"DEIM")
170 for (label i = 0; i < nModesU; i++)
172 for (label q = 0; q < nModesU+1; q++)
174 for (label j = 0; j < nMagicPoints; j++)
176 Eigen::VectorXd K_DEIM_col_j = K_DEIM.col(j);
191 m_UnsteadyNSTurb->diffusion(meanNut,*meanU));
196 m_UnsteadyNSTurb->diffusion(meanNut,spatialModesU[q-1]));
201 else if (m_parameters->get_HRMethod() ==
"ECP")
203 PtrList<volTensorField> defTensorModesOnMgPts = m_parameters->get_deformationTensorOfModesOnMagicPoints();
204 labelList localMagicPoints(m_parameters->get_localMagicPoints());
206 for (label i = 0; i < nModesU; i++)
208 for (label q = 0; q < nModesU+1; q++)
210 for (label j = 0; j < nMagicPoints; j++)
212 label row_id = ((pow(
max(i,q-1),2)+3*
max(i,q-1))/2 +
min(i+1,q)) * (m_parameters->get_ECPAlgo()!=
"Global");
213 xi_onMagicPts(q,j,i) = -2*K_DEIM(row_id,j)*(dev(defTensorModesOnMgPts[i+1][localMagicPoints[j]])
214 && dev(defTensorModesOnMgPts[q][localMagicPoints[j]]));
219 xi_onMagicPts(q,nMagicPoints,i) = -fvc::domainIntegrate(m_UnsteadyNSTurb->
220 projDiffusionIBP(meanNut, *meanU, spatialModesU[i])).value();
224 xi_onMagicPts(q,nMagicPoints,i) = -fvc::domainIntegrate(m_UnsteadyNSTurb->
225 projDiffusionIBP(meanNut, spatialModesU[q-1], spatialModesU[i])).value();
230 cnpy::save(xi_onMagicPts, folder_DEIM + xi_onMagicPts_file);
231 m_parameters->set_xi_onMagicPts(xi_onMagicPts);
235 cnpy::load(xi_onMagicPts, folder_DEIM + xi_onMagicPts_file);
236 m_parameters->set_xi_onMagicPts(xi_onMagicPts);
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.
Class that contains all parameters of the stochastic POD.
void computeTurbDiffusionHyperreduction()
Compute the hyperreduction by callng other methods.
Implementation of a parametrized full order unsteady NS problem and preparation of the reduced matr...
T max(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the maximum of a sparse Matrix (Useful for DEIM).
T min(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the minimum of a sparse Matrix (Useful for DEIM).
bool containsSubstring(std::string contain, std::string contained)
Returns true if contained is a substring of contain, false otherwise.
double dot_product_L2(const volVectorField &v, const volVectorField &w)
Perform the L2 dot product of v and w.
bool check_file(std::string fileName)
Function that returns true if a file exists.