From 04d7ad07ed0f6f7b3848bc302a23b84435d50f46 Mon Sep 17 00:00:00 2001
From: kormann
Date: Sat, 5 May 2012 15:11:20 +0000
Subject: [PATCH] Merge branch with matrix-free computations. Until r25443.
git-svn-id: https://svn.dealii.org/trunk@25492 0785d39b-7218-0410-832d-ea1e28bc413d
---
deal.II/aclocal.m4 | 275 +-
deal.II/common/Make.global_options.in | 3 +
deal.II/configure | 357 +-
deal.II/configure.in | 11 +-
deal.II/doc/doxygen/tutorial/navbar.html | 12 +-
deal.II/doc/doxygen/tutorial/steps.cmapx | 88 +-
deal.II/doc/doxygen/tutorial/steps.pl | 4 +-
deal.II/doc/doxygen/tutorial/steps.png | Bin 87675 -> 94716 bytes
deal.II/doc/doxygen/tutorial/toc-list.html | 13 +
deal.II/doc/doxygen/tutorial/toc-topics.html | 21 +-
deal.II/examples/step-25/doc/results.dox | 20 +-
deal.II/examples/step-37/Makefile | 16 +
deal.II/examples/step-37/doc/intro.dox | 425 +-
deal.II/examples/step-37/doc/results.dox | 423 +-
.../examples/step-37/doc/step-37.solution.png | Bin 0 -> 147968 bytes
deal.II/examples/step-37/doc/tooltip | 2 +-
deal.II/examples/step-37/step-37.cc | 2878 ++++----
deal.II/examples/step-48/Makefile | 143 +
deal.II/examples/step-48/doc/builds-on | 1 +
deal.II/examples/step-48/doc/intro.dox | 171 +
deal.II/examples/step-48/doc/kind | 1 +
deal.II/examples/step-48/doc/results.dox | 174 +
deal.II/examples/step-48/doc/tooltip | 1 +
deal.II/examples/step-48/step-48.cc | 768 +++
deal.II/include/deal.II/base/config.h.in | 7 +-
deal.II/include/deal.II/base/parallel.h | 132 +-
deal.II/include/deal.II/base/point.h | 2 +-
.../deal.II/base/std_cxx1x/type_traits.h | 63 +
.../include/deal.II/base/symmetric_tensor.h | 48 +-
deal.II/include/deal.II/base/tensor.h | 40 +-
deal.II/include/deal.II/base/tensor_base.h | 4 +-
deal.II/include/deal.II/base/vectorization.h | 2138 ++++++
deal.II/include/deal.II/lac/full_matrix.h | 45 +
deal.II/include/deal.II/lac/parallel_vector.h | 20 +-
.../deal.II/lac/parallel_vector.templates.h | 33 +
.../include/deal.II/matrix_free/dof_info.h | 584 ++
.../deal.II/matrix_free/dof_info.templates.h | 2016 ++++++
.../deal.II/matrix_free/fe_evaluation.h | 5776 +++++++++++++++++
.../deal.II/matrix_free/fe_evaluation_data.h | 188 +
.../fe_evaluation_data.templates.h | 265 +
.../deal.II/matrix_free/helper_functions.h | 393 ++
.../deal.II/matrix_free/mapping_info.h | 420 ++
.../matrix_free/mapping_info.templates.h | 978 +++
.../include/deal.II/matrix_free/matrix_free.h | 2612 ++++++++
.../matrix_free/matrix_free.templates.h | 1063 +++
deal.II/source/lac/constraint_matrix.cc | 2 +
deal.II/source/numerics/matrix_free.cc | 24 +
deal.II/source/numerics/matrix_free.inst.in | 62 +
tests/Makefile | 1 +
tests/base/vectorization_01.cc | 97 +
tests/base/vectorization_01/cmp/generic | 8 +
.../cmp/powerpc-apple-darwin8.10.0+gcc4.0 | 9 +
.../cmp/powerpc-apple-darwin8.8.0+gcc4.0 | 9 +
tests/base/vectorization_02.cc | 117 +
tests/base/vectorization_02/cmp/generic | 8 +
.../cmp/powerpc-apple-darwin8.10.0+gcc4.0 | 9 +
.../cmp/powerpc-apple-darwin8.8.0+gcc4.0 | 9 +
tests/base/vectorization_03.cc | 95 +
tests/base/vectorization_03/cmp/generic | 10 +
.../cmp/powerpc-apple-darwin8.10.0+gcc4.0 | 9 +
.../cmp/powerpc-apple-darwin8.8.0+gcc4.0 | 9 +
tests/base/vectorization_04.cc | 167 +
tests/base/vectorization_04/cmp/generic | 55 +
tests/deal.II/constraints_local_to_global.cc | 119 +
.../constraints_local_to_global/cmp/generic | 2 +
tests/fe/injection_q/cmp/generic | 2 +-
tests/matrix_free/Makefile | 10 +
tests/matrix_free/copy.cc | 112 +
tests/matrix_free/copy/cmp/generic | 49 +
tests/matrix_free/create_mesh.h | 134 +
tests/matrix_free/get_functions_cartesian.cc | 37 +
.../get_functions_cartesian/cmp/generic | 43 +
tests/matrix_free/get_functions_circle.cc | 44 +
.../get_functions_circle/cmp/generic | 43 +
tests/matrix_free/get_functions_common.h | 278 +
.../matrix_free/get_functions_constraints.cc | 42 +
.../get_functions_constraints/cmp/generic | 43 +
tests/matrix_free/get_functions_float.cc | 54 +
.../get_functions_float/cmp/generic | 43 +
tests/matrix_free/get_functions_gl.cc | 131 +
.../matrix_free/get_functions_gl/cmp/generic | 49 +
tests/matrix_free/get_functions_mappingq.cc | 78 +
.../get_functions_mappingq/cmp/generic | 49 +
tests/matrix_free/get_functions_multife.cc | 291 +
.../get_functions_multife/cmp/generic | 57 +
tests/matrix_free/get_functions_multife2.cc | 343 +
.../get_functions_multife2/cmp/generic | 78 +
.../get_functions_q_hierarchical.cc | 135 +
.../get_functions_q_hierarchical/cmp/generic | 49 +
tests/matrix_free/get_functions_rect.cc | 98 +
.../get_functions_rect/cmp/generic | 147 +
tests/matrix_free/get_functions_variants.cc | 207 +
.../get_functions_variants/cmp/generic | 64 +
tests/matrix_free/get_values_plain.cc | 189 +
.../matrix_free/get_values_plain/cmp/generic | 19 +
tests/matrix_free/integrate_functions.cc | 227 +
.../integrate_functions/cmp/generic | 22 +
.../integrate_functions_multife.cc | 350 +
.../integrate_functions_multife/cmp/generic | 39 +
.../integrate_functions_multife2.cc | 350 +
.../integrate_functions_multife2/cmp/generic | 39 +
tests/matrix_free/matrix_vector_01.cc | 35 +
.../matrix_free/matrix_vector_01/cmp/generic | 13 +
tests/matrix_free/matrix_vector_02.cc | 37 +
.../matrix_free/matrix_vector_02/cmp/generic | 13 +
tests/matrix_free/matrix_vector_03.cc | 65 +
.../matrix_free/matrix_vector_03/cmp/generic | 13 +
tests/matrix_free/matrix_vector_04.cc | 40 +
.../matrix_free/matrix_vector_04/cmp/generic | 13 +
tests/matrix_free/matrix_vector_05.cc | 68 +
.../matrix_free/matrix_vector_05/cmp/generic | 7 +
tests/matrix_free/matrix_vector_06.cc | 64 +
.../matrix_free/matrix_vector_06/cmp/generic | 13 +
tests/matrix_free/matrix_vector_07.cc | 78 +
.../matrix_free/matrix_vector_07/cmp/generic | 29 +
tests/matrix_free/matrix_vector_08.cc | 62 +
.../matrix_free/matrix_vector_08/cmp/generic | 13 +
tests/matrix_free/matrix_vector_09.cc | 62 +
.../matrix_free/matrix_vector_09/cmp/generic | 13 +
tests/matrix_free/matrix_vector_common.h | 231 +
tests/matrix_free/matrix_vector_curl.cc | 297 +
.../matrix_vector_curl/cmp/generic | 12 +
tests/matrix_free/matrix_vector_float.cc | 63 +
.../matrix_vector_float/cmp/generic | 13 +
tests/matrix_free/matrix_vector_hp.cc | 229 +
.../matrix_free/matrix_vector_hp/cmp/generic | 5 +
tests/matrix_free/matrix_vector_mg.cc | 206 +
.../matrix_free/matrix_vector_mg/cmp/generic | 23 +
tests/matrix_free/matrix_vector_stokes.cc | 332 +
.../matrix_vector_stokes/cmp/generic | 16 +
.../matrix_vector_stokes_noflux.cc | 352 +
.../matrix_vector_stokes_noflux/cmp/generic | 16 +
tests/matrix_free/quadrature_points.cc | 112 +
.../matrix_free/quadrature_points/cmp/generic | 16 +
tests/matrix_free/thread_correctness.cc | 141 +
.../thread_correctness/cmp/generic | 529 ++
tests/matrix_free/thread_correctness_hp.cc | 220 +
.../thread_correctness_hp/cmp/generic | 25 +
tests/mpi/matrix_free_01.cc | 284 +
tests/mpi/matrix_free_01/ncpu_1/cmp/generic | 13 +
tests/mpi/matrix_free_01/ncpu_10/cmp/generic | 13 +
tests/mpi/matrix_free_01/ncpu_4/cmp/generic | 13 +
tests/mpi/matrix_free_02.cc | 261 +
tests/mpi/matrix_free_02/ncpu_10/cmp/generic | 33 +
tests/mpi/matrix_free_02/ncpu_4/cmp/generic | 33 +
tests/mpi/matrix_free_03.cc | 289 +
tests/mpi/matrix_free_03/ncpu_1/cmp/generic | 13 +
tests/mpi/matrix_free_03/ncpu_10/cmp/generic | 13 +
tests/mpi/matrix_free_03/ncpu_3/cmp/generic | 13 +
tests/mpi/parallel_vector_06.cc | 48 +-
tests/mpi/parallel_vector_12.cc | 188 +
.../mpi/parallel_vector_12/ncpu_1/cmp/generic | 8 +
.../parallel_vector_12/ncpu_10/cmp/generic | 8 +
.../mpi/parallel_vector_12/ncpu_4/cmp/generic | 8 +
154 files changed, 29807 insertions(+), 2307 deletions(-)
create mode 100644 deal.II/examples/step-37/doc/step-37.solution.png
create mode 100644 deal.II/examples/step-48/Makefile
create mode 100644 deal.II/examples/step-48/doc/builds-on
create mode 100644 deal.II/examples/step-48/doc/intro.dox
create mode 100644 deal.II/examples/step-48/doc/kind
create mode 100644 deal.II/examples/step-48/doc/results.dox
create mode 100644 deal.II/examples/step-48/doc/tooltip
create mode 100644 deal.II/examples/step-48/step-48.cc
create mode 100644 deal.II/include/deal.II/base/std_cxx1x/type_traits.h
create mode 100644 deal.II/include/deal.II/base/vectorization.h
create mode 100644 deal.II/include/deal.II/matrix_free/dof_info.h
create mode 100644 deal.II/include/deal.II/matrix_free/dof_info.templates.h
create mode 100644 deal.II/include/deal.II/matrix_free/fe_evaluation.h
create mode 100644 deal.II/include/deal.II/matrix_free/fe_evaluation_data.h
create mode 100644 deal.II/include/deal.II/matrix_free/fe_evaluation_data.templates.h
create mode 100644 deal.II/include/deal.II/matrix_free/helper_functions.h
create mode 100644 deal.II/include/deal.II/matrix_free/mapping_info.h
create mode 100644 deal.II/include/deal.II/matrix_free/mapping_info.templates.h
create mode 100644 deal.II/include/deal.II/matrix_free/matrix_free.h
create mode 100644 deal.II/include/deal.II/matrix_free/matrix_free.templates.h
create mode 100644 deal.II/source/numerics/matrix_free.cc
create mode 100644 deal.II/source/numerics/matrix_free.inst.in
create mode 100644 tests/base/vectorization_01.cc
create mode 100644 tests/base/vectorization_01/cmp/generic
create mode 100644 tests/base/vectorization_01/cmp/powerpc-apple-darwin8.10.0+gcc4.0
create mode 100644 tests/base/vectorization_01/cmp/powerpc-apple-darwin8.8.0+gcc4.0
create mode 100644 tests/base/vectorization_02.cc
create mode 100644 tests/base/vectorization_02/cmp/generic
create mode 100644 tests/base/vectorization_02/cmp/powerpc-apple-darwin8.10.0+gcc4.0
create mode 100644 tests/base/vectorization_02/cmp/powerpc-apple-darwin8.8.0+gcc4.0
create mode 100644 tests/base/vectorization_03.cc
create mode 100644 tests/base/vectorization_03/cmp/generic
create mode 100644 tests/base/vectorization_03/cmp/powerpc-apple-darwin8.10.0+gcc4.0
create mode 100644 tests/base/vectorization_03/cmp/powerpc-apple-darwin8.8.0+gcc4.0
create mode 100644 tests/base/vectorization_04.cc
create mode 100644 tests/base/vectorization_04/cmp/generic
create mode 100644 tests/deal.II/constraints_local_to_global.cc
create mode 100644 tests/deal.II/constraints_local_to_global/cmp/generic
create mode 100644 tests/matrix_free/Makefile
create mode 100644 tests/matrix_free/copy.cc
create mode 100644 tests/matrix_free/copy/cmp/generic
create mode 100644 tests/matrix_free/create_mesh.h
create mode 100644 tests/matrix_free/get_functions_cartesian.cc
create mode 100644 tests/matrix_free/get_functions_cartesian/cmp/generic
create mode 100644 tests/matrix_free/get_functions_circle.cc
create mode 100644 tests/matrix_free/get_functions_circle/cmp/generic
create mode 100644 tests/matrix_free/get_functions_common.h
create mode 100644 tests/matrix_free/get_functions_constraints.cc
create mode 100644 tests/matrix_free/get_functions_constraints/cmp/generic
create mode 100644 tests/matrix_free/get_functions_float.cc
create mode 100644 tests/matrix_free/get_functions_float/cmp/generic
create mode 100644 tests/matrix_free/get_functions_gl.cc
create mode 100644 tests/matrix_free/get_functions_gl/cmp/generic
create mode 100644 tests/matrix_free/get_functions_mappingq.cc
create mode 100644 tests/matrix_free/get_functions_mappingq/cmp/generic
create mode 100644 tests/matrix_free/get_functions_multife.cc
create mode 100644 tests/matrix_free/get_functions_multife/cmp/generic
create mode 100644 tests/matrix_free/get_functions_multife2.cc
create mode 100644 tests/matrix_free/get_functions_multife2/cmp/generic
create mode 100644 tests/matrix_free/get_functions_q_hierarchical.cc
create mode 100644 tests/matrix_free/get_functions_q_hierarchical/cmp/generic
create mode 100644 tests/matrix_free/get_functions_rect.cc
create mode 100644 tests/matrix_free/get_functions_rect/cmp/generic
create mode 100644 tests/matrix_free/get_functions_variants.cc
create mode 100644 tests/matrix_free/get_functions_variants/cmp/generic
create mode 100644 tests/matrix_free/get_values_plain.cc
create mode 100644 tests/matrix_free/get_values_plain/cmp/generic
create mode 100644 tests/matrix_free/integrate_functions.cc
create mode 100644 tests/matrix_free/integrate_functions/cmp/generic
create mode 100644 tests/matrix_free/integrate_functions_multife.cc
create mode 100644 tests/matrix_free/integrate_functions_multife/cmp/generic
create mode 100644 tests/matrix_free/integrate_functions_multife2.cc
create mode 100644 tests/matrix_free/integrate_functions_multife2/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_01.cc
create mode 100644 tests/matrix_free/matrix_vector_01/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_02.cc
create mode 100644 tests/matrix_free/matrix_vector_02/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_03.cc
create mode 100644 tests/matrix_free/matrix_vector_03/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_04.cc
create mode 100644 tests/matrix_free/matrix_vector_04/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_05.cc
create mode 100644 tests/matrix_free/matrix_vector_05/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_06.cc
create mode 100644 tests/matrix_free/matrix_vector_06/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_07.cc
create mode 100644 tests/matrix_free/matrix_vector_07/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_08.cc
create mode 100644 tests/matrix_free/matrix_vector_08/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_09.cc
create mode 100644 tests/matrix_free/matrix_vector_09/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_common.h
create mode 100644 tests/matrix_free/matrix_vector_curl.cc
create mode 100644 tests/matrix_free/matrix_vector_curl/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_float.cc
create mode 100644 tests/matrix_free/matrix_vector_float/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_hp.cc
create mode 100644 tests/matrix_free/matrix_vector_hp/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_mg.cc
create mode 100644 tests/matrix_free/matrix_vector_mg/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_stokes.cc
create mode 100644 tests/matrix_free/matrix_vector_stokes/cmp/generic
create mode 100644 tests/matrix_free/matrix_vector_stokes_noflux.cc
create mode 100644 tests/matrix_free/matrix_vector_stokes_noflux/cmp/generic
create mode 100644 tests/matrix_free/quadrature_points.cc
create mode 100644 tests/matrix_free/quadrature_points/cmp/generic
create mode 100644 tests/matrix_free/thread_correctness.cc
create mode 100644 tests/matrix_free/thread_correctness/cmp/generic
create mode 100644 tests/matrix_free/thread_correctness_hp.cc
create mode 100644 tests/matrix_free/thread_correctness_hp/cmp/generic
create mode 100644 tests/mpi/matrix_free_01.cc
create mode 100644 tests/mpi/matrix_free_01/ncpu_1/cmp/generic
create mode 100644 tests/mpi/matrix_free_01/ncpu_10/cmp/generic
create mode 100644 tests/mpi/matrix_free_01/ncpu_4/cmp/generic
create mode 100644 tests/mpi/matrix_free_02.cc
create mode 100644 tests/mpi/matrix_free_02/ncpu_10/cmp/generic
create mode 100644 tests/mpi/matrix_free_02/ncpu_4/cmp/generic
create mode 100644 tests/mpi/matrix_free_03.cc
create mode 100644 tests/mpi/matrix_free_03/ncpu_1/cmp/generic
create mode 100644 tests/mpi/matrix_free_03/ncpu_10/cmp/generic
create mode 100644 tests/mpi/matrix_free_03/ncpu_3/cmp/generic
create mode 100644 tests/mpi/parallel_vector_12.cc
create mode 100644 tests/mpi/parallel_vector_12/ncpu_1/cmp/generic
create mode 100644 tests/mpi/parallel_vector_12/ncpu_10/cmp/generic
create mode 100644 tests/mpi/parallel_vector_12/ncpu_4/cmp/generic
diff --git a/deal.II/aclocal.m4 b/deal.II/aclocal.m4
index 0f115ea80f..c3a5571bd9 100644
--- a/deal.II/aclocal.m4
+++ b/deal.II/aclocal.m4
@@ -1216,6 +1216,16 @@ AC_DEFUN(DEAL_II_CHECK_CXX1X_COMPONENTS, dnl
[ AC_MSG_RESULT(no); all_cxx1x_classes_available=no ]
)
+ AC_MSG_CHECKING(for std::type_traits)
+ AC_TRY_COMPILE(
+ [#include ],
+ [ const bool m0 = std::is_trivial::value;
+ const bool m1 = std::is_standard_layout::value;
+ const bool m2 = std::is_pod::value; ],
+ [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no); all_cxx1x_classes_available=no ]
+ )
+
CXXFLAGS="${OLD_CXXFLAGS}"
dnl If the above classes and operations are all defined then we can
@@ -1999,12 +2009,12 @@ AC_DEFUN(DEAL_II_CHECK_CPU_OPTIMIZATIONS, dnl
AC_MSG_RESULT(x86 derivate ($withcpu))
case "$GXX_VERSION" in
gcc*)
- dnl Tune for this processor, but only in optimized mode
- dnl (to prevent the effects of possible compiler bugs to affect
- dnl both debug as well as optimized versions)
+ dnl Tune for this processor
+ CXXFLAGSG="$CXXFLAGSG -march=$withcpu"
CXXFLAGSO="$CXXFLAGSO -march=$withcpu"
dnl Also set the mode for f77 compiler
+ F77FLAGSG="$F77FLAGSG -march=$withcpu"
F77FLAGSO="$F77FLAGSO -march=$withcpu"
;;
esac
@@ -2014,18 +2024,19 @@ AC_DEFUN(DEAL_II_CHECK_CPU_OPTIMIZATIONS, dnl
AC_MSG_RESULT(native processor variant)
case "$GXX_VERSION" in
gcc*)
- dnl Tune for this processor, but only in optimized mode
- dnl (to prevent the effects of possible compiler bugs to affect
- dnl both debug as well as optimized versions)
+ dnl Tune for this processor
+ CXXFLAGSG="$CXXFLAGSG -march=native"
CXXFLAGSO="$CXXFLAGSO -march=native"
dnl Also set the mode for f77 compiler
+ F77FLAGSG="$F77FLAGSG -march=native"
F77FLAGSO="$F77FLAGSO -march=native"
;;
intel_icc*)
dnl Same, but for the icc compiler
CXXFLAGSO="$CXXFLAGSO -xhost"
+ CXXFLAGSG="$CXXFLAGSG -xhost"
;;
esac
;;
@@ -2038,6 +2049,155 @@ AC_DEFUN(DEAL_II_CHECK_CPU_OPTIMIZATIONS, dnl
+dnl -------------------------------------------------------------
+dnl Check whether the compiler allows for vectorization and that
+dnl vectorization actually works. For this test, we use compiler
+dnl intrinsics similar to what is used in the deal.II library and
+dnl check whether the arithmetic operations are correctly performed
+dnl on examples where all numbers are exactly represented as
+dnl floating point numbers.
+dnl
+dnl Usage: DEAL_II_COMPILER_VECTORIZATION_LEVEL
+dnl 0 means no vectorization, 1 support for SSE2, 2 support for AVX
+dnl
+dnl -------------------------------------------------------------
+AC_DEFUN(DEAL_II_DETECT_VECTORIZATION_LEVEL, dnl
+[
+ AC_LANG(C++)
+ CXXFLAGS="$CXXFLAGSG"
+ dnl SSE2 check in debug mode
+ AC_MSG_CHECKING(whether CPU supports SSE2)
+ AC_TRY_RUN(
+ [
+#include
+#include
+ int main()
+ {
+ __m128d a, b;
+ const unsigned int vector_bytes = sizeof(__m128d);
+ const int n_vectors = vector_bytes/sizeof(double);
+ __m128d * data =
+ reinterpret_cast<__m128d*>(_mm_malloc (2*vector_bytes, vector_bytes));
+ double * ptr = reinterpret_cast(&a);
+ ptr[0] = (volatile double)(1.0);
+ for (int i=1; i(&data[1]);
+ unsigned int return_value = 0;
+ if (ptr[0] != 7.3125)
+ return_value = 1;
+ for (int i=1; i
+#include
+ int main()
+ {
+ __m256d a, b;
+ const unsigned int vector_bytes = sizeof(__m256d);
+ const int n_vectors = vector_bytes/sizeof(double);
+ __m256d * data =
+ reinterpret_cast<__m256d*>(_mm_malloc (2*vector_bytes, vector_bytes));
+ double * ptr = reinterpret_cast(&a);
+ ptr[0] = (volatile double)(1.0);
+ for (int i=1; i(&data[1]);
+ unsigned int return_value = 0;
+ if (ptr[0] != 7.3125)
+ return_value = 1;
+ for (int i=1; i
+ ],
+ [
+ __m128d a, b;
+ a = _mm_set_sd (1.0);
+ b = _mm_set1_pd (2.1);
+ __m128d c = a + b;
+ __m128d d = b - c;
+ __m128d e = c * a + d;
+ __m128d f = e/a;
+ (void)f;
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DEAL_II_COMPILER_USE_VECTOR_ARITHMETICS, 1,
+ [Defined if the compiler can use arithmetic operations on
+ vectorized data types])
+ ],
+ [
+ AC_MSG_RESULT(no)
+ ])
+])
+
+
+
dnl -------------------------------------------------------------
dnl In some cases, -threads (or whatever else command line option)
dnl switches on some preprocessor flags. If this is not the case,
@@ -4953,106 +5113,6 @@ AC_DEFUN(DEAL_II_CHECK_ADVANCE_WARNING, dnl
-dnl -------------------------------------------------------------
-dnl Check whether the compiler allows to use arithmetic operations
-dnl +-*/ on vectorized data types or whether we need to use
-dnl _mm_add_pd for addition and so on. +-*/ is preferred because
-dnl it allows the compiler to choose other optimizations like
-dnl fused multiply add, whereas _mm_add_pd explicitly enforces the
-dnl assembler command.
-dnl
-dnl Usage: DEAL_II_COMPILER_USE_VECTOR_ARITHMETICS
-dnl
-dnl -------------------------------------------------------------
-AC_DEFUN(DEAL_II_CHECK_VECTOR_ARITHMETICS, dnl
-
-[
- AC_MSG_CHECKING(whether compiler supports vector arithmetics)
- AC_LANG(C++)
- CXXFLAGS="$CXXFLAGSG"
- AC_TRY_COMPILE(
- [
-#include
- ],
- [
- __m128d a, b;
- a = _mm_set_sd (1.0);
- b = _mm_set1_pd (2.1);
- __m128d c = a + b;
- __m128d d = b - c;
- __m128d e = c * a + d;
- __m128d f = e/a;
- (void)f;
- ],
- [
- AC_MSG_RESULT(yes)
- AC_DEFINE(DEAL_II_COMPILER_USE_VECTOR_ARITHMETICS, 1,
- [Defined if the compiler can use arithmetic operations on
- vectorized data types])
- ],
- [
- AC_MSG_RESULT(no)
- ])
-])
-
-
-
-dnl -------------------------------------------------------------
-dnl Check for existence of a strong inline function. This can be used
-dnl to force a compiler to inline some functions also at low optimization
-dnl levels. We use it in vectorized data types, where we want inlining
-dnl also for debug code. If we cannot find a good inlining routine, we
-dnl just use 'inline'.
-dnl
-dnl Usage: DEAL_II_ALWAYS_INLINE
-dnl
-dnl -------------------------------------------------------------
-AC_DEFUN(DEAL_II_CHECK_ALWAYS_INLINE, dnl
-
-[
- if test "$GXX" = "yes" ; then
- dnl force inline for gcc compiler
- TEMP_ALWAYS_INLINE='__inline __attribute__((__always_inline__))'
- else
- case "$GXX_VERSION" in
- clang*)
- dnl force inline for clang compiler
- TEMP_ALWAYS_INLINE='__inline __attribute__((__always_inline__))'
- ;;
-
- *)
- dnl for all other compilers, try with __forceinline
- TEMP_ALWAYS_INLINE=__forceinline
- ;;
- esac
- fi
- AC_MSG_CHECKING(for forced inlining)
- AC_LANG(C++)
- CXXFLAGS="$CXXFLAGSG"
- AC_TRY_COMPILE(
- [
- $TEMP_ALWAYS_INLINE
- void f() {};
- ],
- [
- f();
- ],
- [
- AC_MSG_RESULT(yes)
- AC_DEFINE_UNQUOTED(DEAL_II_ALWAYS_INLINE, $TEMP_ALWAYS_INLINE,
- [Forces the compiler to always inline functions, also in
- debug mode])
- ],
- [
- AC_MSG_RESULT(no)
- AC_DEFINE(DEAL_II_ALWAYS_INLINE, inline,
- [Forces the compiler to always inline functions, also in
- debug mode])
- ])
-])
-
-
-
dnl -------------------------------------------------------------
dnl
dnl Usage: DEAL_II_CHECK_MIN_VECTOR_CAPACITY
@@ -7425,6 +7485,7 @@ AC_DEFUN(DEAL_II_WITH_LAPACK, dnl
AC_DEFINE([HAVE_LIBLAPACK], [1],
[Defined if deal.II was configured with LAPACK support])
AC_SUBST(DEAL_II_USE_LAPACK, "yes")
+ USE_CONTRIB_LAPACK='yes'
],
[AC_MSG_ERROR([LAPACK library $lapack not found])]
)
@@ -7531,6 +7592,7 @@ AC_DEFUN(DEAL_II_WITH_BLAS, dnl
],,$F77LIBS)
AC_SUBST(DEAL_II_USE_BLAS, "yes")
AC_SUBST(NEEDS_F77LIBS, "yes")
+ USE_CONTRIB_BLAS='yes'
else
DEAL_II_CHECK_BLAS_FRAMEWORK
if test "x$framework_works" != "xyes"; then
@@ -7544,6 +7606,7 @@ AC_DEFUN(DEAL_II_WITH_BLAS, dnl
AC_SUBST(DEAL_II_USE_BLAS, "yes")
AC_SUBST(NEEDS_F77LIBS, "yes")
+ USE_CONTRIB_BLAS='yes'
fi
fi
fi
diff --git a/deal.II/common/Make.global_options.in b/deal.II/common/Make.global_options.in
index e5bc799f72..cd3121065b 100644
--- a/deal.II/common/Make.global_options.in
+++ b/deal.II/common/Make.global_options.in
@@ -76,6 +76,9 @@ DEAL_II_TRILINOS_VERSION_MINOR = @DEAL_II_TRILINOS_VERSION_MINOR@
DEAL_II_TRILINOS_VERSION_SUBMINOR = @DEAL_II_TRILINOS_VERSION_SUBMINOR@
DEAL_II_TRILINOS_LIBPREFIX = @DEAL_II_TRILINOS_LIBPREFIX@
+USE_CONTRIB_BLAS = @USE_CONTRIB_BLAS@
+USE_CONTRIB_LAPACK = @USE_CONTRIB_LAPACK@
+
USE_CONTRIB_MUMPS = @USE_CONTRIB_MUMPS@
DEAL_II_MUMPS_DIR = @DEAL_II_MUMPS_DIR@
DEAL_II_SCALAPACK_DIR = @DEAL_II_SCALAPACK_DIR@
diff --git a/deal.II/configure b/deal.II/configure
index 407e5fbeb9..0d70c483b9 100755
--- a/deal.II/configure
+++ b/deal.II/configure
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.in Revision: 25395 .
+# From configure.in Revision: 25397 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68 for deal.II 7.2.pre.
#
@@ -625,6 +625,8 @@ USE_CONTRIB_METIS
TECPLOT_INCLUDE_DIR
USE_CONTRIB_HSL
HSL_INCLUDE_DIR
+USE_CONTRIB_LAPACK
+USE_CONTRIB_BLAS
NEEDS_F77LIBS
DEAL_II_USE_BLAS
DEAL_II_P4EST_DIR
@@ -4387,6 +4389,31 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }; all_cxx1x_classes_available=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::type_traits" >&5
+$as_echo_n "checking for std::type_traits... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include
+int
+main ()
+{
+ const bool m0 = std::is_trivial::value;
+ const bool m1 = std::is_standard_layout::value;
+ const bool m2 = std::is_pod::value;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }; all_cxx1x_classes_available=no
+
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -5126,6 +5153,31 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }; all_cxx1x_classes_available=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::type_traits" >&5
+$as_echo_n "checking for std::type_traits... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include
+int
+main ()
+{
+ const bool m0 = std::is_trivial::value;
+ const bool m1 = std::is_standard_layout::value;
+ const bool m2 = std::is_pod::value;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }; all_cxx1x_classes_available=no
+
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -8389,116 +8441,6 @@ rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports vector arithmetics" >&5
-$as_echo_n "checking whether compiler supports vector arithmetics... " >&6; }
- ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
- CXXFLAGS="$CXXFLAGSG"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#include
-
-int
-main ()
-{
-
- __m128d a, b;
- a = _mm_set_sd (1.0);
- b = _mm_set1_pd (2.1);
- __m128d c = a + b;
- __m128d d = b - c;
- __m128d e = c * a + d;
- __m128d f = e/a;
- (void)f;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define DEAL_II_COMPILER_USE_VECTOR_ARITHMETICS 1" >>confdefs.h
-
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-
-
- if test "$GXX" = "yes" ; then
- TEMP_ALWAYS_INLINE='__inline __attribute__((__always_inline__))'
- else
- case "$GXX_VERSION" in
- clang*)
- TEMP_ALWAYS_INLINE='__inline __attribute__((__always_inline__))'
- ;;
-
- *)
- TEMP_ALWAYS_INLINE=__forceinline
- ;;
- esac
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forced inlining" >&5
-$as_echo_n "checking for forced inlining... " >&6; }
- ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
- CXXFLAGS="$CXXFLAGSG"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- $TEMP_ALWAYS_INLINE
- void f() {};
-
-int
-main ()
-{
-
- f();
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define DEAL_II_ALWAYS_INLINE $TEMP_ALWAYS_INLINE
-_ACEOF
-
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define DEAL_II_ALWAYS_INLINE inline" >>confdefs.h
-
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -11964,6 +11906,7 @@ fi
NEEDS_F77LIBS="yes"
+ USE_CONTRIB_BLAS='yes'
else
if (echo $target | grep apple-darwin > /dev/null) ; then
@@ -12092,6 +12035,7 @@ fi
NEEDS_F77LIBS="yes"
+ USE_CONTRIB_BLAS='yes'
fi
fi
fi
@@ -12100,6 +12044,8 @@ fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for HSL subroutines" >&5
$as_echo_n "checking for HSL subroutines... " >&6; }
hsl_subroutines=""
@@ -13456,6 +13402,7 @@ $as_echo "#define HAVE_LIBLAPACK 1" >>confdefs.h
DEAL_II_USE_LAPACK="yes"
+ USE_CONTRIB_LAPACK='yes'
else
as_fn_error $? "LAPACK library $lapack not found" "$LINENO" 5
@@ -13614,9 +13561,11 @@ $as_echo "PowerPC64" >&6; }
$as_echo "x86 derivate ($withcpu)" >&6; }
case "$GXX_VERSION" in
gcc*)
- CXXFLAGSO="$CXXFLAGSO -march=$withcpu"
+ CXXFLAGSG="$CXXFLAGSG -march=$withcpu"
+ CXXFLAGSO="$CXXFLAGSO -march=$withcpu"
- F77FLAGSO="$F77FLAGSO -march=$withcpu"
+ F77FLAGSG="$F77FLAGSG -march=$withcpu"
+ F77FLAGSO="$F77FLAGSO -march=$withcpu"
;;
esac
;;
@@ -13626,13 +13575,16 @@ $as_echo "x86 derivate ($withcpu)" >&6; }
$as_echo "native processor variant" >&6; }
case "$GXX_VERSION" in
gcc*)
- CXXFLAGSO="$CXXFLAGSO -march=native"
+ CXXFLAGSG="$CXXFLAGSG -march=native"
+ CXXFLAGSO="$CXXFLAGSO -march=native"
- F77FLAGSO="$F77FLAGSO -march=native"
+ F77FLAGSG="$F77FLAGSG -march=native"
+ F77FLAGSO="$F77FLAGSO -march=native"
;;
intel_icc*)
CXXFLAGSO="$CXXFLAGSO -xhost"
+ CXXFLAGSG="$CXXFLAGSG -xhost"
;;
esac
;;
@@ -13709,6 +13661,181 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$CXXFLAGSG"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CPU supports SSE2" >&5
+$as_echo_n "checking whether CPU supports SSE2... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include
+#include
+ int main()
+ {
+ __m128d a, b;
+ const unsigned int vector_bytes = sizeof(__m128d);
+ const int n_vectors = vector_bytes/sizeof(double);
+ __m128d * data =
+ reinterpret_cast<__m128d*>(_mm_malloc (2*vector_bytes, vector_bytes));
+ double * ptr = reinterpret_cast(&a);
+ ptr[0] = (volatile double)(1.0);
+ for (int i=1; i(&data[1]);
+ unsigned int return_value = 0;
+ if (ptr[0] != 7.3125)
+ return_value = 1;
+ for (int i=1; i&5
+$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CPU supports AVX" >&5
+$as_echo_n "checking whether CPU supports AVX... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include
+#include
+ int main()
+ {
+ __m256d a, b;
+ const unsigned int vector_bytes = sizeof(__m256d);
+ const int n_vectors = vector_bytes/sizeof(double);
+ __m256d * data =
+ reinterpret_cast<__m256d*>(_mm_malloc (2*vector_bytes, vector_bytes));
+ double * ptr = reinterpret_cast(&a);
+ ptr[0] = (volatile double)(1.0);
+ for (int i=1; i(&data[1]);
+ unsigned int return_value = 0;
+ if (ptr[0] != 7.3125)
+ return_value = 1;
+ for (int i=1; i&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define DEAL_II_COMPILER_VECTORIZATION_LEVEL 2" >>confdefs.h
+
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define DEAL_II_COMPILER_VECTORIZATION_LEVEL 1" >>confdefs.h
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+else
+
+
+$as_echo "#define DEAL_II_COMPILER_VECTORIZATION_LEVEL 0" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports vector arithmetics" >&5
+$as_echo_n "checking whether compiler supports vector arithmetics... " >&6; }
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ CXXFLAGS="$CXXFLAGSG"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include
+
+int
+main ()
+{
+
+ __m128d a, b;
+ a = _mm_set_sd (1.0);
+ b = _mm_set1_pd (2.1);
+ __m128d c = a + b;
+ __m128d d = b - c;
+ __m128d e = c * a + d;
+ __m128d f = e/a;
+ (void)f;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define DEAL_II_COMPILER_USE_VECTOR_ARITHMETICS 1" >>confdefs.h
+
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
$as_echo "" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ---------------- configuring other programs -----------------" >&5
diff --git a/deal.II/configure.in b/deal.II/configure.in
index 0402549871..f2e3b1c4dd 100644
--- a/deal.II/configure.in
+++ b/deal.II/configure.in
@@ -245,8 +245,6 @@ DEAL_II_HAVE_BUILTIN_EXPECT
DEAL_II_HAVE_VERBOSE_TERMINATE
DEAL_II_HAVE_GLIBC_STACKTRACE
DEAL_II_HAVE_DEMANGLER
-DEAL_II_CHECK_VECTOR_ARITHMETICS
-DEAL_II_CHECK_ALWAYS_INLINE
DEAL_II_CHECK_MIN_VECTOR_CAPACITY
DEAL_II_CHECK_ABORT
DEAL_II_CHECK_GETRUSAGE
@@ -590,6 +588,8 @@ AC_ARG_WITH(blas,
is given, use -lblas. Default is to use -lblas only
if required by other libraries.],
DEAL_II_WITH_BLAS($withval))
+AC_SUBST(USE_CONTRIB_BLAS)
+AC_SUBST(USE_CONTRIB_LAPACK)
DEAL_II_CONFIGURE_HSL
AC_SUBST(USE_CONTRIB_HSL)
@@ -696,10 +696,15 @@ AC_MSG_RESULT(---------------- checking compiler flags --------------------)
dnl Possibly add some flags if optimizations are requested
DEAL_II_CHECK_CPU_OPTIMIZATIONS
-dnl Last check: test whether CXXFLAGS and F77FLAGS are ok
+dnl Test whether CXXFLAGS and F77FLAGS are ok
DEAL_II_CHECK_CXXFLAGS_CONSISTENCY
DEAL_II_CHECK_F77FLAGS_CONSISTENCY
+dnl Last check: check whether the compiler and host system allows for
+dnl vectorization
+DEAL_II_DETECT_VECTORIZATION_LEVEL
+DEAL_II_CHECK_VECTOR_ARITHMETICS
+
dnl -------------------------------------------------------------
dnl Third party programs
dnl -------------------------------------------------------------
diff --git a/deal.II/doc/doxygen/tutorial/navbar.html b/deal.II/doc/doxygen/tutorial/navbar.html
index daf4ff0109..7608b3ca95 100644
--- a/deal.II/doc/doxygen/tutorial/navbar.html
+++ b/deal.II/doc/doxygen/tutorial/navbar.html
@@ -79,17 +79,19 @@
35
36
- 38
+ 37
+ 38
39
- 40
- 41
+ 40
+ 41
43
- 44
- 45
+ 44
+ 45
46
+ 48
diff --git a/deal.II/doc/doxygen/tutorial/steps.cmapx b/deal.II/doc/doxygen/tutorial/steps.cmapx
index f000285fac..66bc3f06b4 100644
--- a/deal.II/doc/doxygen/tutorial/steps.cmapx
+++ b/deal.II/doc/doxygen/tutorial/steps.cmapx
@@ -1,45 +1,47 @@
diff --git a/deal.II/doc/doxygen/tutorial/steps.pl b/deal.II/doc/doxygen/tutorial/steps.pl
index b18b68ebb0..191cdb62e6 100644
--- a/deal.II/doc/doxygen/tutorial/steps.pl
+++ b/deal.II/doc/doxygen/tutorial/steps.pl
@@ -11,8 +11,8 @@ use strict;
my @steps = (1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25, 27,28,29,
- 30,31,32,33,34,35,36, 38,39,
- 40,41, 43,44,45,46);
+ 30,31,32,33,34,35,36,37,38,39,
+ 40,41, 43,44,45,46, 48);
# List of additional node attributes to highlight purpose and state of the example
diff --git a/deal.II/doc/doxygen/tutorial/steps.png b/deal.II/doc/doxygen/tutorial/steps.png
index 81836339f07c6018fd404516c5038d92b556b464..583cbaa611cd26dfd6f5f4b0ff077c6d728aba09 100644
GIT binary patch
literal 94716
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
`?EBbNRxp+TWw)7=lLkD&4cH$-vjV%d
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
z
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