]> https://gitweb.dealii.org/ - dealii.git/commitdiff
MatrixFreeTools::compute_matrix() make it work for float 11704/head
authorPeter Munch <peterrmuench@gmail.com>
Sat, 6 Feb 2021 19:43:11 +0000 (20:43 +0100)
committerPeter Munch <peterrmuench@gmail.com>
Sat, 6 Feb 2021 19:43:11 +0000 (20:43 +0100)
include/deal.II/matrix_free/tools.h
tests/matrix_free/compute_diagonal_01.cc
tests/matrix_free/compute_diagonal_01.with_mpi=true.with_p4est=true.mpirun=1.output
tests/matrix_free/compute_diagonal_01.with_mpi=true.with_p4est=true.mpirun=3.output

index 99498540c7597a29bd475185a74c9558673469f5..55376a701ba4e1032b21deb8afbc75f07818d1cd 100644 (file)
@@ -628,6 +628,55 @@ namespace MatrixFreeTools
       first_selected_component);
   }
 
+  namespace internal
+  {
+    /**
+     * If value type of matrix and constrains equals, return a reference
+     * to the given AffineConstraint instance.
+     */
+    template <typename MatrixType,
+              typename Number,
+              typename std::enable_if<std::is_same<
+                typename std::remove_const<typename std::remove_reference<
+                  typename MatrixType::value_type>::type>::type,
+                typename std::remove_const<typename std::remove_reference<
+                  Number>::type>::type>::value>::type * = nullptr>
+    const AffineConstraints<typename MatrixType::value_type> &
+    create_new_affine_constraints_if_needed(
+      const MatrixType &,
+      const AffineConstraints<Number> &constraints,
+      std::unique_ptr<AffineConstraints<typename MatrixType::value_type>> &)
+    {
+      return constraints;
+    }
+
+    /**
+     * If value type of matrix and constrains do not equal, a new
+     * AffineConstraint instance with the value type of the matrix is
+     * created and a reference to it is returned.
+     */
+    template <typename MatrixType,
+              typename Number,
+              typename std::enable_if<!std::is_same<
+                typename std::remove_const<typename std::remove_reference<
+                  typename MatrixType::value_type>::type>::type,
+                typename std::remove_const<typename std::remove_reference<
+                  Number>::type>::type>::value>::type * = nullptr>
+    const AffineConstraints<typename MatrixType::value_type> &
+    create_new_affine_constraints_if_needed(
+      const MatrixType &,
+      const AffineConstraints<Number> &constraints,
+      std::unique_ptr<AffineConstraints<typename MatrixType::value_type>>
+        &new_constraints)
+    {
+      new_constraints =
+        std::make_unique<AffineConstraints<typename MatrixType::value_type>>();
+      new_constraints->copy_from(constraints);
+
+      return *new_constraints;
+    }
+  } // namespace internal
+
   template <int dim,
             int fe_degree,
             int n_q_points_1d,
@@ -637,9 +686,9 @@ namespace MatrixFreeTools
             typename MatrixType>
   void
   compute_matrix(
-    const MatrixFree<dim, Number, VectorizedArrayType> &            matrix_free,
-    const AffineConstraints<Number> &                               constraints,
-    MatrixType &                                                    matrix,
+    const MatrixFree<dim, Number, VectorizedArrayType> &matrix_free,
+    const AffineConstraints<Number> &                   constraints_in,
+    MatrixType &                                        matrix,
     const std::function<void(FEEvaluation<dim,
                                           fe_degree,
                                           n_q_points_1d,
@@ -650,6 +699,13 @@ namespace MatrixFreeTools
     const unsigned int                                              quad_no,
     const unsigned int first_selected_component)
   {
+    std::unique_ptr<AffineConstraints<typename MatrixType::value_type>>
+                                                              constraints_for_matrix;
+    const AffineConstraints<typename MatrixType::value_type> &constraints =
+      internal::create_new_affine_constraints_if_needed(matrix,
+                                                        constraints_in,
+                                                        constraints_for_matrix);
+
     matrix_free.template cell_loop<MatrixType, MatrixType>(
       [&](const auto &, auto &dst, const auto &, const auto range) {
         FEEvaluation<dim,
index 1a9d46ba9c1ef26140a3602e08754e41831aaa91..ffbdedf6b169eddfb2f1345161a2b78ebbdc4256 100644 (file)
@@ -47,8 +47,11 @@ test()
   AffineConstraints<Number> constraint;
   DoFTools::make_hanging_node_constraints(dof_handler, constraint);
 
-  VectorTools::interpolate_boundary_values(
-    dof_handler, 0, Functions::ZeroFunction<dim>(n_components), constraint);
+  VectorTools::interpolate_boundary_values(dof_handler,
+                                           0,
+                                           Functions::ZeroFunction<dim, Number>(
+                                             n_components),
+                                           constraint);
 
   constraint.close();
 
@@ -89,4 +92,7 @@ main(int argc, char **argv)
 
   test<2, 1, 2, 1>(); // scalar
   test<2, 1, 2, 2>(); // vector
+
+  test<2, 1, 2, 1, float>(); // scalar
+  test<2, 1, 2, 2, float>(); // vector
 }
index e0e5c3a0a5cd33f0e16d9ce1c62a7b1138b2584c..60689ac866f126f21dd09280912015e878879a33 100644 (file)
@@ -29,3 +29,33 @@ Local range: [0, 36), global size: 36
 Vector data:
 0.000e+00 0.000e+00 0.000e+00 0.000e+00 3.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
 DEAL:0::7.78888
+Process #0
+Local range: [0, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 3.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::7.78888
+Process #0
+Local range: [0, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 3.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::7.78888
+Process #0
+Local range: [0, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 3.000e+00 3.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:0::7.78888
index 7099f7da5c19b8539371ee6ed937c442fc37c54c..8fdfe585ea044cabab61421b307357792fff0b8b 100644 (file)
@@ -1,4 +1,34 @@
 
+Process #0
+Local range: [0, 9), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 3.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 9), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 3.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 9), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 3.000e+00 
+DEAL:0::5.50757
+Process #0
+Local range: [0, 18), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 3.000e+00 3.000e+00 
+DEAL:0::7.78888
+Process #0
+Local range: [0, 18), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 3.000e+00 3.000e+00 
+DEAL:0::7.78888
+Process #0
+Local range: [0, 18), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 3.000e+00 3.000e+00 
+DEAL:0::7.78888
 Process #0
 Local range: [0, 9), global size: 18
 Vector data:
@@ -60,6 +90,36 @@ Local range: [18, 22), global size: 36
 Vector data:
 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
 DEAL:1::7.78888
+Process #1
+Local range: [9, 11), global size: 18
+Vector data:
+0.000e+00 0.000e+00 
+DEAL:1::5.50757
+Process #1
+Local range: [9, 11), global size: 18
+Vector data:
+0.000e+00 0.000e+00 
+DEAL:1::5.50757
+Process #1
+Local range: [9, 11), global size: 18
+Vector data:
+0.000e+00 0.000e+00 
+DEAL:1::5.50757
+Process #1
+Local range: [18, 22), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:1::7.78888
+Process #1
+Local range: [18, 22), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:1::7.78888
+Process #1
+Local range: [18, 22), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:1::7.78888
 
 
 Process #2
@@ -92,4 +152,34 @@ Local range: [22, 36), global size: 36
 Vector data:
 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
 DEAL:2::7.78888
+Process #2
+Local range: [11, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::5.50757
+Process #2
+Local range: [11, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::5.50757
+Process #2
+Local range: [11, 18), global size: 18
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::5.50757
+Process #2
+Local range: [22, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::7.78888
+Process #2
+Local range: [22, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::7.78888
+Process #2
+Local range: [22, 36), global size: 36
+Vector data:
+0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 2.667e+00 2.667e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 
+DEAL:2::7.78888
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.