37#ifndef EigenFunctions_H
38#define EigenFunctions_H
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wold-style-cast"
43#include <unsupported/Eigen/SparseExtra>
44#include <unsupported/Eigen/CXX11/Tensor>
45#pragma GCC diagnostic pop
70Eigen::SparseMatrix<T>
vectorize(Eigen::SparseMatrix<T>& Matrix);
84T max(Eigen::SparseMatrix<T>& mat, label& ind_row, label& ind_col);
98T min(Eigen::SparseMatrix<T>& mat, label& ind_row, label& ind_col);
107 Eigen::MatrixXd& eigenvectors);
122Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
innerProduct(
123 List <Eigen::SparseMatrix<T>>&
A, List <Eigen::SparseMatrix<T>>& B);
138Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
innerProduct(
139 List <Eigen::SparseMatrix<T>>&
A, Eigen::SparseMatrix<T>& B);
155T innerProduct(Eigen::SparseMatrix<T>&
A, Eigen::SparseMatrix<T>& B);
172Eigen::SparseMatrix<T>
MVproduct(List<Eigen::SparseMatrix<T>>&
A,
173 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C);
190Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
MVproduct(
191 const std::vector< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>&
A,
192 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C);
209List<Eigen::SparseMatrix<T>>
MMproduct(List<Eigen::SparseMatrix<T>>&
A,
210 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C);
222T condNumber(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>&
A);
235Eigen::VectorXd
ExpSpaced(
double first,
double last,
int n);
248 const Eigen::Matrix<T, Eigen::Dynamic, 1>&
g,
249 const Eigen::Tensor<T, 3 >& c,
250 const Eigen::Matrix<T, Eigen::Dynamic, 1>& a);
257 typedef Eigen::Triplet<double> Trip;
258 std::vector<Trip> tripletList;
259 tripletList.reserve(Matrix.nonZeros());
260 Eigen::SparseMatrix<T> vec;
261 vec.resize(1, Matrix.size());
262 vec.reserve(Matrix.nonZeros());
264 for (label k = 0; k < Matrix.outerSize(); ++k)
266 for (Eigen::SparseMatrix<double>::InnerIterator it(Matrix, k); it; ++it)
268 tripletList.push_back(Trip(0, it.row() + it.col()*Matrix.rows(), it.value()));
272 vec.setFromTriplets(tripletList.begin(), tripletList.end());
282 for (label k = 0; k < mat.outerSize(); ++k)
284 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
286 if (
max < it.value() ||
i == 0)
306 for (label k = 0; k < mat.outerSize(); ++k)
308 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
310 if (
min > it.value() ||
i == 0)
325 List <Eigen::SparseMatrix<T>>&
A, List <Eigen::SparseMatrix<T>>& B)
327 label rows =
A.size();
328 label cols = B.size();
329 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
330 out.resize(rows, cols);
332 for (label
i = 0;
i < rows;
i++)
334 for (label j = 0; j < cols; j++)
345 List<Eigen::SparseMatrix<T>>&
A, Eigen::SparseMatrix<T>& B)
347 label rows =
A.size();
349 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
350 out.resize(rows, cols);
352 for (label
i = 0;
i < rows;
i++)
362 Eigen::SparseMatrix<T>& B)
366 for (label k = 0; k <
A.cols(); k++)
368 res +=
A.col(k).dot(B.col(k));
376 , Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C)
378 Eigen::SparseMatrix<T> out;
381 for (label
i = 1;
i <
A.size();
i++)
391 const std::vector< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>&
A,
392 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C)
394 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
397 for (label
i = 1;
i <
A.size();
i++)
409 List<Eigen::SparseMatrix<T>>&
A,
410 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>& C)
412 List<Eigen::SparseMatrix<T>> out;
413 out.resize(C.cols());
414 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
col;
416 for (label
i = 0;
i < C.cols();
i++)
429 Eigen::JacobiSVD<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>
svd(
A);
430 T cond =
svd.singularValues()(0) /
svd.singularValues()(
431 svd.singularValues().size() - 1);
438using namespace Eigen;
440template<
typename VectorType>
442 label prec, std::_Ios_Fmtflags outytpe = std::ios_base::scientific)
444 typedef typename VectorType::Scalar Scalar;
445 std::ofstream out(filename.c_str(), std::ios::out);
455 if (internal::is_same<Scalar, std::complex<float>>::value
456 || internal::is_same<Scalar, std::complex<double>>::value)
458 out <<
"%%MatrixMarket matrix array complex general\n";
462 out <<
"%%MatrixMarket matrix array real general\n";
465 out << vec.size() <<
" " << 1 <<
"\n";
467 for (label
i = 0;
i < vec.size();
i++)
469 internal::putVectorElt(vec(
i), out);
476template<
typename VectorType>
478 Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
480 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
481 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
488 t2.dimensions()[1] );
492template<
typename VectorType>
494 const Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
496 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
497 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
504 t2.dimensions()[1] );
Namespace to perform operation on Eigen objects.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > vectorTensorProduct(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &g, const Eigen::Tensor< T, 3 > &c, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &a)
A function that computes the product of g.T c a, where c is a third dim tensor.
Eigen::SparseMatrix< T > MVproduct(List< Eigen::SparseMatrix< T > > &A, Eigen::DenseBase< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > > &C)
Sparse Matrix-Vector product between a list of sparse matrices and a vector of coefficients.
T max(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the maximum of a sparse Matrix (Useful for DEIM)
Eigen::VectorXd ExpSpaced(double first, double last, int n)
Returns exponentially spaced vector.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > innerProduct(List< Eigen::SparseMatrix< T > > &A, List< Eigen::SparseMatrix< T > > &B)
Perform Frobenius inner Product between two list of sparse matrices A and B.
Eigen::SparseMatrix< T > vectorize(Eigen::SparseMatrix< T > &Matrix)
Vectorize a Sparse Matrix.
void sortEigenvalues(Eigen::VectorXd &eigenvalues, Eigen::MatrixXd &eigenvectors)
sort eigenvalues
T condNumber(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &A)
Conditioning number of a dense matrix.
List< Eigen::SparseMatrix< T > > MMproduct(List< Eigen::SparseMatrix< T > > &A, Eigen::DenseBase< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > > &C)
Sparse Matrix - Dense Matrix product between a list of sparse matrices and a dense matrix.
T min(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the minimum of a sparse Matrix (Useful for DEIM)
bool saveMarketVector(const VectorType &vec, const std::string &filename, label prec, std::_Ios_Fmtflags outytpe=std::ios_base::scientific)
Matrix< VectorType, Dynamic, Dynamic > SliceFromTensor(Eigen::Tensor< VectorType, 3 > &tensor, label dim, label index1)
Info<< endl;Info<< "*********************************************************"<< endl;Info<< "Performing test for the parameterized BC inverse solver"<< endl;Info<< endl;word outputFolder="./ITHACAoutput/parameterizedBCtest_RBFparameter/";volScalarField gTrueField=example_paramBC.list2Field(example_paramBC.gTrue);ITHACAstream::exportSolution(gTrueField, "1", outputFolder, "gTrue");Eigen::VectorXd rbfWidth=EigenFunctions::ExpSpaced(0.001, 100, rbfWidthTest_size);ITHACAstream::exportMatrix(rbfWidth, "rbfShapeParameters", "eigen", outputFolder);Eigen::VectorXd residualNorms;residualNorms.resize(rbfWidthTest_size);Eigen::VectorXd heatFluxL2norm(rbfWidthTest_size);Eigen::VectorXd heatFluxLinfNorm=heatFluxL2norm;Eigen::VectorXd condNumber=heatFluxL2norm;Eigen::MatrixXd singVal;for(int i=0;i< rbfWidthTest_size;i++){ Info<< "*********************************************************"<< endl;Info<< "RBF parameter "<< rbfWidth(i)<< endl;Info<< "Test "<< i+1<< endl;Info<< endl;example_paramBC.set_gParametrized("rbf", rbfWidth(i));example_paramBC.parameterizedBCoffline(1);example_paramBC.parameterizedBC("fullPivLU");volScalarField gParametrizedField=example_paramBC.list2Field(example_paramBC.g);ITHACAstream::exportSolution(gParametrizedField, std::to_string(i+1), outputFolder, "gParametrized");volScalarField &T(example_paramBC._T());ITHACAstream::exportSolution(T, std::to_string(i+1), outputFolder, "T");residualNorms(i)=Foam::sqrt(example_paramBC.residual.squaredNorm());Eigen::MatrixXd A=example_paramBC.Theta.transpose() *example_paramBC.Theta;Eigen::JacobiSVD< Eigen::MatrixXd > svd(A, Eigen::ComputeThinU|Eigen::ComputeThinV)