From 0bc683a79d8862978eea2d26e18b101d56d68b0f Mon Sep 17 00:00:00 2001 From: Bruno Turcksin Date: Fri, 9 Sep 2016 09:56:07 -0400 Subject: [PATCH] Instantiate LinearAlgebra::Vector. --- cmake/config/template-arguments.in | 6 ++++++ include/deal.II/lac/constraint_matrix.templates.h | 8 +++++++- include/deal.II/lac/la_parallel_vector.h | 2 +- include/deal.II/lac/la_vector.h | 6 ++++++ include/deal.II/lac/la_vector.templates.h | 15 +++++++++++++++ include/deal.II/lac/trilinos_epetra_vector.h | 4 ++++ include/deal.II/lac/vector_space_vector.h | 10 ++++++++++ include/deal.II/multigrid/multigrid.templates.h | 6 ++++-- .../deal.II/numerics/error_estimator.templates.h | 1 + include/deal.II/numerics/vector_tools.templates.h | 10 +++++++++- source/algorithms/operator.cc | 1 + source/dofs/dof_accessor_get.cc | 1 + source/dofs/dof_accessor_set.cc | 1 + source/fe/fe_tools_interpolate.cc | 3 ++- source/fe/fe_values.cc | 1 + source/fe/mapping_fe_field.cc | 1 + source/fe/mapping_q1_eulerian.cc | 5 +++-- source/fe/mapping_q_eulerian.cc | 1 + source/lac/constraint_matrix.cc | 1 + source/lac/solver.cc | 1 + source/lac/trilinos_epetra_vector.cc | 13 +++++++++++++ source/lac/vector_memory.cc | 1 + source/meshworker/mesh_worker_vector_selector.cc | 1 + source/multigrid/mg_base.cc | 1 + source/multigrid/multigrid.cc | 1 + source/numerics/data_out_dof_data.cc | 1 + source/numerics/derivative_approximation.cc | 1 + source/numerics/dof_output_operator.cc | 1 + source/numerics/error_estimator_1d.cc | 1 + source/numerics/fe_field_function.cc | 1 + source/numerics/point_value_history.cc | 1 + source/numerics/solution_transfer.cc | 1 + 32 files changed, 100 insertions(+), 8 deletions(-) diff --git a/cmake/config/template-arguments.in b/cmake/config/template-arguments.in index a9d69a2c2a..f2f37a3ecd 100644 --- a/cmake/config/template-arguments.in +++ b/cmake/config/template-arguments.in @@ -23,6 +23,9 @@ SERIAL_VECTORS := { Vector; BlockVector; BlockVector; + LinearAlgebra::Vector; + LinearAlgebra::Vector ; + LinearAlgebra::distributed::Vector; LinearAlgebra::distributed::Vector ; @@ -46,6 +49,9 @@ REAL_SERIAL_VECTORS := { Vector; BlockVector; BlockVector; + LinearAlgebra::Vector; + LinearAlgebra::Vector ; + LinearAlgebra::distributed::Vector; LinearAlgebra::distributed::Vector ; diff --git a/include/deal.II/lac/constraint_matrix.templates.h b/include/deal.II/lac/constraint_matrix.templates.h index 4d9da589f8..8c20a74d70 100644 --- a/include/deal.II/lac/constraint_matrix.templates.h +++ b/include/deal.II/lac/constraint_matrix.templates.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -851,7 +852,12 @@ ConstraintMatrix::distribute (VectorType &vec) const // call compress() finally. the first case here is for the complicated case, // the last else is for the simple case (sequential vector) const IndexSet vec_owned_elements = vec.locally_owned_elements(); - if (vec.supports_distributed_data == true) + if ((typeid(vec) != typeid(Vector)) && + (typeid(vec) != typeid(Vector)) && + (typeid(vec) != typeid(BlockVector)) && + (typeid(vec) != typeid(BlockVector)) && + (typeid(vec) != typeid(LinearAlgebra::Vector)) && + (typeid(vec) != typeid(LinearAlgebra::Vector))) { // This processor owns only part of the vector. one may think that // every processor should be able to simply communicate those elements diff --git a/include/deal.II/lac/la_parallel_vector.h b/include/deal.II/lac/la_parallel_vector.h index 8343077c6d..6c1c2a1582 100644 --- a/include/deal.II/lac/la_parallel_vector.h +++ b/include/deal.II/lac/la_parallel_vector.h @@ -890,7 +890,7 @@ namespace LinearAlgebra /** * Compute the mean value of all the entries in the vector. */ - Number mean_value () const; + virtual Number mean_value () const; /** * $l_p$-norm of the vector. The pth root of the sum of the pth powers diff --git a/include/deal.II/lac/la_vector.h b/include/deal.II/lac/la_vector.h index 5d82fcbbad..4d6b983039 100644 --- a/include/deal.II/lac/la_vector.h +++ b/include/deal.II/lac/la_vector.h @@ -54,6 +54,7 @@ namespace LinearAlgebra { public: typedef types::global_dof_index size_type; + typedef typename ReadWriteVector::value_type value_type; /** * Constructor. Create a vector of dimension zero. @@ -177,6 +178,11 @@ namespace LinearAlgebra */ virtual void equ(const Number a, const VectorSpaceVector &V); + /** + * Return the mean value of the element of this vector. + */ + virtual typename VectorSpaceVector::value_type mean_value() const; + /** * Return the l1 norm of the vector (i.e., the sum of the * absolute values of all entries). diff --git a/include/deal.II/lac/la_vector.templates.h b/include/deal.II/lac/la_vector.templates.h index 1166458b05..d109eb4e33 100644 --- a/include/deal.II/lac/la_vector.templates.h +++ b/include/deal.II/lac/la_vector.templates.h @@ -282,6 +282,21 @@ namespace LinearAlgebra + template + typename VectorSpaceVector::value_type Vector::mean_value() const + { + Assert (this->size(), ExcEmptyObject()); + + typedef typename VectorSpaceVector::real_type real_type; + value_type sum; + internal::MeanValue mean_value(this->val); + internal::parallel_reduce(mean_value, this->size(), sum, this->thread_loop_partitioner); + + return sum/static_cast(this->size()); + } + + + template typename VectorSpaceVector::real_type Vector::l1_norm() const { diff --git a/include/deal.II/lac/trilinos_epetra_vector.h b/include/deal.II/lac/trilinos_epetra_vector.h index ac40ce846f..f8239aae57 100644 --- a/include/deal.II/lac/trilinos_epetra_vector.h +++ b/include/deal.II/lac/trilinos_epetra_vector.h @@ -168,6 +168,10 @@ namespace LinearAlgebra */ virtual void equ(const double a, const VectorSpaceVector &V); + /** + * Return the mean value of the element of this vector. + */ + virtual double mean_value() const; /** * Return the l1 norm of the vector (i.e., the sum of the diff --git a/include/deal.II/lac/vector_space_vector.h b/include/deal.II/lac/vector_space_vector.h index de05d3e1e4..491104467f 100644 --- a/include/deal.II/lac/vector_space_vector.h +++ b/include/deal.II/lac/vector_space_vector.h @@ -128,6 +128,11 @@ namespace LinearAlgebra */ virtual void equ(const Number a, const VectorSpaceVector &V) = 0; + /** + * Return the mean value of the element of this vector. + */ + virtual value_type mean_value() const = 0; + /** * Return the l1 norm of the vector (i.e., the sum of the * absolute values of all entries among all processors). @@ -166,6 +171,11 @@ namespace LinearAlgebra const VectorSpaceVector &V, const VectorSpaceVector &W) = 0; + /** + * This function does nothing and only exists for backward compatibility. + */ + virtual void compress(VectorOperation::values) {} + /** * Return the global size of the vector, equal to the sum of the number of * locally owned indices among all processors. diff --git a/include/deal.II/multigrid/multigrid.templates.h b/include/deal.II/multigrid/multigrid.templates.h index e4f3befa50..0b9a562c01 100644 --- a/include/deal.II/multigrid/multigrid.templates.h +++ b/include/deal.II/multigrid/multigrid.templates.h @@ -279,7 +279,8 @@ Multigrid::level_step(const unsigned int level, // from two levels above in // defect2. This is subtracted from // the original defect. - t[level].equ(-1.,defect2[level],1.,defect[level]); + t[level].equ(-1.,defect2[level]); + t[level] += defect[level]; if (debug>2) deallog << cychar << "-cycle defect norm " << t[level].l2_norm() @@ -357,7 +358,8 @@ Multigrid::level_step(const unsigned int level, if (edge_up != 0) edge_up->Tvmult(level, t[level], solution[level-1]); - t[level].sadd(-1.,-1.,defect2[level],1.,defect[level]); + t[level].sadd(-1.,-1.,defect2[level]); + t[level] += defect[level]; if (debug>2) deallog << cychar << "-cycle Defect norm " << t[level].l2_norm() diff --git a/include/deal.II/numerics/error_estimator.templates.h b/include/deal.II/numerics/error_estimator.templates.h index 3bb11b7d20..e1d14072b9 100644 --- a/include/deal.II/numerics/error_estimator.templates.h +++ b/include/deal.II/numerics/error_estimator.templates.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/include/deal.II/numerics/vector_tools.templates.h b/include/deal.II/numerics/vector_tools.templates.h index 06dcfac1a1..eae1a44941 100644 --- a/include/deal.II/numerics/vector_tools.templates.h +++ b/include/deal.II/numerics/vector_tools.templates.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -68,6 +69,7 @@ #include #include #include +#include DEAL_II_NAMESPACE_OPEN @@ -7220,7 +7222,13 @@ namespace VectorTools else { // This function is not implemented for distributed vectors. - Assert(!v.supports_distributed_data, ExcNotImplemented()); + Assert(typeid(v) == typeid(Vector) || + typeid(v) == typeid(Vector) || + typeid(v) == typeid(BlockVector) || + typeid(v) == typeid(BlockVector) || + typeid(v) == typeid(LinearAlgebra::Vector) || + typeid(v) == typeid(LinearAlgebra::Vector), + ExcNotImplemented()); const unsigned int n = v.size(); diff --git a/source/algorithms/operator.cc b/source/algorithms/operator.cc index c147f2331c..9b6531b987 100644 --- a/source/algorithms/operator.cc +++ b/source/algorithms/operator.cc @@ -24,6 +24,7 @@ #include #include +#include #include #include #include diff --git a/source/dofs/dof_accessor_get.cc b/source/dofs/dof_accessor_get.cc index 2bc7ebe4bd..69c1046eec 100644 --- a/source/dofs/dof_accessor_get.cc +++ b/source/dofs/dof_accessor_get.cc @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/source/dofs/dof_accessor_set.cc b/source/dofs/dof_accessor_set.cc index 1748a5ffcf..109907a660 100644 --- a/source/dofs/dof_accessor_set.cc +++ b/source/dofs/dof_accessor_set.cc @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/source/fe/fe_tools_interpolate.cc b/source/fe/fe_tools_interpolate.cc index f95e4e2a05..170cd029d8 100644 --- a/source/fe/fe_tools_interpolate.cc +++ b/source/fe/fe_tools_interpolate.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -615,7 +616,7 @@ namespace FETools OutVector &u1_difference) { back_interpolate(dof1, constraints1, u1, dof2, constraints2, u1_difference); - u1_difference.sadd(-1, u1); + u1_difference.sadd(-1., 1., u1); } // special version for Trilinos diff --git a/source/fe/fe_values.cc b/source/fe/fe_values.cc index 5c5f0d8238..321916430e 100644 --- a/source/fe/fe_values.cc +++ b/source/fe/fe_values.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/source/fe/mapping_fe_field.cc b/source/fe/mapping_fe_field.cc index 9f0c632616..754c144111 100644 --- a/source/fe/mapping_fe_field.cc +++ b/source/fe/mapping_fe_field.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include diff --git a/source/fe/mapping_q1_eulerian.cc b/source/fe/mapping_q1_eulerian.cc index 927edbcd10..939cee24fc 100644 --- a/source/fe/mapping_q1_eulerian.cc +++ b/source/fe/mapping_q1_eulerian.cc @@ -17,8 +17,9 @@ #include #include #include -#include -#include +#include +#include +#include #include #include #include diff --git a/source/fe/mapping_q_eulerian.cc b/source/fe/mapping_q_eulerian.cc index 0e7ffc820e..3b014ff336 100644 --- a/source/fe/mapping_q_eulerian.cc +++ b/source/fe/mapping_q_eulerian.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/source/lac/constraint_matrix.cc b/source/lac/constraint_matrix.cc index 6a5f5a3af1..db04b3a4d2 100644 --- a/source/lac/constraint_matrix.cc +++ b/source/lac/constraint_matrix.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/source/lac/solver.cc b/source/lac/solver.cc index d7d803fba8..fddc9db18d 100644 --- a/source/lac/solver.cc +++ b/source/lac/solver.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/source/lac/trilinos_epetra_vector.cc b/source/lac/trilinos_epetra_vector.cc index 58d3bae0f1..8998d7c59d 100644 --- a/source/lac/trilinos_epetra_vector.cc +++ b/source/lac/trilinos_epetra_vector.cc @@ -352,6 +352,19 @@ namespace LinearAlgebra + double Vector::mean_value() const + { + double mean_value(0.); + + int ierr = vector->MeanValue(&mean_value); + Assert(ierr==0, ExcTrilinosError(ierr)); + (void) ierr; + + return mean_value; + } + + + double Vector::l1_norm() const { double norm(0.); diff --git a/source/lac/vector_memory.cc b/source/lac/vector_memory.cc index 5330c0365e..097db04807 100644 --- a/source/lac/vector_memory.cc +++ b/source/lac/vector_memory.cc @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/source/meshworker/mesh_worker_vector_selector.cc b/source/meshworker/mesh_worker_vector_selector.cc index 111572ef51..c230085686 100644 --- a/source/meshworker/mesh_worker_vector_selector.cc +++ b/source/meshworker/mesh_worker_vector_selector.cc @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/source/multigrid/mg_base.cc b/source/multigrid/mg_base.cc index 64c3f71cbc..a2a0d7354c 100644 --- a/source/multigrid/mg_base.cc +++ b/source/multigrid/mg_base.cc @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/source/multigrid/multigrid.cc b/source/multigrid/multigrid.cc index 33658dcee1..dd69a7a25d 100644 --- a/source/multigrid/multigrid.cc +++ b/source/multigrid/multigrid.cc @@ -15,6 +15,7 @@ #include +#include #include #include #include diff --git a/source/numerics/data_out_dof_data.cc b/source/numerics/data_out_dof_data.cc index 6f424b6ec2..c28967aeac 100644 --- a/source/numerics/data_out_dof_data.cc +++ b/source/numerics/data_out_dof_data.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/source/numerics/derivative_approximation.cc b/source/numerics/derivative_approximation.cc index 3b32bc1fbf..a7c0a00004 100644 --- a/source/numerics/derivative_approximation.cc +++ b/source/numerics/derivative_approximation.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/source/numerics/dof_output_operator.cc b/source/numerics/dof_output_operator.cc index ce11b428a6..4905f1302e 100644 --- a/source/numerics/dof_output_operator.cc +++ b/source/numerics/dof_output_operator.cc @@ -22,6 +22,7 @@ #include #include +#include #include #include #include diff --git a/source/numerics/error_estimator_1d.cc b/source/numerics/error_estimator_1d.cc index 88e335fcd9..033573ce55 100644 --- a/source/numerics/error_estimator_1d.cc +++ b/source/numerics/error_estimator_1d.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/source/numerics/fe_field_function.cc b/source/numerics/fe_field_function.cc index 3117a90d8c..25b045206e 100644 --- a/source/numerics/fe_field_function.cc +++ b/source/numerics/fe_field_function.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include #include diff --git a/source/numerics/point_value_history.cc b/source/numerics/point_value_history.cc index ee6cf4ad26..9af330e56f 100644 --- a/source/numerics/point_value_history.cc +++ b/source/numerics/point_value_history.cc @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/source/numerics/solution_transfer.cc b/source/numerics/solution_transfer.cc index 77deb0f9eb..a07d3df637 100644 --- a/source/numerics/solution_transfer.cc +++ b/source/numerics/solution_transfer.cc @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include -- 2.39.5