From a3caf2eb33a9065c9d6a27f4e8feedff7a5e6fbe Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Mon, 22 Jul 2013 02:58:54 +0000 Subject: [PATCH] Implement VectorTools::project also for hp::DoFHandler. This required refactoring a whole bunch of other functions as well, as well as a good number of additional instantiations. git-svn-id: https://svn.dealii.org/trunk@30086 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/doc/news/changes.h | 6 + .../include/deal.II/numerics/vector_tools.h | 71 +- .../deal.II/numerics/vector_tools.templates.h | 714 ++++++++++-------- deal.II/source/dofs/dof_tools.inst.in | 10 +- deal.II/source/numerics/matrix_tools.cc | 2 +- deal.II/source/numerics/matrix_tools.inst.in | 134 ++-- deal.II/source/numerics/vector_tools.inst.in | 67 +- tests/hp/project_01.cc | 108 +++ tests/hp/project_01/cmp/generic | 585 ++++++++++++++ tests/hp/project_01_curved_boundary.cc | 177 +++++ .../hp/project_01_curved_boundary/cmp/generic | 165 ++++ tests/hp/project_02.cc | 111 +++ tests/hp/project_02/cmp/generic | 585 ++++++++++++++ 13 files changed, 2316 insertions(+), 419 deletions(-) create mode 100644 tests/hp/project_01.cc create mode 100644 tests/hp/project_01/cmp/generic create mode 100644 tests/hp/project_01_curved_boundary.cc create mode 100644 tests/hp/project_01_curved_boundary/cmp/generic create mode 100644 tests/hp/project_02.cc create mode 100644 tests/hp/project_02/cmp/generic diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h index a47b3af016..709c493e2d 100644 --- a/deal.II/doc/news/changes.h +++ b/deal.II/doc/news/changes.h @@ -164,6 +164,12 @@ this function.
    +
  1. New: VectorTools::project and a whole host of similar functions +are now also available for objects of type hp::DoFHandler. +
    +(Wolfgang Bangerth, 2013/07/21) +
  2. +
  3. Fixed: hp::DoFHandler::n_boundary_dofs() had a bug that always led to a failed assertion. This is now fixed.
    diff --git a/deal.II/include/deal.II/numerics/vector_tools.h b/deal.II/include/deal.II/numerics/vector_tools.h index 5999b2cf19..96fd9a1b7c 100644 --- a/deal.II/include/deal.II/numerics/vector_tools.h +++ b/deal.II/include/deal.II/numerics/vector_tools.h @@ -658,7 +658,7 @@ namespace VectorTools /** * Calls the project() - * function, see above, with + * function above, with * mapping=MappingQ1@(). */ template @@ -673,6 +673,40 @@ namespace VectorTools Quadrature(0)), const bool project_to_boundary_first = false); + /** + * Same as above, but for arguments of type hp::DoFHandler, + * hp::QuadratureCollection, hp::MappingCollection + */ + template + void project (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const ConstraintMatrix &constraints, + const hp::QCollection &quadrature, + const Function &function, + VECTOR &vec, + const bool enforce_zero_boundary = false, + const hp::QCollection &q_boundary = hp::QCollection(dim > 1 ? + QGauss(2) : + Quadrature(0)), + const bool project_to_boundary_first = false); + + /** + * Calls the project() + * function above, with a collection of + * MappingQ1@() objects. + */ + template + void project (const hp::DoFHandler &dof, + const ConstraintMatrix &constraints, + const hp::QCollection &quadrature, + const Function &function, + VECTOR &vec, + const bool enforce_zero_boundary = false, + const hp::QCollection &q_boundary = hp::QCollection(dim > 1 ? + QGauss(2) : + Quadrature(0)), + const bool project_to_boundary_first = false); + /** * Compute Dirichlet boundary * conditions. This function makes up a map @@ -766,6 +800,18 @@ namespace VectorTools std::map &boundary_values, const ComponentMask &component_mask = ComponentMask()); + /** + * Like the previous function, but take a mapping collection to go with + * the hp::DoFHandler object. + */ + template + void + interpolate_boundary_values (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const typename FunctionMap::type &function_map, + std::map &boundary_values, + const ComponentMask &component_mask = ComponentMask()); + /** * Same function as above, but * taking only one pair of @@ -1053,6 +1099,29 @@ namespace VectorTools std::map &boundary_values, std::vector component_mapping = std::vector()); + /** + * Same as above, but for objects of type hp::DoFHandler + */ + template + void project_boundary_values (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const typename FunctionMap::type &boundary_functions, + const hp::QCollection &q, + std::map &boundary_values, + std::vector component_mapping = std::vector()); + + /** + * Calls the project_boundary_values() + * function, see above, with + * mapping=MappingQ1@(). + */ + template + void project_boundary_values (const hp::DoFHandler &dof, + const typename FunctionMap::type &boundary_function, + const hp::QCollection &q, + std::map &boundary_values, + std::vector component_mapping = std::vector()); + /** * Project a function to the boundary of * the domain, using the given quadrature diff --git a/deal.II/include/deal.II/numerics/vector_tools.templates.h b/deal.II/include/deal.II/numerics/vector_tools.templates.h index 44e561fc95..4e8c2163be 100644 --- a/deal.II/include/deal.II/numerics/vector_tools.templates.h +++ b/deal.II/include/deal.II/numerics/vector_tools.templates.h @@ -334,57 +334,18 @@ namespace VectorTools namespace internal { + /** + * Interpolate zero boundary values. We don't need to worry about a mapping + * here because the function we evaluate for the DoFs is zero in the mapped + * locations as well as in the original, unmapped locations + */ + template void - interpolate_zero_boundary_values (const dealii::DoFHandler<1> &dof_handler, - std::map &boundary_values) - { - // we only need to find the - // left-most and right-most - // vertex and query its vertex - // dof indices. that's easy :-) - for (unsigned int direction=0; direction<2; ++direction) - { - dealii::DoFHandler<1>::cell_iterator - cell = dof_handler.begin(0); - while (!cell->at_boundary(direction)) - cell = cell->neighbor(direction); - - for (unsigned int i=0; ivertex_dof_index (direction, i)] = 0.; - } - } - - - - // codimension 1 - void - interpolate_zero_boundary_values (const dealii::DoFHandler<1,2> &dof_handler, - std::map &boundary_values) - { - // we only need to find the - // left-most and right-most - // vertex and query its vertex - // dof indices. that's easy :-) - for (unsigned int direction=0; direction<2; ++direction) - { - dealii::DoFHandler<1,2>::cell_iterator - cell = dof_handler.begin(0); - while (!cell->at_boundary(direction)) - cell = cell->neighbor(direction); - - for (unsigned int i=0; ivertex_dof_index (direction, i)] = 0.; - } - } - - - - template - void - interpolate_zero_boundary_values (const dealii::DoFHandler &dof_handler, + interpolate_zero_boundary_values (const DH &dof_handler, std::map &boundary_values) { - const FiniteElement &fe = dof_handler.get_fe(); + const unsigned int dim = DH::dimension; + const unsigned int spacedim = DH::space_dimension; // loop over all boundary faces // to get all dof indices of @@ -407,16 +368,18 @@ namespace VectorTools // that is actually wholly on // the boundary, not only by // one line or one vertex - typename dealii::DoFHandler::active_cell_iterator + typename DH::active_cell_iterator cell = dof_handler.begin_active(), endc = dof_handler.end(); - std::vector face_dof_indices (fe.dofs_per_face); + std::vector face_dof_indices; for (; cell!=endc; ++cell) for (unsigned int f=0; f::faces_per_cell; ++f) if (cell->at_boundary(f)) { - cell->face(f)->get_dof_indices (face_dof_indices); - for (unsigned int i=0; iget_fe().dofs_per_face); + cell->face(f)->get_dof_indices (face_dof_indices, + cell->active_fe_index()); + for (unsigned int i=0; iget_fe().dofs_per_face; ++i) // enter zero boundary values // for all boundary nodes // @@ -541,14 +504,17 @@ namespace VectorTools /** * Compute the boundary values to be used in the project() functions. */ - template - void project_compute_b_v (const Mapping &mapping, - const DoFHandler &dof, - const Function &function, - const bool enforce_zero_boundary, - const Quadrature &q_boundary, - const bool project_to_boundary_first, - std::map &boundary_values) + template class DH, + template class M_or_MC, + template class Q_or_QC> + void project_compute_b_v (const M_or_MC &mapping, + const DH &dof, + const Function &function, + const bool enforce_zero_boundary, + const Q_or_QC &q_boundary, + const bool project_to_boundary_first, + std::map &boundary_values) { if (enforce_zero_boundary == true) // no need to project boundary @@ -596,6 +562,101 @@ namespace VectorTools return true; } + + + /** + * Generic implementation of the project() function + */ + template class DH, + template class M_or_MC, + template class Q_or_QC> + void do_project (const M_or_MC &mapping, + const DH &dof, + const ConstraintMatrix &constraints, + const Q_or_QC &quadrature, + const Function &function, + Vector &vec_result, + const bool enforce_zero_boundary, + const Q_or_QC &q_boundary, + const bool project_to_boundary_first) + { + Assert (dof.get_fe().n_components() == function.n_components, + ExcDimensionMismatch(dof.get_fe().n_components(), + function.n_components)); + Assert (vec_result.size() == dof.n_dofs(), + ExcDimensionMismatch (vec_result.size(), dof.n_dofs())); + + // make up boundary values + std::map boundary_values; + project_compute_b_v(mapping, dof, function, enforce_zero_boundary, + q_boundary, project_to_boundary_first, boundary_values); + + // check if constraints are compatible (see below) + const bool constraints_are_compatible = + constraints_and_b_v_are_compatible(constraints, boundary_values); + + // set up mass matrix and right hand side + dealii::Vector vec (dof.n_dofs()); + SparsityPattern sparsity; + { + CompressedSimpleSparsityPattern csp (dof.n_dofs(), dof.n_dofs()); + DoFTools::make_sparsity_pattern (dof, csp, constraints, + !constraints_are_compatible); + + sparsity.copy_from (csp); + } + SparseMatrix mass_matrix (sparsity); + dealii::Vector tmp (mass_matrix.n()); + + // If the constraint matrix does not conflict with the given boundary + // values (i.e., it either does not contain boundary values or it contains + // the same as boundary_values), we can let it call + // distribute_local_to_global straight away, otherwise we need to first + // interpolate the boundary values and then condense the matrix and vector + if (constraints_are_compatible) + { + const Function *dummy = 0; + MatrixCreator::create_mass_matrix (mapping, dof, quadrature, + mass_matrix, function, tmp, + dummy, constraints); + if (boundary_values.size() > 0) + MatrixTools::apply_boundary_values (boundary_values, + mass_matrix, vec, tmp, + true); + } + else + { + // create mass matrix and rhs at once, which is faster. + MatrixCreator::create_mass_matrix (mapping, dof, quadrature, + mass_matrix, function, tmp); + MatrixTools::apply_boundary_values (boundary_values, + mass_matrix, vec, tmp, + true); + constraints.condense(mass_matrix, tmp); + } + + // Allow for a maximum of 5*n steps to reduce the residual by 10^-12. n + // steps may not be sufficient, since roundoff errors may accumulate for + // badly conditioned matrices + ReductionControl control(5*tmp.size(), 0., 1e-12, false, false); + GrowingVectorMemory<> memory; + SolverCG<> cg(control,memory); + + PreconditionSSOR<> prec; + prec.initialize(mass_matrix, 1.2); + + cg.solve (mass_matrix, vec, tmp, prec); + + constraints.distribute (vec); + + // copy vec into vec_result. we can't use vec_result itself above, since + // it may be of another type than Vector and that wouldn't + // necessarily go together with the matrix and other functions + for (unsigned int i=0; i &q_boundary, const bool project_to_boundary_first) { - Assert (dof.get_fe().n_components() == function.n_components, - ExcDimensionMismatch(dof.get_fe().n_components(), - function.n_components)); - - Assert (vec_result.size() == dof.n_dofs(), - ExcDimensionMismatch (vec_result.size(), dof.n_dofs())); - - // make up boundary values - std::map boundary_values; - project_compute_b_v(mapping, dof, function, enforce_zero_boundary, - q_boundary, project_to_boundary_first, boundary_values); - - // check if constraints are compatible (see below) - const bool constraints_are_compatible = - constraints_and_b_v_are_compatible(constraints, boundary_values); - - // set up mass matrix and right hand side - Vector vec (dof.n_dofs()); - SparsityPattern sparsity; - { - CompressedSimpleSparsityPattern csp (dof.n_dofs(), dof.n_dofs()); - DoFTools::make_sparsity_pattern (dof, csp, constraints, - !constraints_are_compatible); - - sparsity.copy_from (csp); - } - SparseMatrix mass_matrix (sparsity); - Vector tmp (mass_matrix.n()); - - // If the constraint matrix does not conflict with the given boundary - // values (i.e., it either does not contain boundary values or it contains - // the same as boundary_values), we can let it call - // distribute_local_to_global straight away, otherwise we need to first - // interpolate the boundary values and then condense the matrix and vector - if (constraints_are_compatible) - { - const Function *dummy = 0; - MatrixCreator::create_mass_matrix (mapping, dof, quadrature, - mass_matrix, function, tmp, - dummy, constraints); - if (boundary_values.size() > 0) - MatrixTools::apply_boundary_values (boundary_values, - mass_matrix, vec, tmp, - true); - } - else - { - // create mass matrix and rhs at once, which is faster. - MatrixCreator::create_mass_matrix (mapping, dof, quadrature, - mass_matrix, function, tmp); - MatrixTools::apply_boundary_values (boundary_values, - mass_matrix, vec, tmp, - true); - constraints.condense(mass_matrix, tmp); - } - - // Allow for a maximum of 5*n steps to reduce the residual by 10^-12. n - // steps may not be sufficient, since roundoff errors may accumulate for - // badly conditioned matrices - ReductionControl control(5*tmp.size(), 0., 1e-12, false, false); - GrowingVectorMemory<> memory; - SolverCG<> cg(control,memory); - - PreconditionSSOR<> prec; - prec.initialize(mass_matrix, 1.2); - - cg.solve (mass_matrix, vec, tmp, prec); - - constraints.distribute (vec); - - // copy vec into vec_result. we can't use vec_result itself above, since - // it may be of another type than Vector and that wouldn't - // necessarily go together with the matrix and other functions - for (unsigned int i=0; i + void project (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const ConstraintMatrix &constraints, + const hp::QCollection &quadrature, + const Function &function, + VECTOR &vec_result, + const bool enforce_zero_boundary, + const hp::QCollection &q_boundary, + const bool project_to_boundary_first) + { + do_project (mapping, dof, constraints, quadrature, + function, vec_result, + enforce_zero_boundary, q_boundary, + project_to_boundary_first); + } + + + template + void project (const hp::DoFHandler &dof, + const ConstraintMatrix &constraints, + const hp::QCollection &quadrature, + const Function &function, + VECTOR &vec, + const bool enforce_zero_boundary, + const hp::QCollection &q_boundary, + const bool project_to_boundary_first) + { + project(hp::StaticMappingQ1::mapping_collection, + dof, constraints, quadrature, function, vec, + enforce_zero_boundary, q_boundary, project_to_boundary_first); + } + template void create_right_hand_side (const Mapping &mapping, @@ -1507,7 +1530,7 @@ namespace VectorTools // ----------- interpolate_boundary_values for std::map -------------------- - namespace internal + namespace { // interpolate boundary values in // 1d. in higher dimensions, we @@ -1516,9 +1539,10 @@ namespace VectorTools // faces are points and it is far // easier to simply work on // individual vertices - template + template class M_or_MC> static inline - void interpolate_boundary_values (const Mapping &, + void do_interpolate_boundary_values (const M_or_MC &, const DH &dof, const typename FunctionMap::type &function_map, std::map &boundary_values, @@ -1594,10 +1618,11 @@ namespace VectorTools - template + template class M_or_MC> static inline void - interpolate_boundary_values (const Mapping &mapping, + do_interpolate_boundary_values (const M_or_MC &mapping, const DH &dof, const typename FunctionMap::type &function_map, std::map &boundary_values, @@ -1948,8 +1973,7 @@ namespace VectorTools std::map &boundary_values, const ComponentMask &component_mask_) { - internal:: - interpolate_boundary_values (mapping, dof, function_map, boundary_values, + do_interpolate_boundary_values (mapping, dof, function_map, boundary_values, component_mask_, dealii::internal::int2type()); } @@ -1972,6 +1996,20 @@ namespace VectorTools } + template + void + interpolate_boundary_values (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const typename FunctionMap::type &function_map, + std::map &boundary_values, + const ComponentMask &component_mask_) + { + do_interpolate_boundary_values (mapping, dof, function_map, boundary_values, + component_mask_, + dealii::internal::int2type()); + } + + template void @@ -2088,211 +2126,201 @@ namespace VectorTools // -------- implementation for project_boundary_values with std::map -------- -// separate implementations for 1D because otherwise we get linking errors -// because create_boundary_mass_matrix is not compiled for 1D - template <> - void - project_boundary_values (const Mapping<1,1> &mapping, - const DoFHandler<1,1> &dof, - const FunctionMap<1>::type &boundary_functions, - const Quadrature<0> &, - std::map &boundary_values, - std::vector component_mapping) - { - Assert (component_mapping.size() == 0, ExcNotImplemented()); - // projection in 1d is equivalent - // to interpolation - interpolate_boundary_values (mapping, dof, boundary_functions, - boundary_values, ComponentMask()); - } - - - template <> - void - project_boundary_values (const Mapping<1,2> &mapping, - const DoFHandler<1,2> &dof, - const FunctionMap<2>::type &boundary_functions, - const Quadrature<0> &, - std::map &boundary_values, - std::vector component_mapping) + namespace { - Assert (component_mapping.size() == 0, ExcNotImplemented()); - // projection in 1d is equivalent - // to interpolation - interpolate_boundary_values (mapping, dof, boundary_functions, - boundary_values, ComponentMask()); - } + template class DH, + template class M_or_MC, + template class Q_or_QC> + void + do_project_boundary_values (const M_or_MC &mapping, + const DH &dof, + const typename FunctionMap::type &boundary_functions, + const Q_or_QC &q, + std::map &boundary_values, + std::vector component_mapping) + { + // in 1d, projection onto the 0d end points == interpolation + if (dim == 1) + { + Assert (component_mapping.size() == 0, ExcNotImplemented()); + interpolate_boundary_values (mapping, dof, boundary_functions, + boundary_values, ComponentMask()); + return; + } + //TODO:[?] In project_boundary_values, no condensation of sparsity + // structures, matrices and right hand sides or distribution of + // solution vectors is performed. This is ok for dim<3 because then + // there are no constrained nodes on the boundary, but is not + // acceptable for higher dimensions. Fix this. + if (component_mapping.size() == 0) + { + AssertDimension (dof.get_fe().n_components(), boundary_functions.begin()->second->n_components); + // I still do not see why i + // should create another copy + // here + component_mapping.resize(dof.get_fe().n_components()); + for (unsigned int i= 0 ; i < component_mapping.size() ; ++i) + component_mapping[i] = i; + } + else + AssertDimension (dof.get_fe().n_components(), component_mapping.size()); + std::vector dof_to_boundary_mapping; + std::set selected_boundary_components; + for (typename FunctionMap::type::const_iterator i=boundary_functions.begin(); + i!=boundary_functions.end(); ++i) + selected_boundary_components.insert (i->first); - template - void - project_boundary_values (const Mapping &mapping, - const DoFHandler &dof, - const typename FunctionMap::type &boundary_functions, - const Quadrature &q, - std::map &boundary_values, - std::vector component_mapping) - { -//TODO:[?] In project_boundary_values, no condensation of sparsity -// structures, matrices and right hand sides or distribution of -// solution vectors is performed. This is ok for dim<3 because then -// there are no constrained nodes on the boundary, but is not -// acceptable for higher dimensions. Fix this. + DoFTools::map_dof_to_boundary_indices (dof, selected_boundary_components, + dof_to_boundary_mapping); - if (component_mapping.size() == 0) - { - AssertDimension (dof.get_fe().n_components(), boundary_functions.begin()->second->n_components); - // I still do not see why i - // should create another copy - // here - component_mapping.resize(dof.get_fe().n_components()); - for (unsigned int i= 0 ; i < component_mapping.size() ; ++i) - component_mapping[i] = i; - } - else - AssertDimension (dof.get_fe().n_components(), component_mapping.size()); - - std::vector dof_to_boundary_mapping; - std::set selected_boundary_components; - for (typename FunctionMap::type::const_iterator i=boundary_functions.begin(); - i!=boundary_functions.end(); ++i) - selected_boundary_components.insert (i->first); - - DoFTools::map_dof_to_boundary_indices (dof, selected_boundary_components, - dof_to_boundary_mapping); - - // Done if no degrees of freedom on the boundary - if (dof.n_boundary_dofs (boundary_functions) == 0) - return; - - // set up sparsity structure - CompressedSparsityPattern c_sparsity(dof.n_boundary_dofs (boundary_functions), - dof.n_boundary_dofs (boundary_functions)); - DoFTools::make_boundary_sparsity_pattern (dof, - boundary_functions, - dof_to_boundary_mapping, - c_sparsity); - SparsityPattern sparsity; - sparsity.copy_from(c_sparsity); - - - - // note: for three or more dimensions, there - // may be constrained nodes on the boundary - // in this case the boundary mass matrix has - // to be condensed and the solution is to - // be distributed afterwards, which is not - // yet implemented. The reason for this is - // that we cannot simply use the condense - // family of functions, since the matrices - // and vectors do not use the global - // numbering but rather the boundary - // numbering, i.e. the condense function - // needs to use another indirection. There - // should be not many technical problems, - // but it needs to be implemented - if (dim>=3) - { -#ifdef DEBUG -// Assert that there are no hanging nodes at the boundary - int level = -1; - for (typename DoFHandler::active_cell_iterator cell = dof.begin_active(); - cell != dof.end(); ++cell) - for (unsigned int f=0; f::faces_per_cell; ++f) - { - if (cell->at_boundary(f)) - { - if (level == -1) - level = cell->level(); - else - { - Assert (level == cell->level(), ExcNotImplemented()); - } - } - } -#endif - } - sparsity.compress(); + // Done if no degrees of freedom on the boundary + if (dof.n_boundary_dofs (boundary_functions) == 0) + return; + + // set up sparsity structure + CompressedSparsityPattern c_sparsity(dof.n_boundary_dofs (boundary_functions), + dof.n_boundary_dofs (boundary_functions)); + DoFTools::make_boundary_sparsity_pattern (dof, + boundary_functions, + dof_to_boundary_mapping, + c_sparsity); + SparsityPattern sparsity; + sparsity.copy_from(c_sparsity); + + + + // note: for three or more dimensions, there + // may be constrained nodes on the boundary + // in this case the boundary mass matrix has + // to be condensed and the solution is to + // be distributed afterwards, which is not + // yet implemented. The reason for this is + // that we cannot simply use the condense + // family of functions, since the matrices + // and vectors do not use the global + // numbering but rather the boundary + // numbering, i.e. the condense function + // needs to use another indirection. There + // should be not many technical problems, + // but it needs to be implemented + if (dim>=3) + { + #ifdef DEBUG + // Assert that there are no hanging nodes at the boundary + int level = -1; + for (typename DH::active_cell_iterator cell = dof.begin_active(); + cell != dof.end(); ++cell) + for (unsigned int f=0; f::faces_per_cell; ++f) + { + if (cell->at_boundary(f)) + { + if (level == -1) + level = cell->level(); + else + { + Assert (level == cell->level(), ExcNotImplemented()); + } + } + } + #endif + } + sparsity.compress(); - // make mass matrix and right hand side - SparseMatrix mass_matrix(sparsity); - Vector rhs(sparsity.n_rows()); + // make mass matrix and right hand side + SparseMatrix mass_matrix(sparsity); + Vector rhs(sparsity.n_rows()); - MatrixCreator::create_boundary_mass_matrix (mapping, dof, q, - mass_matrix, boundary_functions, - rhs, dof_to_boundary_mapping, (const Function *) 0, - component_mapping); + MatrixCreator::create_boundary_mass_matrix (mapping, dof, q, + mass_matrix, boundary_functions, + rhs, dof_to_boundary_mapping, (const Function *) 0, + component_mapping); - // For certain weird elements, - // there might be degrees of - // freedom on the boundary, but - // their shape functions do not - // have support there. Let's - // eliminate them here. + // For certain weird elements, + // there might be degrees of + // freedom on the boundary, but + // their shape functions do not + // have support there. Let's + // eliminate them here. - // The Bogner-Fox-Schmidt element - // is an example for those. + // The Bogner-Fox-Schmidt element + // is an example for those. //TODO: Maybe we should figure out if the element really needs this - FilteredMatrix > filtered_mass_matrix(mass_matrix, true); - FilteredMatrix > filtered_precondition; - std::vector excluded_dofs(mass_matrix.m(), false); + FilteredMatrix > filtered_mass_matrix(mass_matrix, true); + FilteredMatrix > filtered_precondition; + std::vector excluded_dofs(mass_matrix.m(), false); - double max_element = 0.; - for (unsigned int i=0; i max_element) - max_element = mass_matrix.diag_element(i); + double max_element = 0.; + for (unsigned int i=0; i max_element) + max_element = mass_matrix.diag_element(i); - for (unsigned int i=0; i boundary_projection (rhs.size()); - - // Allow for a maximum of 5*n - // steps to reduce the residual by - // 10^-12. n steps may not be - // sufficient, since roundoff - // errors may accumulate for badly - // conditioned matrices - ReductionControl control(5*rhs.size(), 0., 1.e-12, false, false); - GrowingVectorMemory<> memory; - SolverCG<> cg(control,memory); - - PreconditionSSOR<> prec; - prec.initialize(mass_matrix, 1.2); - filtered_precondition.initialize(prec, true); - // solve - cg.solve (filtered_mass_matrix, boundary_projection, rhs, filtered_precondition); - filtered_precondition.apply_constraints(boundary_projection, true); - filtered_precondition.clear(); - // fill in boundary values - for (unsigned int i=0; i::invalid_dof_index - && ! excluded_dofs[dof_to_boundary_mapping[i]]) - { - Assert(numbers::is_finite(boundary_projection(dof_to_boundary_mapping[i])), ExcNumberNotFinite()); + Vector boundary_projection (rhs.size()); + + // Allow for a maximum of 5*n + // steps to reduce the residual by + // 10^-12. n steps may not be + // sufficient, since roundoff + // errors may accumulate for badly + // conditioned matrices + ReductionControl control(5*rhs.size(), 0., 1.e-12, false, false); + GrowingVectorMemory<> memory; + SolverCG<> cg(control,memory); + + PreconditionSSOR<> prec; + prec.initialize(mass_matrix, 1.2); + filtered_precondition.initialize(prec, true); + // solve + cg.solve (filtered_mass_matrix, boundary_projection, rhs, filtered_precondition); + filtered_precondition.apply_constraints(boundary_projection, true); + filtered_precondition.clear(); + // fill in boundary values + for (unsigned int i=0; i::invalid_dof_index + && ! excluded_dofs[dof_to_boundary_mapping[i]]) + { + Assert(numbers::is_finite(boundary_projection(dof_to_boundary_mapping[i])), ExcNumberNotFinite()); - // this dof is on one of the - // interesting boundary parts - // - // remember: i is the global dof - // number, dof_to_boundary_mapping[i] - // is the number on the boundary and - // thus in the solution vector - boundary_values[i] = boundary_projection(dof_to_boundary_mapping[i]); - } + // this dof is on one of the + // interesting boundary parts + // + // remember: i is the global dof + // number, dof_to_boundary_mapping[i] + // is the number on the boundary and + // thus in the solution vector + boundary_values[i] = boundary_projection(dof_to_boundary_mapping[i]); + } + } + } + + template + void + project_boundary_values (const Mapping &mapping, + const DoFHandler &dof, + const typename FunctionMap::type &boundary_functions, + const Quadrature &q, + std::map &boundary_values, + std::vector component_mapping) + { + do_project_boundary_values(mapping, dof, boundary_functions, q, + boundary_values, component_mapping); } @@ -2311,7 +2339,37 @@ namespace VectorTools -// ----- implementation for project_boundary_values with ConstraintMatrix ----- + template + void project_boundary_values (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, + const typename FunctionMap::type &boundary_functions, + const hp::QCollection &q, + std::map &boundary_values, + std::vector component_mapping) + { + do_project_boundary_values (hp::StaticMappingQ1::mapping_collection, dof, + boundary_functions, + q, boundary_values, + component_mapping); + } + + + + template + void project_boundary_values (const hp::DoFHandler &dof, + const typename FunctionMap::type &boundary_function, + const hp::QCollection &q, + std::map &boundary_values, + std::vector component_mapping) + { + project_boundary_values (hp::StaticMappingQ1::mapping_collection, dof, + boundary_function, + q, boundary_values, + component_mapping); + } + + + // ----- implementation for project_boundary_values with ConstraintMatrix ----- diff --git a/deal.II/source/dofs/dof_tools.inst.in b/deal.II/source/dofs/dof_tools.inst.in index 2f4747d6b5..d5d3b5dba2 100644 --- a/deal.II/source/dofs/dof_tools.inst.in +++ b/deal.II/source/dofs/dof_tools.inst.in @@ -81,7 +81,6 @@ for (SP : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS) const hp::DoFHandler &dof_col, SP &sparsity); - // #if deal_II_dimension > 1 template void DoFTools::make_boundary_sparsity_pattern,SP> (const DoFHandler& dof, @@ -108,6 +107,15 @@ for (SP : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS) const std::vector &dof_to_boundary_mapping, SP &sparsity); +#if deal_II_dimension < 3 + template void + DoFTools::make_boundary_sparsity_pattern,SP> + (const hp::DoFHandler& dof, + const FunctionMap::type &boundary_indicators, + const std::vector &dof_to_boundary_mapping, + SP &sparsity); + #endif + template void DoFTools::make_flux_sparsity_pattern,SP> (const DoFHandler &dof, diff --git a/deal.II/source/numerics/matrix_tools.cc b/deal.II/source/numerics/matrix_tools.cc index bbb82c8634..32119a2330 100644 --- a/deal.II/source/numerics/matrix_tools.cc +++ b/deal.II/source/numerics/matrix_tools.cc @@ -1276,7 +1276,7 @@ namespace MatrixCreator UpdateFlags update_flags = UpdateFlags (update_values | update_JxW_values | update_quadrature_points); - hp::FEFaceValues x_fe_values (mapping, fe_collection, q, update_flags); + hp::FEFaceValues x_fe_values (mapping, fe_collection, q, update_flags); // two variables for the coefficient, // one for the two cases indicated in diff --git a/deal.II/source/numerics/matrix_tools.inst.in b/deal.II/source/numerics/matrix_tools.inst.in index 2f97b2a818..211ccdac5b 100644 --- a/deal.II/source/numerics/matrix_tools.inst.in +++ b/deal.II/source/numerics/matrix_tools.inst.in @@ -113,8 +113,29 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS const Function * const a, std::vector); + template + void + MatrixCreator::create_boundary_mass_matrix + (const hp::MappingCollection&, + const hp::DoFHandler&, + const hp::QCollection&, + SparseMatrix&, + const FunctionMap::type&, + Vector&, + std::vector&, + const Function * const, + std::vector); - + template + void MatrixCreator::create_boundary_mass_matrix + (const hp::DoFHandler&, + const hp::QCollection&, + SparseMatrix&, + const FunctionMap::type&, + Vector&, + std::vector&, + const Function * const, + std::vector); #endif } @@ -124,111 +145,88 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS // where applicable and move to codimension cases above also when applicable for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS) { -#if deal_II_dimension == deal_II_space_dimension - +#if deal_II_dimension <= deal_II_space_dimension // hp versions of functions template - void MatrixCreator::create_mass_matrix - (const hp::MappingCollection &mapping, - const hp::DoFHandler &dof, + void MatrixCreator::create_mass_matrix + (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, const hp::QCollection &q, SparseMatrix &matrix, - const Function * const coefficient, + const Function * const coefficient, const ConstraintMatrix &constraints); + template - void MatrixCreator::create_mass_matrix - (const hp::DoFHandler &dof, + void MatrixCreator::create_mass_matrix + (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, const hp::QCollection &q, SparseMatrix &matrix, - const Function * const coefficient, + const Function &rhs, + Vector &rhs_vector, + const Function * const coefficient, const ConstraintMatrix &constraints); + template void MatrixCreator::create_mass_matrix - (const hp::MappingCollection &mapping, - const hp::DoFHandler &dof, + (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, const hp::QCollection &q, - SparseMatrix &matrix, - const Function &rhs, + SparseMatrix &matrix, + const Function &rhs, Vector &rhs_vector, - const Function * const coefficient, + const Function * const coefficient, const ConstraintMatrix &constraints); + template void MatrixCreator::create_mass_matrix - (const hp::DoFHandler &dof, + (const hp::DoFHandler &dof, const hp::QCollection &q, - SparseMatrix &matrix, - const Function &rhs, + SparseMatrix &matrix, + const Function &rhs, Vector &rhs_vector, - const Function * const coefficient, + const Function * const coefficient, const ConstraintMatrix &constraints); +#endif +#if deal_II_dimension == deal_II_space_dimension + + template void MatrixCreator::create_mass_matrix - (const hp::MappingCollection &mapping, - const hp::DoFHandler &dof, + (const hp::DoFHandler &dof, const hp::QCollection &q, - SparseMatrix &matrix, - const Function * const coefficient, + SparseMatrix &matrix, + const Function * const coefficient, const ConstraintMatrix &constraints); + template void MatrixCreator::create_mass_matrix - (const hp::DoFHandler &dof, + (const hp::DoFHandler &dof, const hp::QCollection &q, - SparseMatrix &matrix, - const Function * const coefficient, + SparseMatrix &matrix, + const Function &rhs, + Vector &rhs_vector, + const Function * const coefficient, const ConstraintMatrix &constraints); + template void MatrixCreator::create_mass_matrix - (const hp::MappingCollection &mapping, - const hp::DoFHandler &dof, + (const hp::MappingCollection &mapping, + const hp::DoFHandler &dof, const hp::QCollection &q, SparseMatrix &matrix, - const Function &rhs, - Vector &rhs_vector, - const Function * const coefficient, + const Function * const coefficient, const ConstraintMatrix &constraints); + template void MatrixCreator::create_mass_matrix - (const hp::DoFHandler &dof, + (const hp::DoFHandler &dof, const hp::QCollection &q, SparseMatrix &matrix, - const Function &rhs, - Vector &rhs_vector, - const Function * const coefficient, - const ConstraintMatrix &constraints); - - -#if deal_II_dimension != 1 - - - - template - void - MatrixCreator::create_boundary_mass_matrix - (const hp::MappingCollection&, - const hp::DoFHandler&, - const hp::QCollection&, - SparseMatrix&, - const FunctionMap::type&, - Vector&, - std::vector&, - const Function * const, - std::vector); - - template - void MatrixCreator::create_boundary_mass_matrix - (const hp::DoFHandler&, - const hp::QCollection&, - SparseMatrix&, - const FunctionMap::type&, - Vector&, - std::vector&, - const Function * const, - std::vector); - -#endif - + const Function * const coefficient, + const ConstraintMatrix &constraints); // non-hp versions of create_laplace_matrix template diff --git a/deal.II/source/numerics/vector_tools.inst.in b/deal.II/source/numerics/vector_tools.inst.in index a1031c5958..7d0327b866 100644 --- a/deal.II/source/numerics/vector_tools.inst.in +++ b/deal.II/source/numerics/vector_tools.inst.in @@ -118,6 +118,29 @@ for (VEC : SERIAL_VECTORS ; deal_II_dimension : DIMENSIONS; deal_II_space_dimens const bool, const Quadrature &, const bool); + + template + void project + (const hp::MappingCollection &, + const hp::DoFHandler &, + const ConstraintMatrix &, + const hp::QCollection &, + const Function &, + VEC &, + const bool, + const hp::QCollection &, + const bool); + + template + void project + (const hp::DoFHandler &, + const ConstraintMatrix &, + const hp::QCollection &, + const Function &, + VEC &, + const bool, + const hp::QCollection &, + const bool); \} #endif } @@ -404,8 +427,28 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS // where applicable and move to codimension cases above also when applicable for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS) { -#if deal_II_dimension == deal_II_space_dimension namespace VectorTools \{ + +#if deal_II_dimension <= deal_II_space_dimension + template + void project_boundary_values + (const hp::MappingCollection &, + const hp::DoFHandler &, + const FunctionMap::type &, + const hp::QCollection&, + std::map&, + std::vector); + + template + void project_boundary_values + (const hp::DoFHandler &, + const FunctionMap::type &, + const hp::QCollection&, + std::map&, + std::vector); +#endif + +#if deal_II_dimension == deal_II_space_dimension template void create_right_hand_side (const hp::MappingCollection &, @@ -518,7 +561,6 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS -#if deal_II_dimension > 1 template void project_boundary_values (const Mapping &, @@ -526,31 +568,16 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS const FunctionMap::type &, const Quadrature&, std::map&, std::vector); -#endif template void project_boundary_values (const DoFHandler &, const FunctionMap::type &, const Quadrature&, - std::map&, std::vector); + std::map&, + std::vector); - template - void project_boundary_values - (const Mapping &, - const DoFHandler &, - const FunctionMap::type &, - const Quadrature&, - ConstraintMatrix&, std::vector); - - template - void project_boundary_values - (const DoFHandler &, - const FunctionMap::type &, - const Quadrature&, - ConstraintMatrix&, std::vector); - #if deal_II_dimension != 1 template @@ -600,8 +627,8 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS ConstraintMatrix &constraints, const Mapping &mapping); #endif - \} #endif + \} } diff --git a/tests/hp/project_01.cc b/tests/hp/project_01.cc new file mode 100644 index 0000000000..0d7b18513d --- /dev/null +++ b/tests/hp/project_01.cc @@ -0,0 +1,108 @@ +// --------------------------------------------------------------------- +// $Id$ +// +// Copyright (C) 2006 - 2013 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. +// +// --------------------------------------------------------------------- + + +// check VectorTools::project for Vector arguments and hp + + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +// define the multi-linear function x or x*y or x*y*z that we will +// subsequently project onto the ansatz space +template +class F : public Function +{ +public: + virtual double value (const Point &p, + const unsigned int = 0) const + { + double s = 1; + for (unsigned int i=0; i +void test() +{ + // create 2 triangulations with the + // same coarse grid, and refine + // them differently + Triangulation tria; + + GridGenerator::hyper_cube (tria); + tria.refine_global (2); + + hp::FECollection fe; + fe.push_back(FE_Q(1)); + hp::DoFHandler dh (tria); + dh.distribute_dofs (fe); + + Vector v(dh.n_dofs()); + + ConstraintMatrix cm; + cm.close (); + VectorTools::project (dh, cm, hp::QCollection(QGauss(3)), F(), + v); + + for (typename hp::DoFHandler::active_cell_iterator cell=dh.begin_active(); + cell != dh.end(); ++cell) + for (unsigned int i=0; i::vertices_per_cell; ++i) + { + // check that the error is + // somewhat small. it won't + // be zero since we project + // and do not interpolate + Assert (std::fabs (v(cell->vertex_dof_index(i,0,cell->active_fe_index())) - + F().value (cell->vertex(i))) + < 1e-4, + ExcInternalError()); + deallog << cell->vertex(i) << ' ' << v(cell->vertex_dof_index(i,0,cell->active_fe_index())) + << std::endl; + } +} + + +int main() +{ + std::ofstream logfile ("project_01/output"); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + test<1>(); + test<2>(); + test<3>(); +} + diff --git a/tests/hp/project_01/cmp/generic b/tests/hp/project_01/cmp/generic new file mode 100644 index 0000000000..8889fb7a29 --- /dev/null +++ b/tests/hp/project_01/cmp/generic @@ -0,0 +1,585 @@ + +DEAL::0.00000 0 +DEAL::0.250000 0.250000 +DEAL::0.250000 0.250000 +DEAL::0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::0.750000 0.750000 +DEAL::0.750000 0.750000 +DEAL::1.00000 1.00000 +DEAL::0.00000 0.00000 0 +DEAL::0.250000 0.00000 0 +DEAL::0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.250000 0.00000 0 +DEAL::0.500000 0.00000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.00000 0.500000 0 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.500000 0.00000 0 +DEAL::0.750000 0.00000 0 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.187500 +DEAL::0.750000 0.00000 0 +DEAL::1.00000 0.00000 0 +DEAL::0.750000 0.250000 0.187500 +DEAL::1.00000 0.250000 0.250000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.187500 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::0.750000 0.250000 0.187500 +DEAL::1.00000 0.250000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.00000 0.750000 0 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.00000 0.750000 0 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.00000 1.00000 0 +DEAL::0.250000 1.00000 0.250000 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.250000 1.00000 0.250000 +DEAL::0.500000 1.00000 0.500000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.562500 +DEAL::0.750000 0.500000 0.375000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.750000 0.750000 0.562500 +DEAL::1.00000 0.750000 0.750000 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.562500 +DEAL::0.500000 1.00000 0.500000 +DEAL::0.750000 1.00000 0.750000 +DEAL::0.750000 0.750000 0.562500 +DEAL::1.00000 0.750000 0.750000 +DEAL::0.750000 1.00000 0.750000 +DEAL::1.00000 1.00000 1.00000 +DEAL::0.00000 0.00000 0.00000 0 +DEAL::0.250000 0.00000 0.00000 0 +DEAL::0.00000 0.250000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.00000 0.00000 0.250000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.250000 0.00000 0.00000 0 +DEAL::0.500000 0.00000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.00000 0.250000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.00000 0.500000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.00000 0.00000 0.250000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.00000 0.500000 0 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.500000 0.00000 0.00000 0 +DEAL::0.750000 0.00000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.750000 0.00000 0.00000 0 +DEAL::1.00000 0.00000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::1.00000 0.250000 0.00000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::1.00000 0.00000 0.250000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::1.00000 0.250000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::1.00000 0.500000 0.00000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::1.00000 0.00000 0.250000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::1.00000 0.00000 0.500000 0 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.00000 0.500000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.00000 0.750000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.00000 0.750000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.00000 1.00000 0.00000 0 +DEAL::0.250000 1.00000 0.00000 0 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 1.00000 0.250000 0 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.250000 1.00000 0.00000 0 +DEAL::0.500000 1.00000 0.00000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 1.00000 0.250000 0 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 1.00000 0.500000 0 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::1.00000 0.500000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::1.00000 0.750000 0.00000 0 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::0.500000 1.00000 0.00000 0 +DEAL::0.750000 1.00000 0.00000 0 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::1.00000 0.750000 0.00000 0 +DEAL::0.750000 1.00000 0.00000 0 +DEAL::1.00000 1.00000 0.00000 0 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::1.00000 1.00000 0.250000 0.250000 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::1.00000 1.00000 0.250000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::1.00000 1.00000 0.500000 0.500000 +DEAL::0.00000 0.00000 0.500000 0 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.00000 0.750000 0 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.00000 0.00000 0.750000 0 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.00000 1.00000 0 +DEAL::0.250000 0.00000 1.00000 0 +DEAL::0.00000 0.250000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.00000 1.00000 0 +DEAL::0.500000 0.00000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.250000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.00000 0.500000 1.00000 0 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::1.00000 0.00000 0.500000 0 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::1.00000 0.00000 0.750000 0 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.00000 1.00000 0 +DEAL::0.750000 0.00000 1.00000 0 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::1.00000 0.00000 0.750000 0 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.00000 1.00000 0 +DEAL::1.00000 0.00000 1.00000 0 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::1.00000 0.250000 1.00000 0.250000 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::1.00000 0.250000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::1.00000 0.500000 1.00000 0.500000 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 1.00000 0.500000 0 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 1.00000 0.750000 0 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 0.500000 1.00000 0 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.00000 0.750000 1.00000 0 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 1.00000 0.750000 0 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.00000 0.750000 1.00000 0 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.00000 1.00000 1.00000 0 +DEAL::0.250000 1.00000 1.00000 0.250000 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.250000 1.00000 1.00000 0.250000 +DEAL::0.500000 1.00000 1.00000 0.500000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::1.00000 1.00000 0.500000 0.500000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::1.00000 1.00000 0.750000 0.750000 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::1.00000 0.500000 1.00000 0.500000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::1.00000 0.750000 1.00000 0.750000 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::0.500000 1.00000 1.00000 0.500000 +DEAL::0.750000 1.00000 1.00000 0.750000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::1.00000 1.00000 0.750000 0.750000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::1.00000 0.750000 1.00000 0.750000 +DEAL::0.750000 1.00000 1.00000 0.750000 +DEAL::1.00000 1.00000 1.00000 1.00000 diff --git a/tests/hp/project_01_curved_boundary.cc b/tests/hp/project_01_curved_boundary.cc new file mode 100644 index 0000000000..d0d73c000b --- /dev/null +++ b/tests/hp/project_01_curved_boundary.cc @@ -0,0 +1,177 @@ +// --------------------------------------------------------------------- +// $Id$ +// +// Copyright (C) 2006 - 2013 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. +// +// --------------------------------------------------------------------- + + +// check VectorTools::project for Vector arguments and hp + + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +// define a function that is zero within the square +// [-sqrt(2)/2,sqrt(2)/2]^d +// which is the domain produced by GridGenerator::hyper_sphere +// when using a linear mapping. we will want to see a solution +// that is not zero when using a higher order mapping and a Q2 +// element +template +class F : public Function +{ +public: + virtual double value (const Point &p, + const unsigned int = 0) const + { + // compute the linfty norm of p + double m = 0; + for (unsigned int d=0; d +void test() +{ + HyperBallBoundary boundary; + + // create 2 triangulations with the + // same coarse grid, and refine + // them differently + Triangulation tria; + GridGenerator::hyper_ball (tria); + tria.set_boundary (0, boundary); + + + hp::FECollection fe; + fe.push_back(FE_Q(1)); + hp::DoFHandler dh (tria); + dh.distribute_dofs (fe); + + Vector v(dh.n_dofs()); + + ConstraintMatrix cm; + cm.close (); + + // use the implicit Q1 mapping. this will yield a zero solution + { + VectorTools::project (dh, cm, hp::QCollection(QGauss(3)), F(), + v); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() == 0, ExcInternalError()); + } + + // use an explicit Q1 mapping. this will yield a zero solution + { + VectorTools::project (hp::MappingCollection(MappingQ1()), + dh, cm, hp::QCollection(QGauss(3)), F(), + v); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() == 0, ExcInternalError()); + } + + // use an explicit Q2 mapping. this will yield a nonzero solution if it's a + // straight projection since some of the quadrature points are lying outside + // the area where the function is zero + { + VectorTools::project (hp::MappingCollection(MappingQ(2)), + dh, cm, hp::QCollection(QGauss(3)), F(), + v); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() != 0, ExcInternalError()); + } + + // use an explicit Q2 mapping but enforce zero boundary values. this will + // yield a nonzero solution since some of the quadrature points are lying + // outside the area where the function is zero, even though the values of + // the DoFs at the boundary are in fact zero (they are interpolated only at + // points where the function is zero) + { + VectorTools::project (hp::MappingCollection(MappingQ(2)), + dh, cm, hp::QCollection(QGauss(3)), F(), + v, true); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() != 0, ExcInternalError()); + } + + // use an explicit Q2 mapping and project to the boundary first. this will + // yield a nonzero solution since some of the quadrature points are lying + // outside the area where the function is zero. furthermore, the values on + // the boundary will be nonzero since we project, even though the + // *interpolation* of boundary values onto the trace of the Q1 space is zero + { + VectorTools::project (hp::MappingCollection(MappingQ(2)), + dh, cm, hp::QCollection(QGauss(3)), F(), + v, false, + hp::QCollection(QGauss(2)), true); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() != 0, ExcInternalError()); + for (typename hp::DoFHandler::active_cell_iterator cell=dh.begin_active(); + cell != dh.end(); ++cell) + for (unsigned int i=0; i::vertices_per_cell; ++i) + deallog << cell->vertex(i) << ' ' << v(cell->vertex_dof_index(i,0,cell->active_fe_index())) + << std::endl; + } + + + // same as above, but use a projection with a QTrapez formula. this happens + // to evaluate the function only at points where it is zero, and + // consequently the values at the boundary should be zero + { + VectorTools::project (hp::MappingCollection(MappingQ(2)), + dh, cm, hp::QCollection(QGauss(3)), F(), + v, false, + hp::QCollection(QTrapez()), true); + deallog << v.l2_norm() << std::endl; + Assert (v.l2_norm() != 0, ExcInternalError()); + for (typename hp::DoFHandler::active_cell_iterator cell=dh.begin_active(); + cell != dh.end(); ++cell) + for (unsigned int i=0; i::vertices_per_cell; ++i) + deallog << cell->vertex(i) << ' ' << v(cell->vertex_dof_index(i,0,cell->active_fe_index())) + << std::endl; + } +} + + +int main() +{ + std::ofstream logfile ("project_01_curved_boundary/output"); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + test<2>(); + test<3>(); +} + diff --git a/tests/hp/project_01_curved_boundary/cmp/generic b/tests/hp/project_01_curved_boundary/cmp/generic new file mode 100644 index 0000000000..218888d980 --- /dev/null +++ b/tests/hp/project_01_curved_boundary/cmp/generic @@ -0,0 +1,165 @@ + +DEAL::0 +DEAL::0 +DEAL::0.227756 +DEAL::0.0359680 +DEAL::0.421875 +DEAL::-0.707107 -0.707107 0.195262 +DEAL::0.707107 -0.707107 0.195262 +DEAL::-0.292893 -0.292893 -0.0797954 +DEAL::0.292893 -0.292893 -0.0797954 +DEAL::-0.707107 -0.707107 0.195262 +DEAL::-0.292893 -0.292893 -0.0797954 +DEAL::-0.707107 0.707107 0.195262 +DEAL::-0.292893 0.292893 -0.0797954 +DEAL::-0.292893 -0.292893 -0.0797954 +DEAL::0.292893 -0.292893 -0.0797954 +DEAL::-0.292893 0.292893 -0.0797954 +DEAL::0.292893 0.292893 -0.0797954 +DEAL::0.707107 -0.707107 0.195262 +DEAL::0.707107 0.707107 0.195262 +DEAL::0.292893 -0.292893 -0.0797954 +DEAL::0.292893 0.292893 -0.0797954 +DEAL::-0.707107 0.707107 0.195262 +DEAL::-0.292893 0.292893 -0.0797954 +DEAL::0.707107 0.707107 0.195262 +DEAL::0.292893 0.292893 -0.0797954 +DEAL::0.0359680 +DEAL::-0.707107 -0.707107 0 +DEAL::0.707107 -0.707107 0 +DEAL::-0.292893 -0.292893 0.0179840 +DEAL::0.292893 -0.292893 0.0179840 +DEAL::-0.707107 -0.707107 0 +DEAL::-0.292893 -0.292893 0.0179840 +DEAL::-0.707107 0.707107 0 +DEAL::-0.292893 0.292893 0.0179840 +DEAL::-0.292893 -0.292893 0.0179840 +DEAL::0.292893 -0.292893 0.0179840 +DEAL::-0.292893 0.292893 0.0179840 +DEAL::0.292893 0.292893 0.0179840 +DEAL::0.707107 -0.707107 0 +DEAL::0.707107 0.707107 0 +DEAL::0.292893 -0.292893 0.0179840 +DEAL::0.292893 0.292893 0.0179840 +DEAL::-0.707107 0.707107 0 +DEAL::-0.292893 0.292893 0.0179840 +DEAL::0.707107 0.707107 0 +DEAL::0.292893 0.292893 0.0179840 +DEAL::0 +DEAL::0 +DEAL::0.166690 +DEAL::0.0709393 +DEAL::0.440214 +DEAL::-0.211325 -0.211325 -0.211325 -0.104038 +DEAL::0.211325 -0.211325 -0.211325 -0.104038 +DEAL::-0.211325 0.211325 -0.211325 -0.104038 +DEAL::0.211325 0.211325 -0.211325 -0.104038 +DEAL::-0.211325 -0.211325 0.211325 -0.104038 +DEAL::0.211325 -0.211325 0.211325 -0.104038 +DEAL::-0.211325 0.211325 0.211325 -0.104038 +DEAL::0.211325 0.211325 0.211325 -0.104038 +DEAL::-0.577350 -0.577350 -0.577350 0.115757 +DEAL::0.577350 -0.577350 -0.577350 0.115757 +DEAL::-0.577350 0.577350 -0.577350 0.115757 +DEAL::0.577350 0.577350 -0.577350 0.115757 +DEAL::-0.211325 -0.211325 -0.211325 -0.104038 +DEAL::0.211325 -0.211325 -0.211325 -0.104038 +DEAL::-0.211325 0.211325 -0.211325 -0.104038 +DEAL::0.211325 0.211325 -0.211325 -0.104038 +DEAL::0.577350 -0.577350 -0.577350 0.115757 +DEAL::0.577350 0.577350 -0.577350 0.115757 +DEAL::0.211325 -0.211325 -0.211325 -0.104038 +DEAL::0.211325 0.211325 -0.211325 -0.104038 +DEAL::0.577350 -0.577350 0.577350 0.115757 +DEAL::0.577350 0.577350 0.577350 0.115757 +DEAL::0.211325 -0.211325 0.211325 -0.104038 +DEAL::0.211325 0.211325 0.211325 -0.104038 +DEAL::-0.577350 -0.577350 0.577350 0.115757 +DEAL::0.577350 -0.577350 0.577350 0.115757 +DEAL::-0.211325 -0.211325 0.211325 -0.104038 +DEAL::0.211325 -0.211325 0.211325 -0.104038 +DEAL::-0.577350 0.577350 0.577350 0.115757 +DEAL::0.577350 0.577350 0.577350 0.115757 +DEAL::-0.211325 0.211325 0.211325 -0.104038 +DEAL::0.211325 0.211325 0.211325 -0.104038 +DEAL::-0.577350 -0.577350 -0.577350 0.115757 +DEAL::-0.211325 -0.211325 -0.211325 -0.104038 +DEAL::-0.577350 0.577350 -0.577350 0.115757 +DEAL::-0.211325 0.211325 -0.211325 -0.104038 +DEAL::-0.577350 -0.577350 0.577350 0.115757 +DEAL::-0.211325 -0.211325 0.211325 -0.104038 +DEAL::-0.577350 0.577350 0.577350 0.115757 +DEAL::-0.211325 0.211325 0.211325 -0.104038 +DEAL::-0.577350 -0.577350 -0.577350 0.115757 +DEAL::0.577350 -0.577350 -0.577350 0.115757 +DEAL::-0.211325 -0.211325 -0.211325 -0.104038 +DEAL::0.211325 -0.211325 -0.211325 -0.104038 +DEAL::-0.577350 -0.577350 0.577350 0.115757 +DEAL::0.577350 -0.577350 0.577350 0.115757 +DEAL::-0.211325 -0.211325 0.211325 -0.104038 +DEAL::0.211325 -0.211325 0.211325 -0.104038 +DEAL::-0.577350 0.577350 -0.577350 0.115757 +DEAL::-0.211325 0.211325 -0.211325 -0.104038 +DEAL::0.577350 0.577350 -0.577350 0.115757 +DEAL::0.211325 0.211325 -0.211325 -0.104038 +DEAL::-0.577350 0.577350 0.577350 0.115757 +DEAL::-0.211325 0.211325 0.211325 -0.104038 +DEAL::0.577350 0.577350 0.577350 0.115757 +DEAL::0.211325 0.211325 0.211325 -0.104038 +DEAL::0.0709393 +DEAL::-0.211325 -0.211325 -0.211325 0.0250808 +DEAL::0.211325 -0.211325 -0.211325 0.0250808 +DEAL::-0.211325 0.211325 -0.211325 0.0250808 +DEAL::0.211325 0.211325 -0.211325 0.0250808 +DEAL::-0.211325 -0.211325 0.211325 0.0250808 +DEAL::0.211325 -0.211325 0.211325 0.0250808 +DEAL::-0.211325 0.211325 0.211325 0.0250808 +DEAL::0.211325 0.211325 0.211325 0.0250808 +DEAL::-0.577350 -0.577350 -0.577350 0 +DEAL::0.577350 -0.577350 -0.577350 0 +DEAL::-0.577350 0.577350 -0.577350 0 +DEAL::0.577350 0.577350 -0.577350 0 +DEAL::-0.211325 -0.211325 -0.211325 0.0250808 +DEAL::0.211325 -0.211325 -0.211325 0.0250808 +DEAL::-0.211325 0.211325 -0.211325 0.0250808 +DEAL::0.211325 0.211325 -0.211325 0.0250808 +DEAL::0.577350 -0.577350 -0.577350 0 +DEAL::0.577350 0.577350 -0.577350 0 +DEAL::0.211325 -0.211325 -0.211325 0.0250808 +DEAL::0.211325 0.211325 -0.211325 0.0250808 +DEAL::0.577350 -0.577350 0.577350 0 +DEAL::0.577350 0.577350 0.577350 0 +DEAL::0.211325 -0.211325 0.211325 0.0250808 +DEAL::0.211325 0.211325 0.211325 0.0250808 +DEAL::-0.577350 -0.577350 0.577350 0 +DEAL::0.577350 -0.577350 0.577350 0 +DEAL::-0.211325 -0.211325 0.211325 0.0250808 +DEAL::0.211325 -0.211325 0.211325 0.0250808 +DEAL::-0.577350 0.577350 0.577350 0 +DEAL::0.577350 0.577350 0.577350 0 +DEAL::-0.211325 0.211325 0.211325 0.0250808 +DEAL::0.211325 0.211325 0.211325 0.0250808 +DEAL::-0.577350 -0.577350 -0.577350 0 +DEAL::-0.211325 -0.211325 -0.211325 0.0250808 +DEAL::-0.577350 0.577350 -0.577350 0 +DEAL::-0.211325 0.211325 -0.211325 0.0250808 +DEAL::-0.577350 -0.577350 0.577350 0 +DEAL::-0.211325 -0.211325 0.211325 0.0250808 +DEAL::-0.577350 0.577350 0.577350 0 +DEAL::-0.211325 0.211325 0.211325 0.0250808 +DEAL::-0.577350 -0.577350 -0.577350 0 +DEAL::0.577350 -0.577350 -0.577350 0 +DEAL::-0.211325 -0.211325 -0.211325 0.0250808 +DEAL::0.211325 -0.211325 -0.211325 0.0250808 +DEAL::-0.577350 -0.577350 0.577350 0 +DEAL::0.577350 -0.577350 0.577350 0 +DEAL::-0.211325 -0.211325 0.211325 0.0250808 +DEAL::0.211325 -0.211325 0.211325 0.0250808 +DEAL::-0.577350 0.577350 -0.577350 0 +DEAL::-0.211325 0.211325 -0.211325 0.0250808 +DEAL::0.577350 0.577350 -0.577350 0 +DEAL::0.211325 0.211325 -0.211325 0.0250808 +DEAL::-0.577350 0.577350 0.577350 0 +DEAL::-0.211325 0.211325 0.211325 0.0250808 +DEAL::0.577350 0.577350 0.577350 0 +DEAL::0.211325 0.211325 0.211325 0.0250808 diff --git a/tests/hp/project_02.cc b/tests/hp/project_02.cc new file mode 100644 index 0000000000..3e4c246ef1 --- /dev/null +++ b/tests/hp/project_02.cc @@ -0,0 +1,111 @@ +// --------------------------------------------------------------------- +// $Id$ +// +// Copyright (C) 2006 - 2013 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. +// +// --------------------------------------------------------------------- + + +// check VectorTools::project for BlockVector arguments and hp:: + + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +// define the multi-linear function x or x*y or x*y*z that we will +// subsequently project onto the ansatz space +template +class F : public Function +{ +public: + virtual double value (const Point &p, + const unsigned int = 0) const + { + double s = 1; + for (unsigned int i=0; i +void test() +{ + // create 2 triangulations with the + // same coarse grid, and refine + // them differently + Triangulation tria; + + GridGenerator::hyper_cube (tria); + tria.refine_global (2); + + hp::FECollection fe; + fe.push_back(FE_Q(1)); + hp::DoFHandler dh (tria); + dh.distribute_dofs (fe); + + BlockVector v(2); + v.block(0).reinit (dh.n_dofs()/2); + v.block(1).reinit (dh.n_dofs()-dh.n_dofs()/2); + v.collect_sizes(); + + ConstraintMatrix cm; + cm.close (); + VectorTools::project (dh, cm, hp::QCollection(QGauss(3)), F(), + v); + + for (typename hp::DoFHandler::active_cell_iterator cell=dh.begin_active(); + cell != dh.end(); ++cell) + for (unsigned int i=0; i::vertices_per_cell; ++i) + { + // check that the error is + // somewhat small. it won't + // be zero since we project + // and do not interpolate + Assert (std::fabs (v(cell->vertex_dof_index(i,0,cell->active_fe_index())) - + F().value (cell->vertex(i))) + < 1e-4, + ExcInternalError()); + deallog << cell->vertex(i) << ' ' << v(cell->vertex_dof_index(i,0,cell->active_fe_index())) + << std::endl; + } +} + + +int main() +{ + std::ofstream logfile ("project_02/output"); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + test<1>(); + test<2>(); + test<3>(); +} + diff --git a/tests/hp/project_02/cmp/generic b/tests/hp/project_02/cmp/generic new file mode 100644 index 0000000000..8889fb7a29 --- /dev/null +++ b/tests/hp/project_02/cmp/generic @@ -0,0 +1,585 @@ + +DEAL::0.00000 0 +DEAL::0.250000 0.250000 +DEAL::0.250000 0.250000 +DEAL::0.500000 0.500000 +DEAL::0.500000 0.500000 +DEAL::0.750000 0.750000 +DEAL::0.750000 0.750000 +DEAL::1.00000 1.00000 +DEAL::0.00000 0.00000 0 +DEAL::0.250000 0.00000 0 +DEAL::0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.250000 0.00000 0 +DEAL::0.500000 0.00000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.00000 0.500000 0 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.500000 0.00000 0 +DEAL::0.750000 0.00000 0 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.187500 +DEAL::0.750000 0.00000 0 +DEAL::1.00000 0.00000 0 +DEAL::0.750000 0.250000 0.187500 +DEAL::1.00000 0.250000 0.250000 +DEAL::0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.187500 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::0.750000 0.250000 0.187500 +DEAL::1.00000 0.250000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.00000 0.500000 0 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.00000 0.750000 0 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.250000 0.500000 0.125000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.00000 0.750000 0 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.00000 1.00000 0 +DEAL::0.250000 1.00000 0.250000 +DEAL::0.250000 0.750000 0.187500 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.250000 1.00000 0.250000 +DEAL::0.500000 1.00000 0.500000 +DEAL::0.500000 0.500000 0.250000 +DEAL::0.750000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.562500 +DEAL::0.750000 0.500000 0.375000 +DEAL::1.00000 0.500000 0.500000 +DEAL::0.750000 0.750000 0.562500 +DEAL::1.00000 0.750000 0.750000 +DEAL::0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.562500 +DEAL::0.500000 1.00000 0.500000 +DEAL::0.750000 1.00000 0.750000 +DEAL::0.750000 0.750000 0.562500 +DEAL::1.00000 0.750000 0.750000 +DEAL::0.750000 1.00000 0.750000 +DEAL::1.00000 1.00000 1.00000 +DEAL::0.00000 0.00000 0.00000 0 +DEAL::0.250000 0.00000 0.00000 0 +DEAL::0.00000 0.250000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.00000 0.00000 0.250000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.250000 0.00000 0.00000 0 +DEAL::0.500000 0.00000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.00000 0.250000 0.00000 0 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.00000 0.500000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.250000 0.250000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.00000 0.00000 0.250000 0 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.00000 0.500000 0 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.250000 0.00000 0.250000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.00000 0.250000 0.250000 0 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.250000 0.250000 0.250000 0.0156250 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.500000 0.00000 0.00000 0 +DEAL::0.750000 0.00000 0.00000 0 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.750000 0.00000 0.00000 0 +DEAL::1.00000 0.00000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::1.00000 0.250000 0.00000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::1.00000 0.00000 0.250000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.500000 0.250000 0.00000 0 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.750000 0.250000 0.00000 0 +DEAL::1.00000 0.250000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::1.00000 0.500000 0.00000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.500000 0.00000 0.250000 0 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.750000 0.00000 0.250000 0 +DEAL::1.00000 0.00000 0.250000 0 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::1.00000 0.00000 0.500000 0 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.500000 0.250000 0.250000 0.0312500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.750000 0.250000 0.250000 0.0468750 +DEAL::1.00000 0.250000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.00000 0.500000 0.00000 0 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.00000 0.750000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.250000 0.500000 0.00000 0 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.00000 0.750000 0.00000 0 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.00000 1.00000 0.00000 0 +DEAL::0.250000 1.00000 0.00000 0 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 1.00000 0.250000 0 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.250000 1.00000 0.00000 0 +DEAL::0.500000 1.00000 0.00000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.00000 0.500000 0.250000 0 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.250000 0.500000 0.250000 0.0312500 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.00000 0.750000 0.250000 0 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.00000 1.00000 0.250000 0 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 1.00000 0.500000 0 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.250000 0.0468750 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.250000 1.00000 0.250000 0.0625000 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.500000 0.500000 0.00000 0 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.750000 0.500000 0.00000 0 +DEAL::1.00000 0.500000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::1.00000 0.750000 0.00000 0 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.500000 0.750000 0.00000 0 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::0.500000 1.00000 0.00000 0 +DEAL::0.750000 1.00000 0.00000 0 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::0.750000 0.750000 0.00000 0 +DEAL::1.00000 0.750000 0.00000 0 +DEAL::0.750000 1.00000 0.00000 0 +DEAL::1.00000 1.00000 0.00000 0 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::1.00000 1.00000 0.250000 0.250000 +DEAL::0.500000 0.500000 0.250000 0.0625000 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.750000 0.500000 0.250000 0.0937500 +DEAL::1.00000 0.500000 0.250000 0.125000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.250000 0.0937500 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::0.500000 1.00000 0.250000 0.125000 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::0.750000 0.750000 0.250000 0.140625 +DEAL::1.00000 0.750000 0.250000 0.187500 +DEAL::0.750000 1.00000 0.250000 0.187500 +DEAL::1.00000 1.00000 0.250000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::1.00000 1.00000 0.500000 0.500000 +DEAL::0.00000 0.00000 0.500000 0 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.00000 0.750000 0 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.250000 0.00000 0.500000 0 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.00000 0.250000 0.500000 0 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.250000 0.250000 0.500000 0.0312500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.00000 0.00000 0.750000 0 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.00000 1.00000 0 +DEAL::0.250000 0.00000 1.00000 0 +DEAL::0.00000 0.250000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.250000 0.00000 0.750000 0 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.00000 1.00000 0 +DEAL::0.500000 0.00000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.00000 0.250000 0.750000 0 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.250000 1.00000 0 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.00000 0.500000 1.00000 0 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.250000 0.250000 0.750000 0.0468750 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.250000 1.00000 0.0625000 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.500000 0.00000 0.500000 0 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.750000 0.00000 0.500000 0 +DEAL::1.00000 0.00000 0.500000 0 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::1.00000 0.00000 0.750000 0 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.500000 0.250000 0.500000 0.0625000 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.750000 0.250000 0.500000 0.0937500 +DEAL::1.00000 0.250000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.500000 0.00000 0.750000 0 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.00000 1.00000 0 +DEAL::0.750000 0.00000 1.00000 0 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::0.750000 0.00000 0.750000 0 +DEAL::1.00000 0.00000 0.750000 0 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.00000 1.00000 0 +DEAL::1.00000 0.00000 1.00000 0 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::1.00000 0.250000 1.00000 0.250000 +DEAL::0.500000 0.250000 0.750000 0.0937500 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.250000 1.00000 0.125000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::0.750000 0.250000 0.750000 0.140625 +DEAL::1.00000 0.250000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.250000 1.00000 0.187500 +DEAL::1.00000 0.250000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::1.00000 0.500000 1.00000 0.500000 +DEAL::0.00000 0.500000 0.500000 0 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.250000 0.500000 0.500000 0.0625000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.00000 0.750000 0.500000 0 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.00000 1.00000 0.500000 0 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 1.00000 0.750000 0 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.500000 0.0937500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.250000 1.00000 0.500000 0.125000 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.00000 0.500000 0.750000 0 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 0.500000 1.00000 0 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.00000 0.750000 1.00000 0 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.250000 0.500000 0.750000 0.0937500 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 0.500000 1.00000 0.125000 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.00000 0.750000 0.750000 0 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.00000 1.00000 0.750000 0 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.00000 0.750000 1.00000 0 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.00000 1.00000 1.00000 0 +DEAL::0.250000 1.00000 1.00000 0.250000 +DEAL::0.250000 0.750000 0.750000 0.140625 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.250000 1.00000 0.750000 0.187500 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.250000 0.750000 1.00000 0.187500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.250000 1.00000 1.00000 0.250000 +DEAL::0.500000 1.00000 1.00000 0.500000 +DEAL::0.500000 0.500000 0.500000 0.125000 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.750000 0.500000 0.500000 0.187500 +DEAL::1.00000 0.500000 0.500000 0.250000 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.500000 0.750000 0.500000 0.187500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::0.500000 1.00000 0.500000 0.250000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::0.750000 0.750000 0.500000 0.281250 +DEAL::1.00000 0.750000 0.500000 0.375000 +DEAL::0.750000 1.00000 0.500000 0.375000 +DEAL::1.00000 1.00000 0.500000 0.500000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::1.00000 1.00000 0.750000 0.750000 +DEAL::0.500000 0.500000 0.750000 0.187500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 0.500000 1.00000 0.250000 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::0.750000 0.500000 0.750000 0.281250 +DEAL::1.00000 0.500000 0.750000 0.375000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 0.500000 1.00000 0.375000 +DEAL::1.00000 0.500000 1.00000 0.500000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::1.00000 0.750000 1.00000 0.750000 +DEAL::0.500000 0.750000 0.750000 0.281250 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::0.500000 1.00000 0.750000 0.375000 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::0.500000 0.750000 1.00000 0.375000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::0.500000 1.00000 1.00000 0.500000 +DEAL::0.750000 1.00000 1.00000 0.750000 +DEAL::0.750000 0.750000 0.750000 0.421875 +DEAL::1.00000 0.750000 0.750000 0.562500 +DEAL::0.750000 1.00000 0.750000 0.562500 +DEAL::1.00000 1.00000 0.750000 0.750000 +DEAL::0.750000 0.750000 1.00000 0.562500 +DEAL::1.00000 0.750000 1.00000 0.750000 +DEAL::0.750000 1.00000 1.00000 0.750000 +DEAL::1.00000 1.00000 1.00000 1.00000 -- 2.39.5