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.