From: Matthias Maier Date: Wed, 8 Apr 2015 19:46:18 +0000 (+0200) Subject: Implement block_linop X-Git-Tag: v8.3.0-rc1~242^2~14 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9345b4b8118167ec7d8a2123d0c7a0f6d5fcbd72;p=dealii.git Implement block_linop --- diff --git a/include/deal.II/lac/linear_operator.h b/include/deal.II/lac/linear_operator.h index fb5c1d9028..d95e21dcf2 100644 --- a/include/deal.II/lac/linear_operator.h +++ b/include/deal.II/lac/linear_operator.h @@ -23,6 +23,7 @@ #ifdef DEAL_II_WITH_CXX11 #include +#include DEAL_II_NAMESPACE_OPEN @@ -582,6 +583,115 @@ inverse_linop(Solver &solver, } + +/** + * A function that encapsulates a given collection @p ops of + * LinearOperators into a block structure. Hereby, it is assumed that Range + * and Domain are blockvectors, i.e., derived from @ref + * BlockVectorBase. The individual linear operators in @p + * ops must act on a the underlying vector type of the block vectors, i.e., + * on Domain::BlockType yielding a result in Range::BlockType. + * + * The list @p ops is best passed as an initializer list. Consider for + * example a linear operator block (acting on Vector) + * @code + * op_a00 | op_a01 + * | + * --------------- + * | + * op_a10 | op_a11 + * @endcode + * the coresponding block_linop invocation takes the form + * @code + * block_linop<2, 2, BlockVector>({op_a00, op_a01, op_a10, op_a11}); + * @endcode + */ +template , + typename Domain = Range> +LinearOperator +block_linop(const std::array, n>, m> &ops) +{ + static_assert(m > 0 && n > 0, + "a blocked LinearOperator must consist of at least one block"); + + LinearOperator return_op; + + return_op.reinit_range_vector = [ops](Range &v, bool fast) + { + // Reinitialize the block vector to m blocks: + v.reinit(m); + + // And reinitialize every individual block with reinit_range_vectors: + for (unsigned int i = 0; i < m; ++i) + ops[i][0].reinit_range_vector(v.block(i), fast); + + v.collect_sizes(); + }; + + return_op.reinit_domain_vector = [ops](Domain &v, bool fast) + { + // Reinitialize the block vector to n blocks: + v.reinit(n); + + // And reinitialize every individual block with reinit_domain_vectors: + for (unsigned int i = 0; i < n; ++i) + ops[0][i].reinit_domain_vector(v.block(i), fast); + + v.collect_sizes(); + }; + + return_op.vmult = [ops](Range &v, const Domain &u) + { + Assert(v.n_blocks() == m, ExcDimensionMismatch(v.n_blocks(), m)); + Assert(u.n_blocks() == n, ExcDimensionMismatch(u.n_blocks(), n)); + + for (unsigned int i = 0; i < m; ++i) + { + ops[i][0].vmult(v.block(i), u.block(0)); + for (unsigned int j = 1; j < n; ++j) + ops[i][j].vmult_add(v.block(i), u.block(j)); + } + }; + + return_op.vmult_add = [ops](Range &v, const Domain &u) + { + Assert(v.n_blocks() == m, ExcDimensionMismatch(v.n_blocks(), m)); + Assert(u.n_blocks() == n, ExcDimensionMismatch(u.n_blocks(), n)); + + for (unsigned int i = 0; i < m; ++i) + for (unsigned int j = 0; j < n; ++j) + ops[i][j].vmult_add(v.block(i), u.block(j)); + }; + + return_op.Tvmult = [ops](Domain &v, const Range &u) + { + Assert(v.n_blocks() == n, ExcDimensionMismatch(v.n_blocks(), n)); + Assert(u.n_blocks() == m, ExcDimensionMismatch(u.n_blocks(), m)); + + for (unsigned int i = 0; i < n; ++i) + { + ops[0][i].Tvmult(v.block(i), u.block(0)); + for (unsigned int j = 1; j < m; ++j) + ops[j][i].Tvmult_add(v.block(i), u.block(j)); + } + }; + + return_op.Tvmult_add = [ops](Domain &v, const Range &u) + { + Assert(v.n_blocks() == n, ExcDimensionMismatch(v.n_blocks(), n)); + Assert(u.n_blocks() == m, ExcDimensionMismatch(u.n_blocks(), m)); + + for (unsigned int i = 0; i < n; ++i) + for (unsigned int j = 0; j < m; ++j) + ops[j][i].Tvmult_add(v.block(i), u.block(j)); + }; + + return return_op; +} + + + /** * A factory class that is responsible for the creation of a * reinit_range_vector object for a given pair of vector type Range and matrix diff --git a/tests/lac/linear_operator_05.cc b/tests/lac/linear_operator_05.cc new file mode 100644 index 0000000000..0a66e8903b --- /dev/null +++ b/tests/lac/linear_operator_05.cc @@ -0,0 +1,218 @@ +// --------------------------------------------------------------------- +// +// 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. +// +// --------------------------------------------------------------------- + +// Tests for block_linop + +#include "../tests.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PRINTME(name, var) \ + deallog << "Block vector: " name << ":" << std::endl; \ + for (unsigned int i = 0; i < var.n_blocks(); ++i) \ + deallog << "[block " << i << " ] " << var.block(i); + + +using namespace dealii; + +int main() +{ + initlog(); + deallog << std::setprecision(10); + + static const int dim = 2; + + Triangulation triangulation; + GridGenerator::hyper_cube (triangulation); + triangulation.refine_global(2); + + MappingQ1 mapping_q1; + FESystem fe(FE_Q(2), 1, FE_Q(1), 1); + DoFHandler dof_handler(triangulation); + + dof_handler.distribute_dofs(fe); + + std::vector dofs_per_component (2); + DoFTools::count_dofs_per_component (dof_handler, dofs_per_component); + const unsigned int n_u = dofs_per_component[0], + n_p = dofs_per_component[1]; + + BlockDynamicSparsityPattern dsp(2, 2); + dsp.block(0, 0).reinit (n_u, n_u); + dsp.block(1, 0).reinit (n_p, n_u); + dsp.block(0, 1).reinit (n_u, n_p); + dsp.block(1, 1).reinit (n_p, n_p); + + for (unsigned int i = 0; i < n_u; ++i) { + for (unsigned int j = 0; j < n_u; ++j) + dsp.block(0, 0).add(i, j); + for (unsigned int j = 0; j < n_p; ++j) { + dsp.block(0, 1).add(i, j); + dsp.block(1, 0).add(j, i); + } + } + for (unsigned int i = 0; i < n_p; ++i) + for (unsigned int j = 0; j < n_p; ++j) + dsp.block(1, 1).add(i, j); + dsp.collect_sizes (); + + BlockSparsityPattern sparsity_pattern; + sparsity_pattern.copy_from(dsp); + sparsity_pattern.compress(); + + BlockSparseMatrix a (sparsity_pattern); + + // Come up with some simple, but non-trivial structure: + + for(unsigned int i = 0; i < a.block(0, 0).n(); ++i) + a.block(0, 0).set(i, i, 10.); + + for(unsigned int i = 0; i < a.block(1, 1).n(); ++i) + a.block(1, 1).set(i, i, 5.); + + for(unsigned int i = 0; i < a.block(1, 0).m(); ++i) + a.block(0, 1).set(i, i, 3.); + + for(unsigned int i = 0; i < a.block(0, 1).n(); ++i) + a.block(1, 0).set(i, i, 1.); + + + auto op_a = linop>(a); + + auto op_b00 = linop(a.block(0, 0)); + auto op_b01 = linop(a.block(0, 1)); + auto op_b10 = linop(a.block(1, 0)); + auto op_b11 = linop(a.block(1, 1)); + + auto op_b = + block_linop<2, 2, BlockVector>({op_b00, op_b01, op_b10, op_b11}); + + // vmult: + + BlockVector u; + op_a.reinit_domain_vector(u, false); + for (unsigned int i = 0; i < u.size(); ++i) { + u[i] = (double)(i+1); + } + + PRINTME("u", u); + + BlockVector v; + op_a.reinit_domain_vector(v, false); + BlockVector w; + op_a.reinit_domain_vector(w, false); + BlockVector x; + op_a.reinit_domain_vector(x, false); + + op_a.vmult(v, u); + PRINTME("Au", v); + + op_b.vmult(w, u); + PRINTME("Bu", w); + + x = v; + x -= w; + PRINTME("Au-Bu", x); + + // Test that both objects give the same results: + + auto op_x = op_a - op_b; + + op_x.vmult(x, u); + PRINTME("vmult", x); + + x = 0.; + op_x.vmult_add(x, u); + PRINTME("vmult_add", x); + + op_x.Tvmult(x, u); + PRINTME("Tvmult", x); + + x = 0.; + op_x.Tvmult_add(x, u); + PRINTME("Tvmult_add", x); + + + // Test vector reinitalization: + + op_x = op_b * op_b * op_b; + op_x.vmult(x, u); + PRINTME("(B*B*B) vmult", x); + + x = 0.; + op_x.vmult_add(x, u); + PRINTME("(B*B*B) vmult_add", x); + + op_x.Tvmult(x, u); + PRINTME("(B*B*B) Tvmult", x); + + x = 0.; + op_x.Tvmult_add(x, u); + PRINTME("(B*B*B) Tvmult_add", x); + + // And finally complicated block structures: + + auto op_upp_x_upu = block_linop<3, 3, BlockVector>( + {op_b00, op_b01, op_b00, op_b10, op_b11, op_b10, op_b10, op_b11, op_b10}); + + op_upp_x_upu.reinit_domain_vector(u, false); + for (unsigned int i = 0; i < u.size(); ++i) { + u[i] = (double)(i+1); + } + PRINTME("u", u); + + op_upp_x_upu.reinit_range_vector(v, false); + op_upp_x_upu.vmult(v, u); + PRINTME("v", v); + + v = 0.; + op_upp_x_upu.vmult_add(v, u); + PRINTME("v", v); + + auto op_upp_x_p = + block_linop<3, 1, BlockVector>({op_b01, op_b11, op_b11}); + + auto op_u_x_upu = + block_linop<1, 3, BlockVector>({op_b00, op_b01, op_b00}); + + auto op_long = op_u_x_upu * transpose_linop(op_upp_x_upu) * op_upp_x_p; + + op_long.reinit_domain_vector(u, false); + for (unsigned int i = 0; i < u.size(); ++i) { + u[i] = (double)(i+1); + } + PRINTME("u", u); + + op_long.reinit_range_vector(v, false); + op_long.vmult(v, u); + PRINTME("v", v); + + v = 0.; + op_long.vmult_add(v, u); + PRINTME("v", v); + +} + + + diff --git a/tests/lac/linear_operator_05.with_cxx11=on.output b/tests/lac/linear_operator_05.with_cxx11=on.output new file mode 100644 index 0000000000..0841217c73 --- /dev/null +++ b/tests/lac/linear_operator_05.with_cxx11=on.output @@ -0,0 +1,55 @@ + +DEAL::Block vector: u: +DEAL::[block 0 ] 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 26.00000000 27.00000000 28.00000000 29.00000000 30.00000000 31.00000000 32.00000000 33.00000000 34.00000000 35.00000000 36.00000000 37.00000000 38.00000000 39.00000000 40.00000000 41.00000000 42.00000000 43.00000000 44.00000000 45.00000000 46.00000000 47.00000000 48.00000000 49.00000000 50.00000000 51.00000000 52.00000000 53.00000000 54.00000000 55.00000000 56.00000000 57.00000000 58.00000000 59.00000000 60.00000000 61.00000000 62.00000000 63.00000000 64.00000000 65.00000000 66.00000000 67.00000000 68.00000000 69.00000000 70.00000000 71.00000000 72.00000000 73.00000000 74.00000000 75.00000000 76.00000000 77.00000000 78.00000000 79.00000000 80.00000000 81.00000000 +DEAL::[block 1 ] 82.00000000 83.00000000 84.00000000 85.00000000 86.00000000 87.00000000 88.00000000 89.00000000 90.00000000 91.00000000 92.00000000 93.00000000 94.00000000 95.00000000 96.00000000 97.00000000 98.00000000 99.00000000 100.0000000 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 +DEAL::Block vector: Au: +DEAL::[block 0 ] 256.0000000 269.0000000 282.0000000 295.0000000 308.0000000 321.0000000 334.0000000 347.0000000 360.0000000 373.0000000 386.0000000 399.0000000 412.0000000 425.0000000 438.0000000 451.0000000 464.0000000 477.0000000 490.0000000 503.0000000 516.0000000 529.0000000 542.0000000 555.0000000 568.0000000 260.0000000 270.0000000 280.0000000 290.0000000 300.0000000 310.0000000 320.0000000 330.0000000 340.0000000 350.0000000 360.0000000 370.0000000 380.0000000 390.0000000 400.0000000 410.0000000 420.0000000 430.0000000 440.0000000 450.0000000 460.0000000 470.0000000 480.0000000 490.0000000 500.0000000 510.0000000 520.0000000 530.0000000 540.0000000 550.0000000 560.0000000 570.0000000 580.0000000 590.0000000 600.0000000 610.0000000 620.0000000 630.0000000 640.0000000 650.0000000 660.0000000 670.0000000 680.0000000 690.0000000 700.0000000 710.0000000 720.0000000 730.0000000 740.0000000 750.0000000 760.0000000 770.0000000 780.0000000 790.0000000 800.0000000 810.0000000 +DEAL::[block 1 ] 411.0000000 417.0000000 423.0000000 429.0000000 435.0000000 441.0000000 447.0000000 453.0000000 459.0000000 465.0000000 471.0000000 477.0000000 483.0000000 489.0000000 495.0000000 501.0000000 507.0000000 513.0000000 519.0000000 525.0000000 531.0000000 537.0000000 543.0000000 549.0000000 555.0000000 +DEAL::Block vector: Bu: +DEAL::[block 0 ] 256.0000000 269.0000000 282.0000000 295.0000000 308.0000000 321.0000000 334.0000000 347.0000000 360.0000000 373.0000000 386.0000000 399.0000000 412.0000000 425.0000000 438.0000000 451.0000000 464.0000000 477.0000000 490.0000000 503.0000000 516.0000000 529.0000000 542.0000000 555.0000000 568.0000000 260.0000000 270.0000000 280.0000000 290.0000000 300.0000000 310.0000000 320.0000000 330.0000000 340.0000000 350.0000000 360.0000000 370.0000000 380.0000000 390.0000000 400.0000000 410.0000000 420.0000000 430.0000000 440.0000000 450.0000000 460.0000000 470.0000000 480.0000000 490.0000000 500.0000000 510.0000000 520.0000000 530.0000000 540.0000000 550.0000000 560.0000000 570.0000000 580.0000000 590.0000000 600.0000000 610.0000000 620.0000000 630.0000000 640.0000000 650.0000000 660.0000000 670.0000000 680.0000000 690.0000000 700.0000000 710.0000000 720.0000000 730.0000000 740.0000000 750.0000000 760.0000000 770.0000000 780.0000000 790.0000000 800.0000000 810.0000000 +DEAL::[block 1 ] 411.0000000 417.0000000 423.0000000 429.0000000 435.0000000 441.0000000 447.0000000 453.0000000 459.0000000 465.0000000 471.0000000 477.0000000 483.0000000 489.0000000 495.0000000 501.0000000 507.0000000 513.0000000 519.0000000 525.0000000 531.0000000 537.0000000 543.0000000 549.0000000 555.0000000 +DEAL::Block vector: Au-Bu: +DEAL::[block 0 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::[block 1 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: vmult: +DEAL::[block 0 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::[block 1 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: vmult_add: +DEAL::[block 0 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::[block 1 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: Tvmult: +DEAL::[block 0 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::[block 1 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: Tvmult_add: +DEAL::[block 0 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::[block 1 ] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: (B*B*B) vmult: +DEAL::[block 0 ] 44863.00000 46472.00000 48081.00000 49690.00000 51299.00000 52908.00000 54517.00000 56126.00000 57735.00000 59344.00000 60953.00000 62562.00000 64171.00000 65780.00000 67389.00000 68998.00000 70607.00000 72216.00000 73825.00000 75434.00000 77043.00000 78652.00000 80261.00000 81870.00000 83479.00000 26000.00000 27000.00000 28000.00000 29000.00000 30000.00000 31000.00000 32000.00000 33000.00000 34000.00000 35000.00000 36000.00000 37000.00000 38000.00000 39000.00000 40000.00000 41000.00000 42000.00000 43000.00000 44000.00000 45000.00000 46000.00000 47000.00000 48000.00000 49000.00000 50000.00000 51000.00000 52000.00000 53000.00000 54000.00000 55000.00000 56000.00000 57000.00000 58000.00000 59000.00000 60000.00000 61000.00000 62000.00000 63000.00000 64000.00000 65000.00000 66000.00000 67000.00000 68000.00000 69000.00000 70000.00000 71000.00000 72000.00000 73000.00000 74000.00000 75000.00000 76000.00000 77000.00000 78000.00000 79000.00000 80000.00000 81000.00000 +DEAL::[block 1 ] 15348.00000 15711.00000 16074.00000 16437.00000 16800.00000 17163.00000 17526.00000 17889.00000 18252.00000 18615.00000 18978.00000 19341.00000 19704.00000 20067.00000 20430.00000 20793.00000 21156.00000 21519.00000 21882.00000 22245.00000 22608.00000 22971.00000 23334.00000 23697.00000 24060.00000 +DEAL::Block vector: (B*B*B) vmult_add: +DEAL::[block 0 ] 44863.00000 46472.00000 48081.00000 49690.00000 51299.00000 52908.00000 54517.00000 56126.00000 57735.00000 59344.00000 60953.00000 62562.00000 64171.00000 65780.00000 67389.00000 68998.00000 70607.00000 72216.00000 73825.00000 75434.00000 77043.00000 78652.00000 80261.00000 81870.00000 83479.00000 26000.00000 27000.00000 28000.00000 29000.00000 30000.00000 31000.00000 32000.00000 33000.00000 34000.00000 35000.00000 36000.00000 37000.00000 38000.00000 39000.00000 40000.00000 41000.00000 42000.00000 43000.00000 44000.00000 45000.00000 46000.00000 47000.00000 48000.00000 49000.00000 50000.00000 51000.00000 52000.00000 53000.00000 54000.00000 55000.00000 56000.00000 57000.00000 58000.00000 59000.00000 60000.00000 61000.00000 62000.00000 63000.00000 64000.00000 65000.00000 66000.00000 67000.00000 68000.00000 69000.00000 70000.00000 71000.00000 72000.00000 73000.00000 74000.00000 75000.00000 76000.00000 77000.00000 78000.00000 79000.00000 80000.00000 81000.00000 +DEAL::[block 1 ] 15348.00000 15711.00000 16074.00000 16437.00000 16800.00000 17163.00000 17526.00000 17889.00000 18252.00000 18615.00000 18978.00000 19341.00000 19704.00000 20067.00000 20430.00000 20793.00000 21156.00000 21519.00000 21882.00000 22245.00000 22608.00000 22971.00000 23334.00000 23697.00000 24060.00000 +DEAL::Block vector: (B*B*B) Tvmult: +DEAL::[block 0 ] 15671.00000 16924.00000 18177.00000 19430.00000 20683.00000 21936.00000 23189.00000 24442.00000 25695.00000 26948.00000 28201.00000 29454.00000 30707.00000 31960.00000 33213.00000 34466.00000 35719.00000 36972.00000 38225.00000 39478.00000 40731.00000 41984.00000 43237.00000 44490.00000 45743.00000 26000.00000 27000.00000 28000.00000 29000.00000 30000.00000 31000.00000 32000.00000 33000.00000 34000.00000 35000.00000 36000.00000 37000.00000 38000.00000 39000.00000 40000.00000 41000.00000 42000.00000 43000.00000 44000.00000 45000.00000 46000.00000 47000.00000 48000.00000 49000.00000 50000.00000 51000.00000 52000.00000 53000.00000 54000.00000 55000.00000 56000.00000 57000.00000 58000.00000 59000.00000 60000.00000 61000.00000 62000.00000 63000.00000 64000.00000 65000.00000 66000.00000 67000.00000 68000.00000 69000.00000 70000.00000 71000.00000 72000.00000 73000.00000 74000.00000 75000.00000 76000.00000 77000.00000 78000.00000 79000.00000 80000.00000 81000.00000 +DEAL::[block 1 ] 15704.00000 16423.00000 17142.00000 17861.00000 18580.00000 19299.00000 20018.00000 20737.00000 21456.00000 22175.00000 22894.00000 23613.00000 24332.00000 25051.00000 25770.00000 26489.00000 27208.00000 27927.00000 28646.00000 29365.00000 30084.00000 30803.00000 31522.00000 32241.00000 32960.00000 +DEAL::Block vector: (B*B*B) Tvmult_add: +DEAL::[block 0 ] 15671.00000 16924.00000 18177.00000 19430.00000 20683.00000 21936.00000 23189.00000 24442.00000 25695.00000 26948.00000 28201.00000 29454.00000 30707.00000 31960.00000 33213.00000 34466.00000 35719.00000 36972.00000 38225.00000 39478.00000 40731.00000 41984.00000 43237.00000 44490.00000 45743.00000 26000.00000 27000.00000 28000.00000 29000.00000 30000.00000 31000.00000 32000.00000 33000.00000 34000.00000 35000.00000 36000.00000 37000.00000 38000.00000 39000.00000 40000.00000 41000.00000 42000.00000 43000.00000 44000.00000 45000.00000 46000.00000 47000.00000 48000.00000 49000.00000 50000.00000 51000.00000 52000.00000 53000.00000 54000.00000 55000.00000 56000.00000 57000.00000 58000.00000 59000.00000 60000.00000 61000.00000 62000.00000 63000.00000 64000.00000 65000.00000 66000.00000 67000.00000 68000.00000 69000.00000 70000.00000 71000.00000 72000.00000 73000.00000 74000.00000 75000.00000 76000.00000 77000.00000 78000.00000 79000.00000 80000.00000 81000.00000 +DEAL::[block 1 ] 15704.00000 16423.00000 17142.00000 17861.00000 18580.00000 19299.00000 20018.00000 20737.00000 21456.00000 22175.00000 22894.00000 23613.00000 24332.00000 25051.00000 25770.00000 26489.00000 27208.00000 27927.00000 28646.00000 29365.00000 30084.00000 30803.00000 31522.00000 32241.00000 32960.00000 +DEAL::Block vector: u: +DEAL::[block 0 ] 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 26.00000000 27.00000000 28.00000000 29.00000000 30.00000000 31.00000000 32.00000000 33.00000000 34.00000000 35.00000000 36.00000000 37.00000000 38.00000000 39.00000000 40.00000000 41.00000000 42.00000000 43.00000000 44.00000000 45.00000000 46.00000000 47.00000000 48.00000000 49.00000000 50.00000000 51.00000000 52.00000000 53.00000000 54.00000000 55.00000000 56.00000000 57.00000000 58.00000000 59.00000000 60.00000000 61.00000000 62.00000000 63.00000000 64.00000000 65.00000000 66.00000000 67.00000000 68.00000000 69.00000000 70.00000000 71.00000000 72.00000000 73.00000000 74.00000000 75.00000000 76.00000000 77.00000000 78.00000000 79.00000000 80.00000000 81.00000000 +DEAL::[block 1 ] 82.00000000 83.00000000 84.00000000 85.00000000 86.00000000 87.00000000 88.00000000 89.00000000 90.00000000 91.00000000 92.00000000 93.00000000 94.00000000 95.00000000 96.00000000 97.00000000 98.00000000 99.00000000 100.0000000 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 +DEAL::[block 2 ] 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 126.0000000 127.0000000 128.0000000 129.0000000 130.0000000 131.0000000 132.0000000 133.0000000 134.0000000 135.0000000 136.0000000 137.0000000 138.0000000 139.0000000 140.0000000 141.0000000 142.0000000 143.0000000 144.0000000 145.0000000 146.0000000 147.0000000 148.0000000 149.0000000 150.0000000 151.0000000 152.0000000 153.0000000 154.0000000 155.0000000 156.0000000 157.0000000 158.0000000 159.0000000 160.0000000 161.0000000 162.0000000 163.0000000 164.0000000 165.0000000 166.0000000 167.0000000 168.0000000 169.0000000 170.0000000 171.0000000 172.0000000 173.0000000 174.0000000 175.0000000 176.0000000 177.0000000 178.0000000 179.0000000 180.0000000 181.0000000 182.0000000 183.0000000 184.0000000 185.0000000 186.0000000 187.0000000 +DEAL::Block vector: v: +DEAL::[block 0 ] 1326.000000 1349.000000 1372.000000 1395.000000 1418.000000 1441.000000 1464.000000 1487.000000 1510.000000 1533.000000 1556.000000 1579.000000 1602.000000 1625.000000 1648.000000 1671.000000 1694.000000 1717.000000 1740.000000 1763.000000 1786.000000 1809.000000 1832.000000 1855.000000 1878.000000 1580.000000 1600.000000 1620.000000 1640.000000 1660.000000 1680.000000 1700.000000 1720.000000 1740.000000 1760.000000 1780.000000 1800.000000 1820.000000 1840.000000 1860.000000 1880.000000 1900.000000 1920.000000 1940.000000 1960.000000 1980.000000 2000.000000 2020.000000 2040.000000 2060.000000 2080.000000 2100.000000 2120.000000 2140.000000 2160.000000 2180.000000 2200.000000 2220.000000 2240.000000 2260.000000 2280.000000 2300.000000 2320.000000 2340.000000 2360.000000 2380.000000 2400.000000 2420.000000 2440.000000 2460.000000 2480.000000 2500.000000 2520.000000 2540.000000 2560.000000 2580.000000 2600.000000 2620.000000 2640.000000 2660.000000 2680.000000 +DEAL::[block 1 ] 518.0000000 525.0000000 532.0000000 539.0000000 546.0000000 553.0000000 560.0000000 567.0000000 574.0000000 581.0000000 588.0000000 595.0000000 602.0000000 609.0000000 616.0000000 623.0000000 630.0000000 637.0000000 644.0000000 651.0000000 658.0000000 665.0000000 672.0000000 679.0000000 686.0000000 +DEAL::[block 2 ] 518.0000000 525.0000000 532.0000000 539.0000000 546.0000000 553.0000000 560.0000000 567.0000000 574.0000000 581.0000000 588.0000000 595.0000000 602.0000000 609.0000000 616.0000000 623.0000000 630.0000000 637.0000000 644.0000000 651.0000000 658.0000000 665.0000000 672.0000000 679.0000000 686.0000000 +DEAL::Block vector: v: +DEAL::[block 0 ] 1326.000000 1349.000000 1372.000000 1395.000000 1418.000000 1441.000000 1464.000000 1487.000000 1510.000000 1533.000000 1556.000000 1579.000000 1602.000000 1625.000000 1648.000000 1671.000000 1694.000000 1717.000000 1740.000000 1763.000000 1786.000000 1809.000000 1832.000000 1855.000000 1878.000000 1580.000000 1600.000000 1620.000000 1640.000000 1660.000000 1680.000000 1700.000000 1720.000000 1740.000000 1760.000000 1780.000000 1800.000000 1820.000000 1840.000000 1860.000000 1880.000000 1900.000000 1920.000000 1940.000000 1960.000000 1980.000000 2000.000000 2020.000000 2040.000000 2060.000000 2080.000000 2100.000000 2120.000000 2140.000000 2160.000000 2180.000000 2200.000000 2220.000000 2240.000000 2260.000000 2280.000000 2300.000000 2320.000000 2340.000000 2360.000000 2380.000000 2400.000000 2420.000000 2440.000000 2460.000000 2480.000000 2500.000000 2520.000000 2540.000000 2560.000000 2580.000000 2600.000000 2620.000000 2640.000000 2660.000000 2680.000000 +DEAL::[block 1 ] 518.0000000 525.0000000 532.0000000 539.0000000 546.0000000 553.0000000 560.0000000 567.0000000 574.0000000 581.0000000 588.0000000 595.0000000 602.0000000 609.0000000 616.0000000 623.0000000 630.0000000 637.0000000 644.0000000 651.0000000 658.0000000 665.0000000 672.0000000 679.0000000 686.0000000 +DEAL::[block 2 ] 518.0000000 525.0000000 532.0000000 539.0000000 546.0000000 553.0000000 560.0000000 567.0000000 574.0000000 581.0000000 588.0000000 595.0000000 602.0000000 609.0000000 616.0000000 623.0000000 630.0000000 637.0000000 644.0000000 651.0000000 658.0000000 665.0000000 672.0000000 679.0000000 686.0000000 +DEAL::Block vector: u: +DEAL::[block 0 ] 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL::Block vector: v: +DEAL::[block 0 ] 977.0000000 1954.000000 2931.000000 3908.000000 4885.000000 5862.000000 6839.000000 7816.000000 8793.000000 9770.000000 10747.00000 11724.00000 12701.00000 13678.00000 14655.00000 15632.00000 16609.00000 17586.00000 18563.00000 19540.00000 20517.00000 21494.00000 22471.00000 23448.00000 24425.00000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL::Block vector: v: +DEAL::[block 0 ] 977.0000000 1954.000000 2931.000000 3908.000000 4885.000000 5862.000000 6839.000000 7816.000000 8793.000000 9770.000000 10747.00000 11724.00000 12701.00000 13678.00000 14655.00000 15632.00000 16609.00000 17586.00000 18563.00000 19540.00000 20517.00000 21494.00000 22471.00000 23448.00000 24425.00000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000