1 #include "pod_basis_online.h" 4 #include <deal.II/numerics/vector_tools.h> 5 #include <deal.II/lac/full_matrix.h> 6 #include <deal.II/lac/trilinos_sparse_matrix.h> 7 #include <deal.II/lac/vector_operation.h> 8 #include <deal.II/lac/la_parallel_vector.h> 9 #include <Teuchos_DefaultMpiComm.hpp> 10 #include <Epetra_CrsMatrix.h> 11 #include <Epetra_Map.h> 12 #include <eigen/Eigen/SVD> 15 namespace ProperOrthogonalDecomposition {
19 : basis(
std::make_shared<dealii::TrilinosWrappers::SparseMatrix>())
20 , system_matrix(_system_matrix)
21 , mpi_communicator(MPI_COMM_WORLD)
22 , mpi_rank(dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
23 , pcout(
std::cout, mpi_rank==0)
29 pcout <<
"Adding new snapshot to snapshot matrix..." << std::endl;
30 dealii::LinearAlgebra::ReadWriteVector<double> read_snapshot(snapshot.size());
31 read_snapshot.import(snapshot, dealii::VectorOperation::values::insert);
32 VectorXd eigen_snapshot(snapshot.size());
33 for(
unsigned int i = 0 ; i < snapshot.size() ; i++){
34 eigen_snapshot(i) = read_snapshot(i);
50 pcout <<
"Computing POD basis..." << std::endl;
55 for(
unsigned int i = 0 ; i < reference_state.size() ; i++){
59 MatrixXd snapshotMatrixCentered =
snapshotMatrix.colwise() - reference_state;
61 Eigen::BDCSVD<MatrixXd, Eigen::DecompositionOptions::ComputeThinU> svd(snapshotMatrixCentered);
62 MatrixXd pod_basis = svd.matrixU();
64 const Epetra_CrsMatrix epetra_system_matrix =
system_matrix->trilinos_matrix();
65 Epetra_Map system_matrix_map = epetra_system_matrix.RowMap();
66 Epetra_CrsMatrix epetra_basis(Epetra_DataAccess::Copy, system_matrix_map, pod_basis.cols());
68 const int numMyElements = system_matrix_map.NumMyElements();
70 for (
int localRow = 0; localRow < numMyElements; ++localRow){
71 const int globalRow = system_matrix_map.GID(localRow);
72 for(
int n = 0 ; n < pod_basis.cols() ; n++){
73 epetra_basis.InsertGlobalValues(globalRow, 1, &pod_basis(globalRow, n), &n);
77 Epetra_MpiComm epetra_comm(MPI_COMM_WORLD);
78 Epetra_Map domain_map((
int)pod_basis.cols(), 0, epetra_comm);
80 epetra_basis.FillComplete(domain_map, system_matrix_map);
82 basis->reinit(epetra_basis);
84 pcout <<
"Done computing POD basis. Basis now has " <<
basis->n() <<
" columns." << std::endl;
Class for Online Proper Orthogonal Decomposition basis. This class takes snapshots on the fly and com...
dealii::LinearAlgebra::ReadWriteVector< double > getReferenceState() override
Function to get POD reference state.
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > getPODBasis() override
Function to get POD basis for all derived classes.
dealii::LinearAlgebra::ReadWriteVector< double > referenceState
Reference state.
void addSnapshot(dealii::LinearAlgebra::distributed::Vector< double > snapshot)
Add snapshot.
Files for the baseline physics.
MatrixXd getSnapshotMatrix() override
Function to get snapshot matrix used to build POD basis.
OnlinePOD(std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > _system_matrix)
Constructor.
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > system_matrix
For sparsity pattern of system matrix.
std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > basis
POD basis.
dealii::LAPACKFullMatrix< double > dealiiSnapshotMatrix
LAPACK matrix of snapshots for nice printing.
MatrixXd snapshotMatrix
Matrix containing snapshots.
dealii::ConditionalOStream pcout
ConditionalOStream.
void computeBasis()
Compute new POD basis from snapshots.