MatrixTools::apply_boundary_values for BlockSparseMatrix<std::complex<double>> and BlockVector<std::complex<double>> entries

104 views
Skip to first unread message

Мария Бронзова

unread,
Sep 14, 2021, 7:30:25 AM9/14/21
to deal.II User Group
Hi everyone,

I ran into the following difficulty: I have a vector-valued problem with complex numbers as entries for my BlockSparseMatrix system_matrix and BlockVector system_rhs and solution vectors and I am trying to apply Dirichlet boundary conditions, using the MatrixTools::apply_boundary_values(boundary_values, system_matrix, solution, system_rhs) function. 

The compiler is complaining, indicating the error: no matching function for call to ‘apply_boundary_values(std::map<unsigned int, double>&, dealii::BlockSparseMatrix<std::complex<double> >&, dealii::BlockVector<std::complex<double> >&, dealii::BlockVector<std::complex<double> >&)’.

Is it not possible to use the function for complex-values systems?

Thank you!

Kind regards,
Mariia

Daniel Arndt

unread,
Sep 14, 2021, 10:33:44 AM9/14/21
to dea...@googlegroups.com
Mariia,

You need to make sure that the std::map also uses values of type std::complex<double>. The compile error you shared shows that you use doubles.

Best,
Daniel

--
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en
---
You received this message because you are subscribed to the Google Groups "deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dealii+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/dealii/aa6ad6fa-7404-4617-bff3-3f108d2b6001n%40googlegroups.com.
Message has been deleted

Мария Бронзова

unread,
Sep 15, 2021, 9:10:31 AM9/15/21
to deal.II User Group
Dear Daniel, 

Thank you a lot for the hint, it makes perfect sense! I also correctted the interpolate_boundary_values call as follows: 

template <int dim>
  class DirichletBoundaryValues : public Function<dim, std::complex<double>>
  {
  public:
 DirichletBoundaryValues()
   : Function<dim, std::complex<double>>(1)
      {}
 virtual std::complex<double> value(const Point<dim> &p,
        const unsigned int component = 1) const override;
  };

  template <int dim>
  std::complex<double> DirichletBoundaryValues<dim>::value(const Point<dim> & p,
              const unsigned int /*component*/) const
  {
 const std::complex<double> i = {0,1};
 return i;
  }

 

 FEValuesExtractors::Scalar pressures(dim);
    std::map<types::global_dof_index, std::complex<double>> boundary_values;
    VectorTools::interpolate_boundary_values(dof_handler,
    1,
DirichletBoundaryValues<dim>(),
boundary_values,
fe.component_mask(pressures));
    MatrixTools::apply_boundary_values(boundary_values,
  system_matrix,
  solution,
  system_rhs);

And now getting the following error:
undefined reference to 'void dealii::MatrixTools::apply_boundary_values<std::complex<double> >(std::map<unsigned int, std::complex<double>, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::complex<double> > > > const&, dealii::BlockSparseMatrix<std::complex<double> >&, dealii::BlockVector<std::complex<double> >&, dealii::BlockVector<std::complex<double> >&, bool)'

I am a bit lost, what it could be connected to. Would appreciate any hints!

Thank you a lot for your time!

Kind regards,
Mariia Bronzova

вторник, 14 сентября 2021 г. в 16:33:44 UTC+2, d.arnd...@gmail.com:

Daniel Arndt

unread,
Sep 15, 2021, 10:56:41 AM9/15/21
to dea...@googlegroups.com
Mariia,

That's a problem a little more complicated to solve. Basically, we are not instantiating the template for complex<double> and BlockSparseMatrix.
If you are OK with recompiling deal.II, you should modify source/numerics/matrix_tools.inst.in so that all overloads are also compiled for complex numbers.

Best,
Daniel

Мария Бронзова

unread,
Sep 17, 2021, 6:25:26 AM9/17/21
to deal.II User Group
Dear Daniel,

Thank you a lot for the solution ways! I was trying to modify the /dealii-9.3.1/source/numerics/matrix_tools.inst.in as follows:

// ---------------------------------------------------------------------
//
// Copyright (C) 2010 - 2018 by the deal.II authors
//
// This file is part of the deal.II library.
//
// The deal.II library is free software; you can use it, redistribute
// it, and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// The full text of the license can be found in the file LICENSE.md at
// the top level directory of deal.II.
//
// ---------------------------------------------------------------------

for (number : REAL_SCALARS)
  {
    template void MatrixTools::local_apply_boundary_values(
      const std::map<types::global_dof_index, number> &boundary_values,
      const std::vector<types::global_dof_index> &     local_dof_indices,
      FullMatrix<number> &                             local_matrix,
      Vector<number> &                                 local_rhs,
      const bool                                       eliminate_columns);

    template void MatrixTools::apply_boundary_values(
      const std::map<types::global_dof_index, number> &boundary_values,
      SparseMatrix<number> &                           matrix,
      Vector<number> &                                 solution,
      Vector<number> &                                 right_hand_side,
      const bool                                       eliminate_columns);

    template void MatrixTools::apply_boundary_values(
      const std::map<types::global_dof_index, number> &boundary_values,
      BlockSparseMatrix<number> &                      matrix,
      BlockVector<number> &                            solution,
      BlockVector<number> &                            right_hand_side,
      const bool                                       eliminate_columns);
  }

for (number : COMPLEX_SCALARS)
  {
    template void MatrixTools::apply_boundary_values(
      const std::map<types::global_dof_index, number> &boundary_values,
      SparseMatrix<number> &                           matrix,
      Vector<number> &                                 solution,
      Vector<number> &                                 right_hand_side,
      const bool                                       eliminate_columns);
      
    template void MatrixTools::apply_boundary_values(
      const std::map<types::global_dof_index, number> &boundary_values,
      BlockSparseMatrix<number> &                      matrix,
      BlockVector<number> &                            solution,
      BlockVector<number> &                            right_hand_side,
      const bool                                       eliminate_columns);
  }

Then I recompiled everything and got the error:  

/home/mariia/Downloads/dealii-9.3.1/source/numerics/matrix_tools.cc:364:49: error: no match for ‘operator!=’ (operand types are ‘std::complex<float>’ and ‘double’)
  364 |               .diag_element(block_index.second) != 0.0)
In file included from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/base/parallel.h:23,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/base/aligned_vector.h:25,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/base/table.h:21,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/lac/block_sparsity_pattern.h:25,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/lac/sparsity_tools.h:24,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/base/graph_coloring.h:25,
                 from /home/mariia/Downloads/dealii-9.3.1/include/deal.II/base/work_stream.h:22,
                 from /home/mariia/Downloads/dealii-9.3.1/source/numerics/matrix_tools.cc:19:
..................
make[2]: *** [source/numerics/CMakeFiles/obj_numerics_release.dir/build.make:188: source/numerics/CMakeFiles/obj_numerics_release.dir/matrix_tools.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:3269: source/numerics/CMakeFiles/obj_numerics_release.dir/all] Error 2
make: *** [Makefile:136: all] Error 2


I am a bit confused, what else needs to be adjusted may be in the matrix_tools.cc. I would greatly appreciate help here.

Thank you for your time!

With kind regards,
Mariia


среда, 15 сентября 2021 г. в 16:56:41 UTC+2, d.arnd...@gmail.com:

Daniel Arndt

unread,
Sep 17, 2021, 12:23:42 PM9/17/21
to dea...@googlegroups.com
Mariia,

I also tried fixing this within deal.II and discovered that some more changes are necessary, see https://github.com/dealii/dealii/pull/12761. Would you mind checking if the changes proposed there work for you?

Best,
Daniel

Мария Бронзова

unread,
Sep 20, 2021, 4:33:39 PM9/20/21
to deal.II User Group
Dear Daniel,

Thank you many time, I changed the source files, as suggested, and recompiled the whole thing again. Now it seems to be working!

Thank you again!

With kind regards,
Mariia Bronzova

пятница, 17 сентября 2021 г. в 18:23:42 UTC+2, d.arnd...@gmail.com:
Reply all
Reply to author
Forward
0 new messages