Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove VectorSpaceVector. #3073

Closed
kalj opened this issue Sep 6, 2016 · 6 comments · Fixed by #15688
Closed

Remove VectorSpaceVector. #3073

kalj opened this issue Sep 6, 2016 · 6 comments · Fixed by #15688

Comments

@kalj
Copy link
Contributor

kalj commented Sep 6, 2016

What are the plans for how to solve operations on a VectorSpaceVector that internally needs to access individual elements? Although we want to hide explicit access of individual elements from the outside, we certainly need to do so inside some operations, such as a sparse-matrix vector product. As I see it, the natural way to do this would be to let SparseMatrix be a friend to the vector classes. Are there any other superior solutions?

I am working on a sparse matrix implementation for GPU, and there the vmult operation needs to extract the underlying data pointer and pass it to a CUDA kernel. Also this would be solved by a friend relation.

@bangerth
Copy link
Member

bangerth commented Sep 8, 2016

I haven't given this much thought so far. Somehow, the vector class will need to make the information available to the matrix class, or the other way around. This can happen by granting access to the underlying representation of the data, or by making the matrix class a friend. I'm much more in favor of the second option, given that it limits knowledge of the exact data format to a small and easily findable list of other classes, rather than exporting knowledge of the underlying data storage to everyone.

@bangerth
Copy link
Member

bangerth commented Jul 2, 2023

I've looked through our classes, and the way I see it is that we have not made use of VectorSpaceVector at all. Some vector classes (but not all) inherit from VectorSpaceVector:

> grep -r 'VectorSpaceVector' include/ | grep public
include/deal.II/lac/cuda_vector.h:    class Vector : public VectorSpaceVector<Number>
include/deal.II/lac/la_parallel_vector.h:    class Vector : public ::dealii::LinearAlgebra::VectorSpaceVector<Number>,
include/deal.II/lac/trilinos_tpetra_vector.h:    class Vector : public VectorSpaceVector<Number>,
include/deal.II/lac/la_parallel_block_vector.h:                        public VectorSpaceVector<Number>
include/deal.II/lac/la_vector.h:                 public VectorSpaceVector<Number>
include/deal.II/lac/trilinos_epetra_vector.h:    class Vector : public VectorSpaceVector<double>,

But the thing is that nothing outside the vector classes actually uses VectorSpaceVector:

> al.II/base/partitioner.h:       * VectorSpaceVector object. The second argument
include/deal.II/lac/trilinos_tpetra_communication_pattern.h:       * VectorSpaceVector object. The second argument @p
include/deal.II/lac/trilinos_epetra_communication_pattern.h:       * VectorSpaceVector object. The second argument @p
include/deal.II/lac/la_parallel_block_vector.templates.h:    BlockVector<Number>::reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_block_vector.templates.h:    BlockVector<Number>::scale(const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:                             const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:    BlockVector<Number>::operator+=(const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:    BlockVector<Number>::operator-=(const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:                             const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:                             const VectorSpaceVector<Number> &vv,
include/deal.II/lac/la_parallel_block_vector.templates.h:                             const VectorSpaceVector<Number> &ww)
include/deal.II/lac/la_parallel_block_vector.templates.h:                              const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_block_vector.templates.h:    BlockVector<Number>::operator*(const VectorSpaceVector<Number> &vv) const
include/deal.II/lac/la_parallel_block_vector.templates.h:                                     const VectorSpaceVector<Number> &vv,
include/deal.II/lac/la_parallel_block_vector.templates.h:                                     const VectorSpaceVector<Number> &ww)
include/deal.II/lac/cuda_vector.h:     * class is derived from the LinearAlgebra::VectorSpaceVector class.
include/deal.II/lac/cuda_vector.h:      using value_type = typename VectorSpaceVector<Number>::value_type;
include/deal.II/lac/cuda_vector.h:      using size_type  = typename VectorSpaceVector<Number>::size_type;
include/deal.II/lac/cuda_vector.h:      using real_type  = typename VectorSpaceVector<Number>::real_type;
include/deal.II/lac/cuda_vector.h:      reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/cuda_vector.h:      operator+=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/cuda_vector.h:      operator-=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/cuda_vector.h:      operator*(const VectorSpaceVector<Number> &V) const override;
include/deal.II/lac/cuda_vector.h:      add(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/cuda_vector.h:          const VectorSpaceVector<Number> &V,
include/deal.II/lac/cuda_vector.h:          const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/cuda_vector.h:           const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/cuda_vector.h:      scale(const VectorSpaceVector<Number> &scaling_factors) override;
include/deal.II/lac/cuda_vector.h:      equ(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/cuda_vector.h:                  const VectorSpaceVector<Number> &V,
include/deal.II/lac/cuda_vector.h:                  const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::operator+=(const VectorSpaceVector<Number> &V)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::operator-=(const VectorSpaceVector<Number> &V)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::operator*(const VectorSpaceVector<Number> &V) const
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::add(const Number a, const VectorSpaceVector<Number> &V)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:                        const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.templates.h:                        const VectorSpaceVector<Number> &W)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:                         const VectorSpaceVector<Number> &V)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::scale(const VectorSpaceVector<Number> &scaling_factors)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    Vector<Number>::equ(const Number a, const VectorSpaceVector<Number> &V)
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.templates.h:    typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.templates.h:                                const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.templates.h:                                const VectorSpaceVector<Number> &W)
include/deal.II/lac/la_parallel_vector.h:       * @name 3: Implementation of VectorSpaceVector
include/deal.II/lac/la_parallel_vector.h:      reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_vector.h:      operator+=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_vector.h:      operator-=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_vector.h:      operator*(const VectorSpaceVector<Number> &V) const override;
include/deal.II/lac/la_parallel_vector.h:      add(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_vector.h:          const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_vector.h:          const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/la_parallel_vector.h:           const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_vector.h:      scale(const VectorSpaceVector<Number> &scaling_factors) override;
include/deal.II/lac/la_parallel_vector.h:      equ(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_vector.h:                  const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_vector.h:                  const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/la_parallel_vector.h:       * @name 4: Other vector operations not included in VectorSpaceVector
include/deal.II/lac/la_parallel_vector.h:      add_local(const Number a, const VectorSpaceVector<Number> &V);
include/deal.II/lac/la_parallel_vector.h:                 const VectorSpaceVector<Number> &V);
include/deal.II/lac/trilinos_tpetra_vector.h:     * LinearAlgebra::VectorSpaceVector class and requires Trilinos to be
include/deal.II/lac/trilinos_tpetra_vector.h:      using size_type = typename VectorSpaceVector<Number>::size_type;
include/deal.II/lac/trilinos_tpetra_vector.h:      reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.h:      operator+=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/trilinos_tpetra_vector.h:      operator-=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/trilinos_tpetra_vector.h:      operator*(const VectorSpaceVector<Number> &V) const override;
include/deal.II/lac/trilinos_tpetra_vector.h:      add(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/trilinos_tpetra_vector.h:          const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.h:          const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/trilinos_tpetra_vector.h:           const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/trilinos_tpetra_vector.h:      scale(const VectorSpaceVector<Number> &scaling_factors) override;
include/deal.II/lac/trilinos_tpetra_vector.h:      equ(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/trilinos_tpetra_vector.h:      virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.h:      virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.h:      virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
include/deal.II/lac/trilinos_tpetra_vector.h:                  const VectorSpaceVector<Number> &V,
include/deal.II/lac/trilinos_tpetra_vector.h:                  const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/la_parallel_vector.templates.h:    Vector<Number, MemorySpaceType>::reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:                                         const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:                                         const VectorSpaceVector<Number> &vv,
include/deal.II/lac/la_parallel_vector.templates.h:                                         const VectorSpaceVector<Number> &ww)
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:                                          const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:    Vector<Number, MemorySpaceType>::scale(const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:                                         const VectorSpaceVector<Number> &vv)
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv) const
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &vv,
include/deal.II/lac/la_parallel_vector.templates.h:      const VectorSpaceVector<Number> &ww)
include/deal.II/lac/la_parallel_block_vector.h:       * @name 2: Implementation of VectorSpaceVector
include/deal.II/lac/la_parallel_block_vector.h:      reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_block_vector.h:      operator+=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_block_vector.h:      operator-=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_block_vector.h:      operator*(const VectorSpaceVector<Number> &V) const override;
include/deal.II/lac/la_parallel_block_vector.h:      add(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_block_vector.h:          const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_block_vector.h:          const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/la_parallel_block_vector.h:           const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_block_vector.h:      scale(const VectorSpaceVector<Number> &scaling_factors) override;
include/deal.II/lac/la_parallel_block_vector.h:      equ(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_parallel_block_vector.h:                  const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_parallel_block_vector.h:                  const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/petsc_vector_base.h:     * with other classes inheriting from VectorSpaceVector. If you need to
include/deal.II/lac/petsc_vector_base.h:     * with other classes inheriting from VectorSpaceVector. If you need to
include/deal.II/lac/petsc_vector_base.h:     * with other classes inheriting from VectorSpaceVector.
include/deal.II/lac/la_vector.h: * The different vector classes are derived from VectorSpaceVector to provide
include/deal.II/lac/la_vector.h: * VectorSpaceVector and element access through ReadWriteVector are by design
include/deal.II/lac/la_vector.h:   * ::dealii::LinearAlgebra::VectorSpaceVector. As opposed to the array of
include/deal.II/lac/la_vector.h:    reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.h:    operator+=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_vector.h:    operator-=(const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_vector.h:    operator*(const VectorSpaceVector<Number> &V) const override;
include/deal.II/lac/la_vector.h:    add(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_vector.h:        const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.h:        const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/la_vector.h:         const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_vector.h:    scale(const VectorSpaceVector<Number> &scaling_factors) override;
include/deal.II/lac/la_vector.h:    equ(const Number a, const VectorSpaceVector<Number> &V) override;
include/deal.II/lac/la_vector.h:    virtual typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.h:    virtual typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.h:    virtual typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.h:                const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.h:                const VectorSpaceVector<Number> &W) override;
include/deal.II/lac/vector_space_vector.h:   * VectorSpaceVector is an abstract class that is used to define the
include/deal.II/lac/vector_space_vector.h:  class VectorSpaceVector
include/deal.II/lac/vector_space_vector.h:    reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/vector_space_vector.h:    virtual VectorSpaceVector<Number> &
include/deal.II/lac/vector_space_vector.h:    virtual VectorSpaceVector<Number> &
include/deal.II/lac/vector_space_vector.h:    virtual VectorSpaceVector<Number> &
include/deal.II/lac/vector_space_vector.h:    virtual VectorSpaceVector<Number> &
include/deal.II/lac/vector_space_vector.h:    operator+=(const VectorSpaceVector<Number> &V) = 0;
include/deal.II/lac/vector_space_vector.h:    virtual VectorSpaceVector<Number> &
include/deal.II/lac/vector_space_vector.h:    operator-=(const VectorSpaceVector<Number> &V) = 0;
include/deal.II/lac/vector_space_vector.h:    operator*(const VectorSpaceVector<Number> &V) const = 0;
include/deal.II/lac/vector_space_vector.h:    add(const Number a, const VectorSpaceVector<Number> &V) = 0;
include/deal.II/lac/vector_space_vector.h:        const VectorSpaceVector<Number> &V,
include/deal.II/lac/vector_space_vector.h:        const VectorSpaceVector<Number> &W) = 0;
include/deal.II/lac/vector_space_vector.h:         const VectorSpaceVector<Number> &V) = 0;
include/deal.II/lac/vector_space_vector.h:    scale(const VectorSpaceVector<Number> &scaling_factors) = 0;
include/deal.II/lac/vector_space_vector.h:    equ(const Number a, const VectorSpaceVector<Number> &V) = 0;
include/deal.II/lac/vector_space_vector.h:                const VectorSpaceVector<Number> &V,
include/deal.II/lac/vector_space_vector.h:                const VectorSpaceVector<Number> &W) = 0;
include/deal.II/lac/vector_space_vector.h:    virtual ~VectorSpaceVector() = default;
include/deal.II/lac/vector_space_vector.h:  set_zero_mean_value(VectorSpaceVector<Number> &vector)
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::reinit(const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::operator+=(const VectorSpaceVector<Number> &V)
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::operator-=(const VectorSpaceVector<Number> &V)
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::operator*(const VectorSpaceVector<Number> &V) const
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::add(const Number a, const VectorSpaceVector<Number> &V)
include/deal.II/lac/la_vector.templates.h:                      const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.templates.h:                      const VectorSpaceVector<Number> &W)
include/deal.II/lac/la_vector.templates.h:                       const VectorSpaceVector<Number> &V)
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::scale(const VectorSpaceVector<Number> &scaling_factors)
include/deal.II/lac/la_vector.templates.h:  Vector<Number>::equ(const Number a, const VectorSpaceVector<Number> &V)
include/deal.II/lac/la_vector.templates.h:    using real_type = typename VectorSpaceVector<Number>::real_type;
include/deal.II/lac/la_vector.templates.h:  typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.templates.h:    using real_type = typename VectorSpaceVector<Number>::real_type;
include/deal.II/lac/la_vector.templates.h:  typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.templates.h:    using real_type = typename VectorSpaceVector<Number>::real_type;
include/deal.II/lac/la_vector.templates.h:  typename VectorSpaceVector<Number>::real_type
include/deal.II/lac/la_vector.templates.h:                              const VectorSpaceVector<Number> &V,
include/deal.II/lac/la_vector.templates.h:                              const VectorSpaceVector<Number> &W)
include/deal.II/lac/read_write_vector.h:   * from VectorSpaceVector such as TrilinosWrappers::MPI::Vector and
include/deal.II/lac/trilinos_epetra_vector.h:     * LinearAlgebra::VectorSpaceVector class. Note however that Epetra only
include/deal.II/lac/trilinos_epetra_vector.h:      reinit(const VectorSpaceVector<double> &V,
include/deal.II/lac/trilinos_epetra_vector.h:      operator+=(const VectorSpaceVector<double> &V) override;
include/deal.II/lac/trilinos_epetra_vector.h:      operator-=(const VectorSpaceVector<double> &V) override;
include/deal.II/lac/trilinos_epetra_vector.h:      operator*(const VectorSpaceVector<double> &V) const override;
include/deal.II/lac/trilinos_epetra_vector.h:      add(const double a, const VectorSpaceVector<double> &V) override;
include/deal.II/lac/trilinos_epetra_vector.h:          const VectorSpaceVector<double> &V,
include/deal.II/lac/trilinos_epetra_vector.h:          const VectorSpaceVector<double> &W) override;
include/deal.II/lac/trilinos_epetra_vector.h:           const VectorSpaceVector<double> &V) override;
include/deal.II/lac/trilinos_epetra_vector.h:      scale(const VectorSpaceVector<double> &scaling_factors) override;
include/deal.II/lac/trilinos_epetra_vector.h:      equ(const double a, const VectorSpaceVector<double> &V) override;
include/deal.II/lac/trilinos_epetra_vector.h:                  const VectorSpaceVector<double> &V,
include/deal.II/lac/trilinos_epetra_vector.h:                  const VectorSpaceVector<double> &W) override;

I think what this means is that the only places where we reference these functions is inside the vector classes themselves, and I suspect that in many of the implementations of these functions, we just cast to the current class right away. Like here in the epetra vector classes:

    void
    Vector::reinit(const VectorSpaceVector<double> &V,
                   const bool                       omit_zeroing_entries)
    {
      // Check that casting will work.
      Assert(dynamic_cast<const Vector *>(&V) != nullptr,
             ExcVectorTypeNotCompatible());

      // Downcast V. If fails, throws an exception.
      const Vector &down_V = dynamic_cast<const Vector &>(V);

      reinit(down_V.locally_owned_elements(),
             down_V.get_mpi_communicator(),
             omit_zeroing_entries);
    }

Since I'm not seeing any uses, I suspect that we can just remove VectorSpaceVector. What do people think about that?

@drwells
Copy link
Member

drwells commented Jul 3, 2023

I missed this comment yesterday and said the same thing this morning - yes, lets remove this class.

@bangerth
Copy link
Member

bangerth commented Jul 3, 2023

We decided this morning to just nuke VectorSpaceVector, without deprecation.

@drwells
Copy link
Member

drwells commented Jul 3, 2023

Should we remove the LinearAlgebra::Vector class without deprecating it first? According to #1800 we originally planned on that class becoming our standard serial vector but that hasn't happened.

@bangerth
Copy link
Member

bangerth commented Jul 3, 2023

@drwells That seems reasonable to me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants