]> https://gitweb.dealii.org/ - dealii.git/commitdiff
LinearOperator: Also test for complex number support
authorMatthias Maier <tamiko@43-1.org>
Tue, 25 Aug 2015 18:40:01 +0000 (13:40 -0500)
committerMatthias Maier <tamiko@43-1.org>
Tue, 25 Aug 2015 20:32:40 +0000 (15:32 -0500)
tests/lac/linear_operator_01.cc
tests/lac/linear_operator_01a.cc [new file with mode: 0644]
tests/lac/linear_operator_01a.with_cxx11=on.output [new file with mode: 0644]
tests/lac/linear_operator_02a.cc [new file with mode: 0644]
tests/lac/linear_operator_02a.with_cxx11=on.output [new file with mode: 0644]

index 0f47a0d139acefc8bdb16c2f407657e335bb0eac..0f4f99385ca7899b6e91fd5aae3d989f23a3bedd 100644 (file)
@@ -29,19 +29,19 @@ using namespace dealii;
 struct LeftVector
 {
   typedef double value_type;
-  double value;
+  value_type value;
 
-  LeftVector & operator = (double new_value)
+  LeftVector & operator = (value_type new_value)
   {
     value = new_value;
     return *this;
   }
-  LeftVector & operator *= (double scale)
+  LeftVector & operator *= (value_type scale)
   {
     value *= scale;
     return *this;
   }
-  LeftVector & operator /= (double scale)
+  LeftVector & operator /= (value_type scale)
   {
     value /= scale;
     return *this;
@@ -64,19 +64,19 @@ struct LeftVector
 struct RightVector
 {
   typedef double value_type;
-  double value;
+  value_type value;
 
-  RightVector & operator = (double new_value)
+  RightVector & operator = (value_type new_value)
   {
     value = new_value;
     return *this;
   }
-  RightVector & operator *= (double scale)
+  RightVector & operator *= (value_type scale)
   {
     value *= scale;
     return *this;
   }
-  RightVector & operator /= (double scale)
+  RightVector & operator /= (value_type scale)
   {
     value /= scale;
     return *this;
diff --git a/tests/lac/linear_operator_01a.cc b/tests/lac/linear_operator_01a.cc
new file mode 100644 (file)
index 0000000..e1511c9
--- /dev/null
@@ -0,0 +1,242 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2015 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 at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// Variant of linear_operator_01 that uses std::complex<double> as
+// value_type: Test the LinearOperator template on a trivial vector
+// implementation :: RightVector -> LeftVector with complex numbers.
+
+#include "../tests.h"
+
+#include <complex>
+
+#include <deal.II/lac/linear_operator.h>
+#include <deal.II/lac/vector_memory.templates.h>
+
+
+using namespace dealii;
+
+// Dummy vectors with different, non convertible types:
+
+struct LeftVector
+{
+  typedef std::complex<double> value_type;
+  value_type value;
+
+  LeftVector & operator = (value_type new_value)
+  {
+    value = new_value;
+    return *this;
+  }
+  LeftVector & operator *= (value_type scale)
+  {
+    value *= scale;
+    return *this;
+  }
+  LeftVector & operator /= (value_type scale)
+  {
+    value /= scale;
+    return *this;
+  }
+  LeftVector & operator += (const LeftVector &u)
+  {
+    value += u.value;
+    return *this;
+  }
+  int size() const
+  {
+    return 1;
+  }
+  std::size_t memory_consumption () const
+  {
+    return 1;
+  }
+};
+
+struct RightVector
+{
+  typedef std::complex<double> value_type;
+  value_type value;
+
+  RightVector & operator = (value_type new_value)
+  {
+    value = new_value;
+    return *this;
+  }
+  RightVector & operator *= (value_type scale)
+  {
+    value *= scale;
+    return *this;
+  }
+  RightVector & operator /= (value_type scale)
+  {
+    value /= scale;
+    return *this;
+  }
+  RightVector & operator += (const RightVector &u)
+  {
+    value += u.value;
+    return *this;
+  }
+  int size() const
+  {
+    return 1;
+  }
+  std::size_t memory_consumption () const
+  {
+    return 1;
+  }
+};
+
+int main()
+{
+  initlog();
+
+  // Create to distinct linear operators:
+
+  LinearOperator<LeftVector, RightVector> multiply2;
+  multiply2.vmult = [](LeftVector &v, const RightVector &u)
+  {
+    v.value = 2. * u.value;
+  };
+  multiply2.vmult_add = [](LeftVector &v, const RightVector &u)
+  {
+    v.value += 2. * u.value;
+  };
+  multiply2.Tvmult = [](RightVector &v, const LeftVector &u)
+  {
+    v.value = 2. * u.value;
+  };
+  multiply2.Tvmult_add = [](RightVector &v, const LeftVector &u)
+  {
+    v.value += 2. * u.value;
+  };
+  multiply2.reinit_range_vector = [](LeftVector &, bool)
+  {
+  };
+  multiply2.reinit_domain_vector = [](RightVector &, bool)
+  {
+  };
+
+  auto multiply4 = multiply2;
+  multiply4.vmult = [](LeftVector &v, const RightVector &u)
+  {
+    v.value = 4. * u.value;
+  };
+  multiply4.vmult_add = [](LeftVector &v, const RightVector &u)
+  {
+    v.value += 4. * u.value;
+  };
+  multiply4.Tvmult = [](RightVector &v, const LeftVector &u)
+  {
+    v.value = 4. * u.value;
+  };
+  multiply4.Tvmult_add = [](RightVector &v, const LeftVector &u)
+  {
+    v.value += 4. * u.value;
+  };
+
+
+  // Small unit tests for all functions:
+
+  RightVector u = { 4. };
+  LeftVector v = { 0. };
+
+  // vmult, vmult_add
+
+  multiply2.vmult(v, u);
+  deallog << "2 * " << u.value << " = " << v.value << std::endl;
+
+  multiply4.vmult_add(v, u);
+  deallog << "... + 4 * " << u.value << " = " << v.value << std::endl;
+
+  multiply4.vmult(v, u);
+  deallog << "4 * " << u.value << " = " << v.value << std::endl;
+
+  multiply2.vmult_add(v, u);
+  deallog << "... + 2 * " << u.value << " = " << v.value << std::endl;
+
+  // Tvmult, Tvmult_add
+
+  v.value = 4.;
+
+  multiply2.Tvmult(u, v);
+  deallog << "2 * " << v.value << " = " << u.value << std::endl;
+
+  multiply4.Tvmult_add(u, v);
+  deallog << "... + 4 * " << v.value << " = " << u.value << std::endl;
+
+  multiply4.Tvmult(u, v);
+  deallog << "4 * " << v.value << " = " << u.value << std::endl;
+
+  multiply2.Tvmult_add(u, v);
+  deallog << "... + 2 * " << v.value << " = " << u.value << std::endl;
+
+  // operator+, operator-, operator+=, operator-=
+
+  auto test = multiply2 + multiply4;
+  test.vmult(v, u);
+  deallog << "(2 + 4) * " << u.value << " = " << v.value << std::endl;
+
+  test = multiply2 - multiply4;
+  test.vmult(v, u);
+  deallog << "(2 - 4) * " << u.value << " = " << v.value << std::endl;
+
+  test += multiply2;
+  test.vmult(v, u);
+  deallog << "(2 - 4 + 2) * " << u.value << " = " << v.value << std::endl;
+
+  test -= multiply4;
+  test.vmult(v, u);
+  deallog << "(2 - 4 + 2 - 4) * " << u.value << " = " << v.value << std::endl;
+
+  // operator* with scalar
+
+  test = 4. * multiply4;
+  test.vmult(v, u);
+  deallog << "(4 * 4) * " << u.value << " = " << v.value << std::endl;
+
+  test = multiply4;
+  test *= std::complex<double>(4.);
+  test.vmult(v, u);
+  deallog << "(4 * 4) * " << u.value << " = " << v.value << std::endl;
+
+  test = multiply4 * 4.;
+  test.vmult(v, u);
+  deallog << "(4 * 4) * " << u.value << " = " << v.value << std::endl;
+
+  // operator* and transpose
+
+  auto test2 = transpose_operator(multiply2) * multiply4;
+  RightVector w = { 0. };
+  test2.vmult(w, u);
+  deallog << "(2 * 4) * " << u.value << " = " << w.value << std::endl;
+
+  test2 *= identity_operator(test2.reinit_range_vector);
+  test2.vmult(w, u);
+  deallog << "(2 * 4) * 1 * " << u.value << " = " << w.value << std::endl;
+
+  // identity
+
+  auto test3 = identity_operator(test2.reinit_range_vector) + test2;
+  test3.vmult(w, u);
+  deallog << "(1 + 2 * 4) * " << u.value << " = " << w.value << std::endl;
+
+  // null operator
+
+  auto test4 = null_operator(test2);
+  test4.vmult(w, u);
+  deallog << " 0 * " << u.value << " = " << w.value << std::endl;
+
+}
diff --git a/tests/lac/linear_operator_01a.with_cxx11=on.output b/tests/lac/linear_operator_01a.with_cxx11=on.output
new file mode 100644 (file)
index 0000000..2f70fca
--- /dev/null
@@ -0,0 +1,20 @@
+
+DEAL::2 * (4.00000,0.00000) = (8.00000,0.00000)
+DEAL::... + 4 * (4.00000,0.00000) = (24.0000,0.00000)
+DEAL::4 * (4.00000,0.00000) = (16.0000,0.00000)
+DEAL::... + 2 * (4.00000,0.00000) = (24.0000,0.00000)
+DEAL::2 * (4.00000,0.00000) = (8.00000,0.00000)
+DEAL::... + 4 * (4.00000,0.00000) = (24.0000,0.00000)
+DEAL::4 * (4.00000,0.00000) = (16.0000,0.00000)
+DEAL::... + 2 * (4.00000,0.00000) = (24.0000,0.00000)
+DEAL::(2 + 4) * (24.0000,0.00000) = (144.000,0.00000)
+DEAL::(2 - 4) * (24.0000,0.00000) = (-48.0000,0.00000)
+DEAL::(2 - 4 + 2) * (24.0000,0.00000) = (0.00000,0.00000)
+DEAL::(2 - 4 + 2 - 4) * (24.0000,0.00000) = (-96.0000,0.00000)
+DEAL::(4 * 4) * (24.0000,0.00000) = (384.000,0.00000)
+DEAL::(4 * 4) * (24.0000,0.00000) = (384.000,0.00000)
+DEAL::(4 * 4) * (24.0000,0.00000) = (384.000,0.00000)
+DEAL::(2 * 4) * (24.0000,0.00000) = (192.000,0.00000)
+DEAL::(2 * 4) * 1 * (24.0000,0.00000) = (192.000,0.00000)
+DEAL::(1 + 2 * 4) * (24.0000,0.00000) = (216.000,0.00000)
+DEAL:: 0 * (24.0000,0.00000) = (0.00000,0.00000)
diff --git a/tests/lac/linear_operator_02a.cc b/tests/lac/linear_operator_02a.cc
new file mode 100644 (file)
index 0000000..4cbfbc6
--- /dev/null
@@ -0,0 +1,159 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2015 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 at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// Variant of linear_operator_02 that uses std::complex<double> as
+// value_type: Tests for the LinearOperator template with
+//   dealii::Vector<complex>
+//   dealii::SparseMatrix<complex>
+//   dealii::FullMatrix<complex>
+
+#include "../tests.h"
+
+#include <deal.II/base/quadrature_lib.h>
+#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/dofs/dof_tools.h>
+#include <deal.II/fe/fe_q.h>
+#include <deal.II/fe/mapping_q.h>
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/grid/tria.h>
+#include <deal.II/lac/dynamic_sparsity_pattern.h>
+#include <deal.II/lac/full_matrix.h>
+#include <deal.II/lac/linear_operator.h>
+#include <deal.II/lac/precondition.h>
+#include <deal.II/lac/solver_cg.h>
+#include <deal.II/lac/sparse_matrix.h>
+#include <deal.II/lac/sparse_matrix.templates.h>
+#include <deal.II/numerics/matrix_tools.h>
+
+#include <complex>
+
+using namespace dealii;
+
+int main()
+{
+  initlog();
+  deallog << std::setprecision(10);
+
+  static const int dim = 2;
+
+  Triangulation<dim> triangulation;
+  GridGenerator::hyper_cube (triangulation);
+  triangulation.refine_global(2);
+
+  MappingQ1<dim> mapping_q1;
+  FE_Q<dim> q1(1);
+  DoFHandler<dim> dof_handler(triangulation);
+  dof_handler.distribute_dofs(q1);
+
+  DynamicSparsityPattern dsp(dof_handler.n_dofs(), dof_handler.n_dofs());
+  DoFTools::make_sparsity_pattern(dof_handler, dsp);
+  dsp.compress();
+  SparsityPattern sparsity_pattern;
+  sparsity_pattern.copy_from(dsp);
+  sparsity_pattern.compress();
+
+  // use a real valued matrix and rely on the template overloads of vmult,
+  // etc. to also work with std::complex<double>
+  SparseMatrix<double> a (sparsity_pattern);
+  SparseMatrix<double> b (sparsity_pattern);
+
+  QGauss<dim> quadrature(4);
+  MatrixCreator::create_laplace_matrix(mapping_q1, dof_handler, quadrature, a);
+  MatrixCreator::create_mass_matrix(mapping_q1, dof_handler, quadrature, b);
+
+
+  // Constructors and assignment:
+
+  auto op_a = linear_operator<dealii::Vector<std::complex<double>>>(a);
+  auto op_b = linear_operator<dealii::Vector<std::complex<double>>>(b);
+
+  {
+    LinearOperator<dealii::Vector<std::complex<double>>> op_x (a);
+    op_a = a;
+    op_b = b;
+  }
+
+  // vmult:
+
+  Vector<std::complex<double>> u;
+  op_a.reinit_domain_vector(u, true);
+  for (unsigned int i = 0; i < u.size(); ++i) {
+    u[i] = (std::complex<double>)(i+1);
+  }
+
+  deallog << "u: " << u << std::endl;
+
+  Vector<std::complex<double>> v;
+  op_a.reinit_domain_vector(v, false);
+  Vector<std::complex<double>> w;
+  op_a.reinit_domain_vector(w, false);
+  Vector<std::complex<double>> x;
+  op_a.reinit_domain_vector(x, false);
+
+  op_a.vmult(v, u);
+  deallog << "Au: " << v << std::endl;
+
+  op_b.vmult(w, u);
+  deallog << "Bu: " << w << std::endl;
+
+  // operator+, operator-, operator+=, operator-=:
+
+  x = v;
+  x += w;
+  deallog << "Au+Bu: " << x << std::endl;
+
+  (op_a + op_b).vmult(x, u);
+  deallog << "(A+B)u: " << x << std::endl;
+
+  auto op_x = op_a;
+  op_x += op_b;
+  op_x.vmult(x, u);
+  deallog << "(A+=B)u: " << x << std::endl;
+
+  x = v;
+  x -= w;
+  deallog << "Au-Bu: " << x << std::endl;
+
+  (op_a - op_b).vmult(x, u);
+  deallog << "(A-B)u: " << x << std::endl;
+
+  op_x = op_a;
+  op_x -= op_b;
+  op_x.vmult(x, u);
+  deallog << "(A-=B)u: " << x << std::endl;
+
+  // operator*, operator*=
+
+  op_b.vmult(v,u);
+  op_a.vmult(w,v);
+  deallog << "(A(Bu)): " << w << std::endl;
+
+  (op_a * op_b).vmult(x, u);
+  deallog << "(A*B)u: " << x << std::endl;
+
+  op_x = op_a;
+  op_x *= op_b;
+  op_x.vmult(x, u);
+  deallog << "(A*=B)u: " << x << std::endl;
+
+  op_x *= std::complex<double>(4.);
+  op_x.vmult(x, u);
+  deallog << "(A*=B*=4.)u: " << x << std::endl;
+
+  // solver interface:
+
+  // TODO: Well, update as soon as SolverCG can work with complex data
+  // types.
+}
diff --git a/tests/lac/linear_operator_02a.with_cxx11=on.output b/tests/lac/linear_operator_02a.with_cxx11=on.output
new file mode 100644 (file)
index 0000000..4b35304
--- /dev/null
@@ -0,0 +1,27 @@
+
+DEAL::u: (1.000000000,0.000000000) (2.000000000,0.000000000) (3.000000000,0.000000000) (4.000000000,0.000000000) (5.000000000,0.000000000) (6.000000000,0.000000000) (7.000000000,0.000000000) (8.000000000,0.000000000) (9.000000000,0.000000000) (10.00000000,0.000000000) (11.00000000,0.000000000) (12.00000000,0.000000000) (13.00000000,0.000000000) (14.00000000,0.000000000) (15.00000000,0.000000000) (16.00000000,0.000000000) (17.00000000,0.000000000) (18.00000000,0.000000000) (19.00000000,0.000000000) (20.00000000,0.000000000) (21.00000000,0.000000000) (22.00000000,0.000000000) (23.00000000,0.000000000) (24.00000000,0.000000000) (25.00000000,0.000000000) 
+DEAL::
+DEAL::Au: (-1.500000000,0.000000000) (-2.666666667,0.000000000) (-2.000000000,0.000000000) (-3.000000000,0.000000000) (-2.333333333,0.000000000) (-5.000000000,0.000000000) (-3.500000000,0.000000000) (-5.333333333,0.000000000) (-9.333333333,0.000000000) (0.5000000000,0.000000000) (1.333333333,0.000000000) (0.5000000000,0.000000000) (1.166666667,0.000000000) (-1.666666667,0.000000000) (-1.666666667,0.000000000) (2.000000000,0.000000000) (6.000000000,0.000000000) (3.000000000,0.000000000) (1.000000000,0.000000000) (3.000000000,0.000000000) (1.666666667,0.000000000) (9.000000000,0.000000000) (4.000000000,0.000000000) (3.333333333,0.000000000) (1.500000000,0.000000000) 
+DEAL::
+DEAL::Bu: (0.03125000000,0.000000000) (0.09201388889,0.000000000) (0.1145833333,0.000000000) (0.2812500000,0.000000000) (0.1788194444,0.000000000) (0.4270833333,0.000000000) (0.2552083333,0.000000000) (0.5538194444,0.000000000) (0.6631944444,0.000000000) (0.3072916667,0.000000000) (0.6753472222,0.000000000) (0.1822916667,0.000000000) (0.3923611111,0.000000000) (0.8888888889,0.000000000) (0.4878472222,0.000000000) (0.4791666667,0.000000000) (1.000000000,0.000000000) (1.093750000,0.000000000) (0.2864583333,0.000000000) (0.5937500000,0.000000000) (0.6371527778,0.000000000) (1.281250000,0.000000000) (0.6770833333,0.000000000) (0.7170138889,0.000000000) (0.3750000000,0.000000000) 
+DEAL::
+DEAL::Au+Bu: (-1.468750000,0.000000000) (-2.574652778,0.000000000) (-1.885416667,0.000000000) (-2.718750000,0.000000000) (-2.154513889,0.000000000) (-4.572916667,0.000000000) (-3.244791667,0.000000000) (-4.779513889,0.000000000) (-8.670138889,0.000000000) (0.8072916667,0.000000000) (2.008680556,0.000000000) (0.6822916667,0.000000000) (1.559027778,0.000000000) (-0.7777777778,0.000000000) (-1.178819444,0.000000000) (2.479166667,0.000000000) (7.000000000,0.000000000) (4.093750000,0.000000000) (1.286458333,0.000000000) (3.593750000,0.000000000) (2.303819444,0.000000000) (10.28125000,0.000000000) (4.677083333,0.000000000) (4.050347222,0.000000000) (1.875000000,0.000000000) 
+DEAL::
+DEAL::(A+B)u: (-1.468750000,0.000000000) (-2.574652778,0.000000000) (-1.885416667,0.000000000) (-2.718750000,0.000000000) (-2.154513889,0.000000000) (-4.572916667,0.000000000) (-3.244791667,0.000000000) (-4.779513889,0.000000000) (-8.670138889,0.000000000) (0.8072916667,0.000000000) (2.008680556,0.000000000) (0.6822916667,0.000000000) (1.559027778,0.000000000) (-0.7777777778,0.000000000) (-1.178819444,0.000000000) (2.479166667,0.000000000) (7.000000000,0.000000000) (4.093750000,0.000000000) (1.286458333,0.000000000) (3.593750000,0.000000000) (2.303819444,0.000000000) (10.28125000,0.000000000) (4.677083333,0.000000000) (4.050347222,0.000000000) (1.875000000,0.000000000) 
+DEAL::
+DEAL::(A+=B)u: (-1.468750000,0.000000000) (-2.574652778,0.000000000) (-1.885416667,0.000000000) (-2.718750000,0.000000000) (-2.154513889,0.000000000) (-4.572916667,0.000000000) (-3.244791667,0.000000000) (-4.779513889,0.000000000) (-8.670138889,0.000000000) (0.8072916667,0.000000000) (2.008680556,0.000000000) (0.6822916667,0.000000000) (1.559027778,0.000000000) (-0.7777777778,0.000000000) (-1.178819444,0.000000000) (2.479166667,0.000000000) (7.000000000,0.000000000) (4.093750000,0.000000000) (1.286458333,0.000000000) (3.593750000,0.000000000) (2.303819444,0.000000000) (10.28125000,0.000000000) (4.677083333,0.000000000) (4.050347222,0.000000000) (1.875000000,0.000000000) 
+DEAL::
+DEAL::Au-Bu: (-1.531250000,0.000000000) (-2.758680556,0.000000000) (-2.114583333,0.000000000) (-3.281250000,0.000000000) (-2.512152778,0.000000000) (-5.427083333,0.000000000) (-3.755208333,0.000000000) (-5.887152778,0.000000000) (-9.996527778,0.000000000) (0.1927083333,0.000000000) (0.6579861111,0.000000000) (0.3177083333,0.000000000) (0.7743055556,0.000000000) (-2.555555556,0.000000000) (-2.154513889,0.000000000) (1.520833333,0.000000000) (5.000000000,0.000000000) (1.906250000,0.000000000) (0.7135416667,0.000000000) (2.406250000,0.000000000) (1.029513889,0.000000000) (7.718750000,0.000000000) (3.322916667,0.000000000) (2.616319444,0.000000000) (1.125000000,0.000000000) 
+DEAL::
+DEAL::(A-B)u: (-1.531250000,0.000000000) (-2.758680556,0.000000000) (-2.114583333,0.000000000) (-3.281250000,0.000000000) (-2.512152778,0.000000000) (-5.427083333,0.000000000) (-3.755208333,0.000000000) (-5.887152778,0.000000000) (-9.996527778,0.000000000) (0.1927083333,0.000000000) (0.6579861111,0.000000000) (0.3177083333,0.000000000) (0.7743055556,0.000000000) (-2.555555556,0.000000000) (-2.154513889,0.000000000) (1.520833333,0.000000000) (5.000000000,0.000000000) (1.906250000,0.000000000) (0.7135416667,0.000000000) (2.406250000,0.000000000) (1.029513889,0.000000000) (7.718750000,0.000000000) (3.322916667,0.000000000) (2.616319444,0.000000000) (1.125000000,0.000000000) 
+DEAL::
+DEAL::(A-=B)u: (-1.531250000,0.000000000) (-2.758680556,0.000000000) (-2.114583333,0.000000000) (-3.281250000,0.000000000) (-2.512152778,0.000000000) (-5.427083333,0.000000000) (-3.755208333,0.000000000) (-5.887152778,0.000000000) (-9.996527778,0.000000000) (0.1927083333,0.000000000) (0.6579861111,0.000000000) (0.3177083333,0.000000000) (0.7743055556,0.000000000) (-2.555555556,0.000000000) (-2.154513889,0.000000000) (1.520833333,0.000000000) (5.000000000,0.000000000) (1.906250000,0.000000000) (0.7135416667,0.000000000) (2.406250000,0.000000000) (1.029513889,0.000000000) (7.718750000,0.000000000) (3.322916667,0.000000000) (2.616319444,0.000000000) (1.125000000,0.000000000) 
+DEAL::
+DEAL::(A(Bu)): (-0.1073495370,0.000000000) (-0.1866319444,0.000000000) (-0.2039930556,0.000000000) (-0.02199074074,0.000000000) (-0.2893518519,0.000000000) (-0.07465277778,0.000000000) (-0.3703703704,0.000000000) (0.03877314815,0.000000000) (-0.2986111111,0.000000000) (-0.1487268519,0.000000000) (0.6250000000,0.000000000) (-0.2201967593,0.000000000) (-0.2123842593,0.000000000) (0.4710648148,0.000000000) (-0.4762731481,0.000000000) (-0.1672453704,0.000000000) (1.145833333,0.000000000) (0.8049768519,0.000000000) (-0.3211805556,0.000000000) (-0.2199074074,0.000000000) (-0.4939236111,0.000000000) (1.570023148,0.000000000) (-0.2034143519,0.000000000) (-0.2300347222,0.000000000) (-0.4094328704,0.000000000) 
+DEAL::
+DEAL::(A*B)u: (-0.1073495370,0.000000000) (-0.1866319444,0.000000000) (-0.2039930556,0.000000000) (-0.02199074074,0.000000000) (-0.2893518519,0.000000000) (-0.07465277778,0.000000000) (-0.3703703704,0.000000000) (0.03877314815,0.000000000) (-0.2986111111,0.000000000) (-0.1487268519,0.000000000) (0.6250000000,0.000000000) (-0.2201967593,0.000000000) (-0.2123842593,0.000000000) (0.4710648148,0.000000000) (-0.4762731481,0.000000000) (-0.1672453704,0.000000000) (1.145833333,0.000000000) (0.8049768519,0.000000000) (-0.3211805556,0.000000000) (-0.2199074074,0.000000000) (-0.4939236111,0.000000000) (1.570023148,0.000000000) (-0.2034143519,0.000000000) (-0.2300347222,0.000000000) (-0.4094328704,0.000000000) 
+DEAL::
+DEAL::(A*=B)u: (-0.1073495370,0.000000000) (-0.1866319444,0.000000000) (-0.2039930556,0.000000000) (-0.02199074074,0.000000000) (-0.2893518519,0.000000000) (-0.07465277778,0.000000000) (-0.3703703704,0.000000000) (0.03877314815,0.000000000) (-0.2986111111,0.000000000) (-0.1487268519,0.000000000) (0.6250000000,0.000000000) (-0.2201967593,0.000000000) (-0.2123842593,0.000000000) (0.4710648148,0.000000000) (-0.4762731481,0.000000000) (-0.1672453704,0.000000000) (1.145833333,0.000000000) (0.8049768519,0.000000000) (-0.3211805556,0.000000000) (-0.2199074074,0.000000000) (-0.4939236111,0.000000000) (1.570023148,0.000000000) (-0.2034143519,0.000000000) (-0.2300347222,0.000000000) (-0.4094328704,0.000000000) 
+DEAL::
+DEAL::(A*=B*=4.)u: (-0.4293981481,0.000000000) (-0.7465277778,0.000000000) (-0.8159722222,0.000000000) (-0.08796296296,0.000000000) (-1.157407407,0.000000000) (-0.2986111111,0.000000000) (-1.481481481,0.000000000) (0.1550925926,0.000000000) (-1.194444444,0.000000000) (-0.5949074074,0.000000000) (2.500000000,0.000000000) (-0.8807870370,0.000000000) (-0.8495370370,0.000000000) (1.884259259,0.000000000) (-1.905092593,0.000000000) (-0.6689814815,0.000000000) (4.583333333,0.000000000) (3.219907407,0.000000000) (-1.284722222,0.000000000) (-0.8796296296,0.000000000) (-1.975694444,0.000000000) (6.280092593,0.000000000) (-0.8136574074,0.000000000) (-0.9201388889,0.000000000) (-1.637731481,0.000000000) 
+DEAL::

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.