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);
258 typedef Eigen::Triplet<double> Trip;
259 std::vector<Trip> tripletList;
260 tripletList.reserve(Matrix.nonZeros());
261 Eigen::SparseMatrix<T> vec;
262 vec.resize(1, Matrix.size());
263 vec.reserve(Matrix.nonZeros());
265 for (label k = 0; k < Matrix.outerSize(); ++k)
267 for (Eigen::SparseMatrix<double>::InnerIterator it(Matrix, k); it; ++it)
269 tripletList.push_back(Trip(0, it.row() + it.col() * Matrix.rows(), it.value()));
273 vec.setFromTriplets(tripletList.begin(), tripletList.end());
283 for (label k = 0; k < mat.outerSize(); ++k)
285 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
287 if (
max < it.value() ||
i == 0)
307 for (label k = 0; k < mat.outerSize(); ++k)
309 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
311 if (
min > it.value() ||
i == 0)
326 List <Eigen::SparseMatrix<T >> &
A, List <Eigen::SparseMatrix<T >>& B)
328 label rows =
A.size();
329 label cols = B.size();
330 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
331 out.resize(rows, cols);
333 for (label
i = 0;
i < rows;
i++)
335 for (label j = 0; j < cols; j++)
346 List<Eigen::SparseMatrix<T >> &
A, Eigen::SparseMatrix<T>& B)
348 label rows =
A.size();
350 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
351 out.resize(rows, cols);
353 for (label
i = 0;
i < rows;
i++)
363 Eigen::SparseMatrix<T>& B)
367 for (label k = 0; k <
A.cols(); k++)
369 res +=
A.col(k).dot(B.col(k));
378 , Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C)
380 Eigen::SparseMatrix<T> out;
383 for (label
i = 1;
i <
A.size();
i++)
393 const std::vector< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >> &
A,
394 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C)
396 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
399 for (label
i = 1;
i <
A.size();
i++)
411 List<Eigen::SparseMatrix<T >>&
A,
412 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >> & C)
414 List<Eigen::SparseMatrix<T >> out;
415 out.resize(C.cols());
416 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
col;
418 for (label
i = 0;
i < C.cols();
i++)
430 Eigen::JacobiSVD<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>
svd(
A);
431 T cond =
svd.singularValues()(0) /
svd.singularValues()(
432 svd.singularValues().size() - 1);
439using namespace Eigen;
441template<
typename VectorType>
443 label prec, std::_Ios_Fmtflags outytpe = std::ios_base::scientific)
445 typedef typename VectorType::Scalar Scalar;
446 std::ofstream out(filename.c_str(), std::ios::out);
456 if (internal::is_same<Scalar, std::complex<float >>::value
457 || internal::is_same<Scalar, std::complex<double >>::value)
459 out <<
"%%MatrixMarket matrix array complex general\n";
463 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);
475template<
typename VectorType>
477 Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
479 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
480 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
487 t2.dimensions()[1] );
491template<
typename VectorType>
493 const Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
495 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
496 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
503 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)