10 #include <stk_linsys/AggregateLinearSystem.hpp> 11 #include <stk_linsys/LinearSystem.hpp> 12 #include <stk_linsys/ImplDetails.hpp> 13 #include <stk_mesh/base/GetBuckets.hpp> 15 #include <stk_linsys/LinsysFunctions.hpp> 21 : m_fei_factory(factory),
22 m_linear_system(comm, factory),
23 m_matrices(num_matrices),
24 m_rhsvecs(num_rhsvecs)
33 AggregateLinearSystem::set_parameters(Teuchos::ParameterList& paramlist)
35 m_linear_system.set_parameters(paramlist);
41 m_matrices.resize(num_matrices);
42 m_rhsvecs.resize(num_rhsvecs);
58 for(
size_t i=0; i<m_matrices.size(); ++i) {
59 m_matrices[i] = m_fei_factory->createMatrix(mgraph);
62 bool is_soln_vec =
false;
63 for(
size_t i=0; i<m_rhsvecs.size(); ++i) {
64 m_rhsvecs[i] = m_fei_factory->createVector(mgraph,is_soln_vec);
68 fei::SharedPtr<fei::Matrix>
71 if (index >= m_matrices.size()) {
72 throw std::runtime_error(
"stk_classic::linsys::AggregateLinearSystem::get_matrix ERROR, index out of range.");
75 return m_matrices[index];
78 fei::SharedPtr<fei::Vector>
81 if (index >= m_rhsvecs.size()) {
82 throw std::runtime_error(
"stk_classic::linsys::AggregateLinearSystem::get_rhsvec ERROR, index out of range.");
85 return m_rhsvecs[index];
90 const std::vector<double>& rhs_scalars)
92 if (mat_scalars.size() != m_matrices.size()) {
93 throw std::runtime_error(
"stk_classic::linsys::AggregateLinearSystem::aggregate_system ERROR, mat_scalars.size() != m_matrices.size().");
96 if (rhs_scalars.size() != m_rhsvecs.size()) {
97 throw std::runtime_error(
"stk_classic::linsys::AggregateLinearSystem::aggregate_system ERROR, rhs_scalars.size() != m_rhsvecs.size().");
101 fei::SharedPtr<fei::Matrix> matrix = fei_linsys->getMatrix();
102 fei::SharedPtr<fei::Vector> rhsvec = fei_linsys->getRHS();
104 matrix->gatherFromOverlap();
105 matrix->putScalar(0.0);
107 for(
size_t i=0; i<m_matrices.size(); ++i) {
111 rhsvec->gatherFromOverlap();
112 rhsvec->putScalar(0.0);
114 for(
size_t i=0; i<m_rhsvecs.size(); ++i) {
138 AggregateLinearSystem::reset_to_zero()
140 for(
size_t i=0; i<m_matrices.size(); ++i) {
141 if (m_matrices[i].
get() != NULL) m_matrices[i]->putScalar(0);
143 for(
size_t i=0; i<m_rhsvecs.size(); ++i) {
144 if (m_rhsvecs[i].
get() != NULL) m_rhsvecs[i]->putScalar(0);
148 const fei::SharedPtr<fei::MatrixGraph>
154 fei::SharedPtr<fei::MatrixGraph>
160 const fei::SharedPtr<fei::LinearSystem>
166 fei::SharedPtr<fei::LinearSystem>
173 AggregateLinearSystem::write_files(
const std::string& base_name)
const 175 for(
size_t i=0; i<m_matrices.size(); ++i) {
176 if (m_matrices[i].
get() == NULL)
continue;
177 std::ostringstream ossA;
178 ossA <<
"A_" << base_name <<
".mat"<<i<<
".mtx";
179 std::string Aname = ossA.str();
180 m_matrices[i]->writeToFile(Aname.c_str());
182 for(
size_t i=0; i<m_rhsvecs.size(); ++i) {
183 if (m_rhsvecs[i].
get() == NULL)
continue;
184 std::ostringstream ossb;
185 ossb <<
"b_" << base_name <<
".vec"<<i<<
".vec";
186 std::string bname = ossb.str();
187 m_rhsvecs[i]->writeToFile(bname.c_str());
194 return m_linear_system.
solve(status, params);
const fei::SharedPtr< fei::MatrixGraph > get_fei_MatrixGraph() const
fei::SharedPtr< fei::Vector > get_rhsvec(size_t index)
virtual ~AggregateLinearSystem()
void create_fei_LinearSystem()
int solve(int &status, const Teuchos::ParameterList ¶ms)
void aggregate_system(const std::vector< double > &mat_scalars, const std::vector< double > &rhs_scalars)
void synchronize_mappings_and_structure()
void synchronize_mappings_and_structure()
const fei::SharedPtr< fei::LinearSystem > get_fei_LinearSystem() const
fei::SharedPtr< fei::Matrix > get_matrix(size_t index)
const fei::SharedPtr< fei::LinearSystem > get_fei_LinearSystem() const
const DofMapper & get_DofMapper() const
AggregateLinearSystem(MPI_Comm comm, fei::SharedPtr< fei::Factory > factory, size_t num_matrices=1, size_t num_rhsvecs=1)
void add_matrix_to_matrix(double scalar, const fei::Matrix &src_matrix, fei::Matrix &dest_matrix)
const fei::SharedPtr< fei::MatrixGraph > get_fei_MatrixGraph() const
int solve(int &status, const Teuchos::ParameterList ¶ms)
void add_vector_to_vector(double scalar, const fei::Vector &src_vector, fei::Vector &dest_vector)
void create_fei_LinearSystem()
const DofMapper & get_DofMapper() const
void set_num_matrices_rhsvecs(size_t num_matrices, size_t num_rhsvecs)