From: kronbichler Date: Sat, 23 Aug 2008 00:56:06 +0000 (+0000) Subject: Updated version of Trilinos wrappers. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5e80e610092ea2dc229ce9670ecd9dbfaa9b923;p=dealii-svn.git Updated version of Trilinos wrappers. git-svn-id: https://svn.dealii.org/trunk@16659 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/lac/include/lac/trilinos_block_sparse_matrix.h b/deal.II/lac/include/lac/trilinos_block_sparse_matrix.h index 99f2caab4c..b2ee84f753 100644 --- a/deal.II/lac/include/lac/trilinos_block_sparse_matrix.h +++ b/deal.II/lac/include/lac/trilinos_block_sparse_matrix.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -177,7 +178,8 @@ namespace TrilinosWrappers * assumes that a quadratic block * matrix is generated. */ - //void reinit (const std::vector &input_maps); + void reinit (const std::vector &input_maps, + const BlockSparsityPattern &block_sparsity_pattern); /** * This function calls the compress() diff --git a/deal.II/lac/include/lac/trilinos_block_vector.h b/deal.II/lac/include/lac/trilinos_block_vector.h index 4f25d2ed03..61547947b0 100644 --- a/deal.II/lac/include/lac/trilinos_block_vector.h +++ b/deal.II/lac/include/lac/trilinos_block_vector.h @@ -255,7 +255,7 @@ namespace TrilinosWrappers inline - BlockVector::BlockVector (const unsigned int num_blocks = 0) + BlockVector::BlockVector (const unsigned int num_blocks) { reinit (num_blocks); } diff --git a/deal.II/lac/include/lac/trilinos_precondition_amg.h b/deal.II/lac/include/lac/trilinos_precondition_amg.h index 1ecf569047..919fe922f9 100755 --- a/deal.II/lac/include/lac/trilinos_precondition_amg.h +++ b/deal.II/lac/include/lac/trilinos_precondition_amg.h @@ -98,11 +98,11 @@ namespace TrilinosWrappers * TrilinosWrappers::SparseMatrix. */ void initialize (const SparseMatrix &matrix, - const std::vector &null_space, - const unsigned int null_space_dimension, - const bool higher_order_elements, - const bool elliptic, - const bool output_details); + const bool elliptic = true, + const bool higher_order_elements = false, + const std::vector &null_space = std::vector(), + const unsigned int null_space_dimension = 1, + const bool output_details = false); /** * Let Trilinos compute a @@ -116,11 +116,11 @@ namespace TrilinosWrappers * inefficient. */ void initialize (const dealii::SparseMatrix &matrix, - const std::vector &null_space, - const unsigned int null_space_dimension, - const bool higher_order_elements, - const bool elliptic, - const bool output_details); + const bool elliptic = true, + const bool higher_order_elements = false, + const std::vector &null_space = std::vector(), + const unsigned int null_space_dimension = 1, + const bool output_details = false); /** * This function can be used diff --git a/deal.II/lac/include/lac/trilinos_sparse_matrix.h b/deal.II/lac/include/lac/trilinos_sparse_matrix.h index f3e432bc2a..3285cc6a63 100755 --- a/deal.II/lac/include/lac/trilinos_sparse_matrix.h +++ b/deal.II/lac/include/lac/trilinos_sparse_matrix.h @@ -442,7 +442,7 @@ namespace TrilinosWrappers */ void reinit (const Epetra_Map &input_map, const ::dealii::SparseMatrix &deal_ii_sparse_matrix, - const double drop_tolerance=1e-15); + const double drop_tolerance=1e-13); /** * This function is similar to the diff --git a/deal.II/lac/include/lac/trilinos_vector.h b/deal.II/lac/include/lac/trilinos_vector.h index a887ebc37d..7b9e151a6d 100755 --- a/deal.II/lac/include/lac/trilinos_vector.h +++ b/deal.II/lac/include/lac/trilinos_vector.h @@ -359,10 +359,14 @@ namespace TrilinosWrappers /** * Copy constructor. Sets the dimension * to that of the given vector and uses - * the map of that vector, and - * copies all elements. + * the map of that vector, but + * does not copies any element. Instead, + * the memory will remain untouched + * in case fast is false and + * initialized with zero otherwise. */ - Vector (const Vector &v); + Vector (const Vector &v, + const bool fast = false); /** * Destructor @@ -382,7 +386,8 @@ namespace TrilinosWrappers * copies the vector v to the current * one. */ - void reinit (const Vector &v); + void reinit (const Vector &v, + const bool fast = false); /** * Release all memory and return @@ -812,6 +817,13 @@ namespace TrilinosWrappers */ void swap (Vector &v); + /** + * Estimate for the memory + * consumption (not implemented + * for this class). + */ + unsigned int memory_consumption () const; + /** * Exception */ @@ -994,7 +1006,16 @@ namespace TrilinosWrappers { // if the vectors have different sizes, // then first resize the present one - reinit (v); + if (!map.SameAs(v.map)) + { + map = v.map; + vector = std::auto_ptr + (new Epetra_FEVector(*v.vector)); + } + else + *vector = *v.vector; + + last_action = Insert; return *this; } diff --git a/deal.II/lac/source/trilinos_block_sparse_matrix.cc b/deal.II/lac/source/trilinos_block_sparse_matrix.cc index 6d486470e8..08b3009734 100644 --- a/deal.II/lac/source/trilinos_block_sparse_matrix.cc +++ b/deal.II/lac/source/trilinos_block_sparse_matrix.cc @@ -51,6 +51,7 @@ namespace TrilinosWrappers } + void BlockSparseMatrix:: reinit (const unsigned int n_block_rows, @@ -85,7 +86,31 @@ namespace TrilinosWrappers } } - + + + void + BlockSparseMatrix:: + reinit (const std::vector &input_maps, + const BlockSparsityPattern &block_sparsity_pattern) + { + const unsigned int n_block_rows = input_maps.size(); + + // Call the other reinit function ... + reinit (n_block_rows, n_block_rows); + + // ... and now assign the correct + // blocks. + + for (unsigned int r=0; rn_block_rows(); ++r) + for (unsigned int c=0; cn_block_cols(); ++c) + { + this->block(r,c).reinit(input_maps[r],input_maps[c], + block_sparsity_pattern.block(r,c)); + } + } + + + void BlockSparseMatrix::compress() { diff --git a/deal.II/lac/source/trilinos_precondition_amg.cc b/deal.II/lac/source/trilinos_precondition_amg.cc index ca338ed565..5791c8a2fc 100755 --- a/deal.II/lac/source/trilinos_precondition_amg.cc +++ b/deal.II/lac/source/trilinos_precondition_amg.cc @@ -44,21 +44,13 @@ namespace TrilinosWrappers void PreconditionAMG:: initialize (const SparseMatrix &matrix, - const std::vector &null_space, - const unsigned int null_space_dimension, const bool elliptic, const bool higher_order_elements, + const std::vector &null_space, + const unsigned int null_space_dimension, const bool output_details) { const unsigned int n_rows = matrix.m(); - - if (!Matrix) - { - Matrix = boost::shared_ptr - (const_cast(&matrix)); - Map = boost::shared_ptr - (const_cast(&matrix.row_map)); - } // Build the AMG preconditioner. Teuchos::ParameterList parameter_list; @@ -76,6 +68,8 @@ namespace TrilinosWrappers parameter_list.set("aggregation: block scaling", true); } + parameter_list.set("aggregation: threshold", 1e-12); + if (output_details) parameter_list.set("ML output", 10); else @@ -84,12 +78,12 @@ namespace TrilinosWrappers if (higher_order_elements) parameter_list.set("aggregation: type", "MIS"); - Assert (n_rows * null_space_dimension == null_space.size(), - ExcDimensionMismatch(n_rows * null_space_dimension, - null_space.size())); - if (null_space_dimension > 1) { + Assert (n_rows * null_space_dimension == null_space.size(), + ExcDimensionMismatch(n_rows * null_space_dimension, + null_space.size())); + parameter_list.set("null space: type", "pre-computed"); parameter_list.set("null space: dimension", int(null_space_dimension)); parameter_list.set("null space: vectors", (double *)&null_space[0]); @@ -108,10 +102,10 @@ namespace TrilinosWrappers void PreconditionAMG:: initialize (const dealii::SparseMatrix &deal_ii_sparse_matrix, - const std::vector &null_space, - const unsigned int null_space_dimension, const bool elliptic, const bool higher_order_elements, + const std::vector &null_space, + const unsigned int null_space_dimension, const bool output_details) { const unsigned int n_rows = deal_ii_sparse_matrix.m(); @@ -127,8 +121,8 @@ namespace TrilinosWrappers Matrix->reinit (*Map, deal_ii_sparse_matrix); Matrix->compress(); - initialize (*Matrix, null_space, null_space_dimension, elliptic, - higher_order_elements, output_details); + initialize (*Matrix, elliptic, higher_order_elements, null_space, + null_space_dimension, output_details); } @@ -143,7 +137,8 @@ namespace TrilinosWrappers void PreconditionAMG::vmult (Vector &dst, const Vector &src) const { - const int ierr = multigrid_operator->ApplyInverse (*src.vector, *dst.vector); + const int ierr = multigrid_operator->ApplyInverse (*src.vector, + *dst.vector); Assert (ierr == 0, ExcTrilinosError(ierr)); } @@ -178,8 +173,10 @@ namespace TrilinosWrappers "a map that is not compatible. Check ML preconditioner " "setup.")); - Epetra_Vector LHS (View, *Map, dst.begin()); - Epetra_Vector RHS (View, *Map, const_cast(src.begin())); + Epetra_Vector LHS (View, multigrid_operator->OperatorDomainMap(), + dst.begin()); + Epetra_Vector RHS (View, multigrid_operator->OperatorDomainMap(), + const_cast(src.begin())); const int res = multigrid_operator->ApplyInverse (RHS, LHS); diff --git a/deal.II/lac/source/trilinos_vector.cc b/deal.II/lac/source/trilinos_vector.cc index c8c047f5dc..0c952be353 100755 --- a/deal.II/lac/source/trilinos_vector.cc +++ b/deal.II/lac/source/trilinos_vector.cc @@ -74,11 +74,12 @@ namespace TrilinosWrappers {} - Vector::Vector (const Vector &v) + Vector::Vector (const Vector &v, + const bool fast) : map (v.map), vector(std::auto_ptr - (new Epetra_FEVector(*(v.vector)))), + (new Epetra_FEVector(v.map,!fast))), last_action (Insert) {} @@ -102,14 +103,15 @@ namespace TrilinosWrappers void - Vector::reinit (const Vector &v) + Vector::reinit (const Vector &v, + const bool fast) { vector.reset(); if (!map.SameAs(v.map)) map = v.map; - vector = std::auto_ptr (new Epetra_FEVector(*v.vector)); + vector = std::auto_ptr (new Epetra_FEVector(v.map,!fast)); last_action = Insert; } @@ -794,6 +796,14 @@ namespace TrilinosWrappers vector = tmp; } + + unsigned int + Vector::memory_consumption () const + { + AssertThrow(false, ExcNotImplemented() ); + return 0; + } + } DEAL_II_NAMESPACE_CLOSE diff --git a/deal.II/lac/source/vector_memory.cc b/deal.II/lac/source/vector_memory.cc index 4284ba640e..6c9019a378 100644 --- a/deal.II/lac/source/vector_memory.cc +++ b/deal.II/lac/source/vector_memory.cc @@ -19,6 +19,8 @@ #include #include #include +#include +#include DEAL_II_NAMESPACE_OPEN @@ -100,4 +102,12 @@ Threads::ThreadMutex GrowingVectorMemory::mutex; template class GrowingVectorMemory; #endif +#ifdef DEAL_II_USE_TRILINOS + template class VectorMemory; + template class GrowingVectorMemory; + + template class VectorMemory; + template class GrowingVectorMemory; +#endif + DEAL_II_NAMESPACE_CLOSE