From b7f5f9359cbde63210e0ba0882e7600eba8edd0c Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Wed, 14 Dec 2011 19:52:27 +0000 Subject: [PATCH] Introduce DataPostprocessorScalar/Vector. git-svn-id: https://svn.dealii.org/trunk@24827 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/doc/news/changes.h | 13 +- deal.II/examples/step-29/step-29.cc | 78 +- .../deal.II/numerics/data_postprocessor.h | 225 ++++- deal.II/source/numerics/data_postprocessor.cc | 89 ++ .../numerics/data_postprocessor.inst.in | 2 + .../data_out_postprocessor_scalar_01.cc | 196 +++++ .../cmp/generic | 783 ++++++++++++++++++ .../data_out_postprocessor_vector_01.cc | 197 +++++ .../cmp/generic | 783 ++++++++++++++++++ 9 files changed, 2314 insertions(+), 52 deletions(-) create mode 100644 tests/deal.II/data_out_postprocessor_scalar_01.cc create mode 100644 tests/deal.II/data_out_postprocessor_scalar_01/cmp/generic create mode 100644 tests/deal.II/data_out_postprocessor_vector_01.cc create mode 100644 tests/deal.II/data_out_postprocessor_vector_01/cmp/generic diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h index 0ff3d38a69..4fd0d9b8eb 100644 --- a/deal.II/doc/news/changes.h +++ b/deal.II/doc/news/changes.h @@ -73,14 +73,23 @@ enabled due to a missing include file in file

Specific improvements

    +
  1. New: Setting up a class derived from DataPostprocessor required some +pretty mechanical steps in which one has to overload four member functions. +For common cases where a postprocessor only computes a single scalar or +a single vector, this is tedious and unnecessary. For these cases, the +new classes DataPostprocessorScalar and DataPostprocessorVector provide +short cuts that make life simpler. +
    +(Wolfgang Bangerth, 2011/12/14) +
  2. Changed: The DataPostprocessor class previously required users of this -class to overload DataPostprocessor::get_names(), +class to overload DataPostprocessor::get_names(), DataPostprocessor::get_data_component_interpretation() and DataPostprocessor::n_output_variables(). The latter function is redundant since its output must equal the length of the arrays returned by the first two of these functions. It has therefore been removed.
    -(Wolfgang Bangerth, 2011/12/15) +(Wolfgang Bangerth, 2011/12/14)
  3. Improved: Objects of the type LogStream::Prefix can now be used as a safe implementation of the push and pop mechanism for log diff --git a/deal.II/examples/step-29/step-29.cc b/deal.II/examples/step-29/step-29.cc index 593131e39d..923406c6c2 100644 --- a/deal.II/examples/step-29/step-29.cc +++ b/deal.II/examples/step-29/step-29.cc @@ -345,7 +345,7 @@ namespace Step29 // @sect3{The ComputeIntensity class} // As mentioned in the introduction, - // the quantitiy that we are really + // the quantity that we are really // after is the spatial distribution // of the intensity of the ultrasound // wave, which corresponds to @@ -373,7 +373,7 @@ namespace Step29 // when this function is used for // output is that at each point where // output data is to be generated, - // the compute_derived_quantities + // the DataPostprocessor::compute_derived_quantities_scalar or DataPostprocessor::compute_derived_quantities_vector // function of the specified // DataPostprocessor object is // invoked to compute the output @@ -393,23 +393,30 @@ namespace Step29 // doesn't even involve any // derivatives of $v$ or $w$. - // In practice, the DataPostprocessor - // class only provides an interface - // to this functionality, and we need - // to derive our own class from it in + // In practice, the + // DataPostprocessor class only + // provides an interface to this + // functionality, and we need to + // derive our own class from it in // order to implement the functions - // specified by the interface. This - // is what the + // specified by the interface. In + // the most general case one has to + // implement several member + // functions but if the output + // quantity is a single scalar then + // some of this boilerplate code + // can be handled by a more + // specialized class, + // DataPostprocessorScalar and we + // can derive from that one + // instead. This is what the // ComputeIntensity - // class is about. Notice that all - // its member functions are - // implementations of virtual - // functions defined by the interface - // class DataPostprocessor. + // class does: template - class ComputeIntensity : public DataPostprocessor + class ComputeIntensity : public DataPostprocessorScalar { public: + ComputeIntensity (); virtual void @@ -419,29 +426,20 @@ namespace Step29 const std::vector< Point< dim > > &normals, const std::vector > &evaluation_points, std::vector< Vector< double > > &computed_quantities) const; - - virtual std::vector get_names () const; - virtual UpdateFlags get_needed_update_flags () const; }; - // The get_names - // function returns a vector of - // strings representing the names we - // assign to the individual - // quantities that our postprocessor - // outputs. In our case, the - // postprocessor has only $|u|$ as an - // output, so we return a vector with - // a single component named - // "Intensity": - template - std::vector - ComputeIntensity::get_names() const - { - return std::vector (1, "Intensity"); - } - - // The next function returns a set of + // In the constructor, we need to + // call the constructor of the base + // class with two arguments. The + // first denotes the name by which + // the single scalar quantity + // computed by this class should be + // represented in output files. In + // our case, the postprocessor has + // $|u|$ as output, so we use + // "Intensity". + // + // The second argument is a set of // flags that indicate which data is // needed by the postprocessor in // order to compute the output @@ -463,11 +461,11 @@ namespace Step29 // $|u|$, so we're good with the // update_values flag. template - UpdateFlags - ComputeIntensity::get_needed_update_flags () const - { - return update_values; - } + ComputeIntensity::ComputeIntensity () + : + DataPostprocessorScalar ("Intensity", + update_values) + {} // The actual prostprocessing happens diff --git a/deal.II/include/deal.II/numerics/data_postprocessor.h b/deal.II/include/deal.II/numerics/data_postprocessor.h index 8554319922..08114a1ed7 100644 --- a/deal.II/include/deal.II/numerics/data_postprocessor.h +++ b/deal.II/include/deal.II/numerics/data_postprocessor.h @@ -39,33 +39,58 @@ DEAL_II_NAMESPACE_OPEN * be overloaded to compute new quantities. * * A data vector and an object of a derived class can be given to the - * DataOut::add_data_vector function, which will write the derived + * DataOut::add_data_vector() function, which will write the derived * quantities instead of the provided data to the output file. Note, that the - * DataPostprocessor has to live until @p build_patches has been + * DataPostprocessor has to live until DataOut::build_patches has been * called. DataOutFaces and DataOutRotation can be used as well. * * In order not to perform needless calculations, DataPostprocessor - * has to provide the information, which input data is needed for the + * has to provide information which input data is needed for the * calculation of the derived quantities, i.e. whether it needs the * values, the first derivative and/or the second derivative of the * provided data. DataPostprocessor objects which are used in * combination with a DataOutFaces object can also ask for the normal - * vectors at each point. The information, which data is needed has to - * be provided via the UpdateFlags returned by the virtual function @p - * get_needed_update_flags. It is your responsibility to use only + * vectors at each point. The information which data is needed has to + * be provided via the UpdateFlags returned by the virtual function + * get_needed_update_flags(). It is your responsibility to use only * those values which were updated in the calculation of derived * quantities. The DataOut object will provide references to the * requested data in the call to compute_derived_quantities_scalar() * or compute_derived_quantities_vector() (DataOut decides which of * the two functions to call depending on whether the finite element - * in use has only a single, or multiple vector components). + * in use has only a single, or multiple vector components; note that + * this is only determined by the number of components in the finite + * element in use, and not by whether the data computed by a class + * derived from the current one is scalar or vector valued). * - * Furthermore, derived classes have to implement the @p get_names and @p - * n_output_variables functions, where the number of output variables returned + * Furthermore, derived classes have to implement the get_names() + * function, where the number of output variables returned * by the latter function has to match the size of the vector returned by the * former. Furthermore, this number has to match the number of computed * quantities, of course. * + * + *

    Use in simpler cases

    + * + * Deriving from the current class allows to implement very general postprocessors. + * For example, in the step-32 program, we implement a postprocessor that + * takes a solution that consists of velocity, pressure and temperature (dim+2 + * components) and computes a variety of output quantities, some of which + * are vector valued and some of which are scalar. On the other hand, + * in step-28 we implement a postprocessor that only computes the magnitude + * of a complex number given by a two-component finite element. It seems silly + * to have to implement four virtual functions for this + * (compute_derived_quantities_scalar() or compute_derived_quantities_vector(), + * get_names(), get_update_flags() and get_data_component_interpretation()). + * + * To this end there are two classes DataPostprocessorScalar and + * DataPostprocessorVector that are meant to be used if the output quantity + * is either a single scalar or a single vector (here used meaning to have + * exactly dim components). When using these classes, one only has to write a + * constructor that passes the name of the output variable and the update + * flags to the constructor of the base class and overload the function + * that actually computes the results. + * * @ingroup output * @author Tobias Leicht, 2007 */ @@ -75,7 +100,7 @@ class DataPostprocessor: public Subscriptor public: /** * Virtual desctructor for safety. Does not - * do anything so far. + * do anything. */ virtual ~DataPostprocessor (); @@ -239,6 +264,186 @@ class DataPostprocessor: public Subscriptor virtual UpdateFlags get_needed_update_flags () const = 0; }; + + +/** + * This class provides a simpler interface to the functionality offered by + * the DataPostprocessor class in case one wants to compute only a + * single scalar quantity from the finite element field passed to the + * DataOut class. For this particular case, it is clear what the returned + * value of DataPostprocessor::get_data_component_interpretation() should + * be and we pass the values returned by get_names() and get_needed_update_flags() + * to the constructor so that derived classes do not have to implement these + * functions by hand. + * + * All derived classes have to do is implement a constructor and overload + * either DataPostprocessor::compute_derived_quantities_scalar() or + * DataPostprocessor::compute_derived_quantities_vector(). + * + * An example of how this class can be used can be found in step-29. + * + * @ingroup output + * @author Wolfgang Bangerth, 2011 + */ +template +class DataPostprocessorScalar : public DataPostprocessor +{ +public: + /** + * Constructor. Take the name of the single scalar variable + * computed by classes derived from the current one, as well + * as the update flags necessary to compute this quantity. + * + * @param name The name by which the scalar variable + * computed by this class should be made available in + * graphical output files. + * @param update_flags This has + * to be a combination of @p update_values, + * @p update_gradients and @p + * update_hessians. If the + * DataPostprocessor is to be used in + * combination with DataOutFaces, you may + * also ask for a update of normals via the + * @p update_normal_vectors flag. + **/ + DataPostprocessorScalar (const std::string &name, + const UpdateFlags update_flags); + + /** + * Return the vector of strings describing + * the names of the computed quantities. + * Given the purpose of this class, this + * is a vector with a single entry equal + * to the name given to the constructor. + */ + virtual std::vector get_names () const; + + /** + * This functions returns + * information about how the + * individual components of + * output files that consist of + * more than one data set are to + * be interpreted. Since the current + * class is meant to be used for a + * single scalar result variable, + * the returned value is obviously + * DataComponentInterpretation::component_is_scalar. + */ + virtual + std::vector + get_data_component_interpretation () const; + + /** + * Return, which data has to be provided to + * compute the derived quantities. + * The flags returned here are the ones + * passed to the constructor of this + * class. + */ + virtual UpdateFlags get_needed_update_flags () const; + +private: + /** + * Copies of the two arguments given to the constructor of this + * class. + */ + const std::string name; + const UpdateFlags update_flags; +}; + + + +/** + * This class provides a simpler interface to the functionality offered by + * the DataPostprocessor class in case one wants to compute only a + * single vector quantity (defined as having exactly dim components) + * from the finite element field passed to the + * DataOut class. For this particular case, it is clear what the returned + * value of DataPostprocessor::get_data_component_interpretation() should + * be and we pass the values returned by get_names() and get_needed_update_flags() + * to the constructor so that derived classes do not have to implement these + * functions by hand. + * + * All derived classes have to do is implement a constructor and overload + * either DataPostprocessor::compute_derived_quantities_scalar() or + * DataPostprocessor::compute_derived_quantities_vector(). + * + * An example of how the closely related class DataPostprocessorScalar is + * used can be found in step-29. + * + * @ingroup output + * @author Wolfgang Bangerth, 2011 + */ +template +class DataPostprocessorVector : public DataPostprocessor +{ +public: + /** + * Constructor. Take the name of the single vector variable + * computed by classes derived from the current one, as well + * as the update flags necessary to compute this quantity. + * + * @param name The name by which the vector variable + * computed by this class should be made available in + * graphical output files. + * @param update_flags This has + * to be a combination of @p update_values, + * @p update_gradients and @p + * update_hessians. If the + * DataPostprocessor is to be used in + * combination with DataOutFaces, you may + * also ask for a update of normals via the + * @p update_normal_vectors flag. + **/ + DataPostprocessorVector (const std::string &name, + const UpdateFlags update_flags); + + /** + * Return the vector of strings describing + * the names of the computed quantities. + * Given the purpose of this class, this + * is a vector with dim entries all equal + * to the name given to the constructor. + */ + virtual std::vector get_names () const; + + /** + * This functions returns + * information about how the + * individual components of + * output files that consist of + * more than one data set are to + * be interpreted. Since the current + * class is meant to be used for a + * single vector result variable, + * the returned value is obviously + * DataComponentInterpretation::component_is_part + * repeated dim times. + */ + virtual + std::vector + get_data_component_interpretation () const; + + /** + * Return which data has to be provided to + * compute the derived quantities. + * The flags returned here are the ones + * passed to the constructor of this + * class. + */ + virtual UpdateFlags get_needed_update_flags () const; + +private: + /** + * Copies of the two arguments given to the constructor of this + * class. + */ + const std::string name; + const UpdateFlags update_flags; +}; + + DEAL_II_NAMESPACE_CLOSE #endif diff --git a/deal.II/source/numerics/data_postprocessor.cc b/deal.II/source/numerics/data_postprocessor.cc index 281b84c61b..9892892364 100644 --- a/deal.II/source/numerics/data_postprocessor.cc +++ b/deal.II/source/numerics/data_postprocessor.cc @@ -15,6 +15,9 @@ DEAL_II_NAMESPACE_OPEN + +// -------------------------- DataPostprocessor --------------------------- + template DataPostprocessor::~DataPostprocessor() {} @@ -93,6 +96,92 @@ DataPostprocessor::get_data_component_interpretation () const } +// -------------------------- DataPostprocessorScalar --------------------------- + +template +DataPostprocessorScalar:: +DataPostprocessorScalar (const std::string &name, + const UpdateFlags update_flags) +: +name (name), +update_flags (update_flags) +{} + + + +template +std::vector +DataPostprocessorScalar:: +get_names () const +{ + return std::vector (1, name); +} + + + +template +std::vector +DataPostprocessorScalar:: +get_data_component_interpretation () const +{ + return + std::vector + (1, DataComponentInterpretation::component_is_scalar); +} + + +template +UpdateFlags +DataPostprocessorScalar:: +get_needed_update_flags () const +{ + return update_flags; +} + + + + // -------------------------- DataPostprocessorVector --------------------------- + +template +DataPostprocessorVector:: +DataPostprocessorVector (const std::string &name, + const UpdateFlags update_flags) +: +name (name), +update_flags (update_flags) +{} + + + +template +std::vector +DataPostprocessorVector:: +get_names () const +{ + return std::vector (dim, name); +} + + + +template +std::vector +DataPostprocessorVector:: +get_data_component_interpretation () const +{ + return + std::vector + (dim, DataComponentInterpretation::component_is_part_of_vector); +} + + +template +UpdateFlags +DataPostprocessorVector:: +get_needed_update_flags () const +{ + return update_flags; +} + // explicit instantiation #include "data_postprocessor.inst" diff --git a/deal.II/source/numerics/data_postprocessor.inst.in b/deal.II/source/numerics/data_postprocessor.inst.in index 3cf15e8778..3a1304c683 100644 --- a/deal.II/source/numerics/data_postprocessor.inst.in +++ b/deal.II/source/numerics/data_postprocessor.inst.in @@ -14,4 +14,6 @@ for (deal_II_dimension : DIMENSIONS) { template class DataPostprocessor; + template class DataPostprocessorScalar; + template class DataPostprocessorVector; } diff --git a/tests/deal.II/data_out_postprocessor_scalar_01.cc b/tests/deal.II/data_out_postprocessor_scalar_01.cc new file mode 100644 index 0000000000..abcd03f4c3 --- /dev/null +++ b/tests/deal.II/data_out_postprocessor_scalar_01.cc @@ -0,0 +1,196 @@ +//---------------------------- data_out.cc --------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2011 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------- data_out.cc --------------------------- + +// tests DataPostprocessor: create a FE field that has two components of +// the kind cos(something) and sin(something) and then have a postprocessor +// that computes the sum of squares. should always be equal to one +// +// this test uses the shortcut class DataPostprocessorScalar to make +// writing postprocessors simpler + + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + + +std::ofstream logfile("data_out_postprocessor_scalar_01/output"); + + +template +class LaplaceProblem +{ + public: + LaplaceProblem (); + void run (); + + private: + void make_grid_and_dofs (); + void solve (); + void output_results () const; + + Triangulation triangulation; + FESystem fe; + DoFHandler dof_handler; + + Vector solution; +}; + + +template +LaplaceProblem::LaplaceProblem () + : + fe (FE_Q(1),2), + dof_handler (triangulation) +{} + + + +template +void LaplaceProblem::make_grid_and_dofs () +{ + GridGenerator::hyper_cube (triangulation, 0, 1); + triangulation.refine_global (1); + triangulation.begin_active()->set_refine_flag (); + triangulation.execute_coarsening_and_refinement (); + + dof_handler.distribute_dofs (fe); + solution.reinit (dof_handler.n_dofs()); +} + + + +template +class SinesAndCosines : public Function +{ + public: + SinesAndCosines () + : + Function (2) + {} + + double value (const Point &p, + const unsigned int component) const + { + switch (component) + { + case 0: + return std::sin (p.norm()); + case 1: + return std::cos (p.norm()); + default: + Assert (false, ExcNotImplemented()); + return 0; + } + } +}; + + + +template +void LaplaceProblem::solve () +{ + // dummy solve. just insert some + // values as mentioned at the top + // of the file + VectorTools::interpolate (dof_handler, + SinesAndCosines(), + solution); +} + + +template +class MyPostprocessor : public DataPostprocessorScalar +{ + public: + MyPostprocessor () + : + DataPostprocessorScalar ("magnitude", update_values) + {} + + virtual + void + compute_derived_quantities_vector (const std::vector > &uh, + const std::vector > > &, + const std::vector > > &, + const std::vector > &, + const std::vector > &, + std::vector > &computed_quantities) const + { + for (unsigned int q=0; q +void LaplaceProblem::output_results () const +{ + MyPostprocessor p; + DataOut data_out; + data_out.attach_dof_handler (dof_handler); + data_out.add_data_vector (solution, p); + data_out.build_patches (); + data_out.write_gnuplot (logfile); +} + + + +template +void LaplaceProblem::run () +{ + make_grid_and_dofs(); + solve (); + output_results (); +} + + + +int main () +{ + deallog.depth_console (0); + logfile << std::setprecision(2); + deallog << std::setprecision(2); + + LaplaceProblem<2> laplace_problem_2d; + laplace_problem_2d.run (); + + LaplaceProblem<3> laplace_problem_3d; + laplace_problem_3d.run (); + + return 0; +} diff --git a/tests/deal.II/data_out_postprocessor_scalar_01/cmp/generic b/tests/deal.II/data_out_postprocessor_scalar_01/cmp/generic new file mode 100644 index 0000000000..5df4e5c863 --- /dev/null +++ b/tests/deal.II/data_out_postprocessor_scalar_01/cmp/generic @@ -0,0 +1,783 @@ +# This file was generated by the deal.II library. + + +# +# For a description of the GNUPLOT format see the GNUPLOT manual. +# +# +0.5 0 1 +1 0 1 + +0.5 0.5 1 +1 0.5 1 + + +0 0.5 1 +0.5 0.5 1 + +0 1 1 +0.5 1 1 + + +0.5 0.5 1 +1 0.5 1 + +0.5 1 1 +1 1 1 + + +0 0 1 +0.25 0 1 + +0 0.25 1 +0.25 0.25 1 + + +0.25 0 1 +0.5 0 1 + +0.25 0.25 1 +0.5 0.25 1 + + +0 0.25 1 +0.25 0.25 1 + +0 0.5 1 +0.25 0.5 1 + + +0.25 0.25 1 +0.5 0.25 1 + +0.25 0.5 1 +0.5 0.5 1 + + +# This file was generated by the deal.II library. + + +# +# For a description of the GNUPLOT format see the GNUPLOT manual. +# +# +0.5 0 0 1 +1 0 0 1 + + +0.5 0 0 1 +0.5 0.5 0 1 + + +0.5 0 0 1 +0.5 0 0.5 1 + + +1 0 0 1 +1 0.5 0 1 + + +1 0 0 1 +1 0 0.5 1 + + +0.5 0.5 0 1 +1 0.5 0 1 + + +0.5 0.5 0 1 +0.5 0.5 0.5 1 + + +1 0.5 0 1 +1 0.5 0.5 1 + + +0.5 0 0.5 1 +1 0 0.5 1 + + +0.5 0 0.5 1 +0.5 0.5 0.5 1 + + +1 0 0.5 1 +1 0.5 0.5 1 + + +0.5 0.5 0.5 1 +1 0.5 0.5 1 + + +0 0.5 0 1 +0.5 0.5 0 1 + + +0 0.5 0 1 +0 1 0 1 + + +0 0.5 0 1 +0 0.5 0.5 1 + + +0.5 0.5 0 1 +0.5 1 0 1 + + +0.5 0.5 0 1 +0.5 0.5 0.5 1 + + +0 1 0 1 +0.5 1 0 1 + + +0 1 0 1 +0 1 0.5 1 + + +0.5 1 0 1 +0.5 1 0.5 1 + + +0 0.5 0.5 1 +0.5 0.5 0.5 1 + + +0 0.5 0.5 1 +0 1 0.5 1 + + +0.5 0.5 0.5 1 +0.5 1 0.5 1 + + +0 1 0.5 1 +0.5 1 0.5 1 + + +0.5 0.5 0 1 +1 0.5 0 1 + + +0.5 0.5 0 1 +0.5 1 0 1 + + +0.5 0.5 0 1 +0.5 0.5 0.5 1 + + +1 0.5 0 1 +1 1 0 1 + + +1 0.5 0 1 +1 0.5 0.5 1 + + +0.5 1 0 1 +1 1 0 1 + + +0.5 1 0 1 +0.5 1 0.5 1 + + +1 1 0 1 +1 1 0.5 1 + + +0.5 0.5 0.5 1 +1 0.5 0.5 1 + + +0.5 0.5 0.5 1 +0.5 1 0.5 1 + + +1 0.5 0.5 1 +1 1 0.5 1 + + +0.5 1 0.5 1 +1 1 0.5 1 + + +0 0 0.5 1 +0.5 0 0.5 1 + + +0 0 0.5 1 +0 0.5 0.5 1 + + +0 0 0.5 1 +0 0 1 1 + + +0.5 0 0.5 1 +0.5 0.5 0.5 1 + + +0.5 0 0.5 1 +0.5 0 1 1 + + +0 0.5 0.5 1 +0.5 0.5 0.5 1 + + +0 0.5 0.5 1 +0 0.5 1 1 + + +0.5 0.5 0.5 1 +0.5 0.5 1 1 + + +0 0 1 1 +0.5 0 1 1 + + +0 0 1 1 +0 0.5 1 1 + + +0.5 0 1 1 +0.5 0.5 1 1 + + +0 0.5 1 1 +0.5 0.5 1 1 + + +0.5 0 0.5 1 +1 0 0.5 1 + + +0.5 0 0.5 1 +0.5 0.5 0.5 1 + + +0.5 0 0.5 1 +0.5 0 1 1 + + +1 0 0.5 1 +1 0.5 0.5 1 + + +1 0 0.5 1 +1 0 1 1 + + +0.5 0.5 0.5 1 +1 0.5 0.5 1 + + +0.5 0.5 0.5 1 +0.5 0.5 1 1 + + +1 0.5 0.5 1 +1 0.5 1 1 + + +0.5 0 1 1 +1 0 1 1 + + +0.5 0 1 1 +0.5 0.5 1 1 + + +1 0 1 1 +1 0.5 1 1 + + +0.5 0.5 1 1 +1 0.5 1 1 + + +0 0.5 0.5 1 +0.5 0.5 0.5 1 + + +0 0.5 0.5 1 +0 1 0.5 1 + + +0 0.5 0.5 1 +0 0.5 1 1 + + +0.5 0.5 0.5 1 +0.5 1 0.5 1 + + +0.5 0.5 0.5 1 +0.5 0.5 1 1 + + +0 1 0.5 1 +0.5 1 0.5 1 + + +0 1 0.5 1 +0 1 1 1 + + +0.5 1 0.5 1 +0.5 1 1 1 + + +0 0.5 1 1 +0.5 0.5 1 1 + + +0 0.5 1 1 +0 1 1 1 + + +0.5 0.5 1 1 +0.5 1 1 1 + + +0 1 1 1 +0.5 1 1 1 + + +0.5 0.5 0.5 1 +1 0.5 0.5 1 + + +0.5 0.5 0.5 1 +0.5 1 0.5 1 + + +0.5 0.5 0.5 1 +0.5 0.5 1 1 + + +1 0.5 0.5 1 +1 1 0.5 1 + + +1 0.5 0.5 1 +1 0.5 1 1 + + +0.5 1 0.5 1 +1 1 0.5 1 + + +0.5 1 0.5 1 +0.5 1 1 1 + + +1 1 0.5 1 +1 1 1 1 + + +0.5 0.5 1 1 +1 0.5 1 1 + + +0.5 0.5 1 1 +0.5 1 1 1 + + +1 0.5 1 1 +1 1 1 1 + + +0.5 1 1 1 +1 1 1 1 + + +0 0 0 1 +0.25 0 0 1 + + +0 0 0 1 +0 0.25 0 1 + + +0 0 0 1 +0 0 0.25 1 + + +0.25 0 0 1 +0.25 0.25 0 1 + + +0.25 0 0 1 +0.25 0 0.25 1 + + +0 0.25 0 1 +0.25 0.25 0 1 + + +0 0.25 0 1 +0 0.25 0.25 1 + + +0.25 0.25 0 1 +0.25 0.25 0.25 1 + + +0 0 0.25 1 +0.25 0 0.25 1 + + +0 0 0.25 1 +0 0.25 0.25 1 + + +0.25 0 0.25 1 +0.25 0.25 0.25 1 + + +0 0.25 0.25 1 +0.25 0.25 0.25 1 + + +0.25 0 0 1 +0.5 0 0 1 + + +0.25 0 0 1 +0.25 0.25 0 1 + + +0.25 0 0 1 +0.25 0 0.25 1 + + +0.5 0 0 1 +0.5 0.25 0 1 + + +0.5 0 0 1 +0.5 0 0.25 1 + + +0.25 0.25 0 1 +0.5 0.25 0 1 + + +0.25 0.25 0 1 +0.25 0.25 0.25 1 + + +0.5 0.25 0 1 +0.5 0.25 0.25 1 + + +0.25 0 0.25 1 +0.5 0 0.25 1 + + +0.25 0 0.25 1 +0.25 0.25 0.25 1 + + +0.5 0 0.25 1 +0.5 0.25 0.25 1 + + +0.25 0.25 0.25 1 +0.5 0.25 0.25 1 + + +0 0.25 0 1 +0.25 0.25 0 1 + + +0 0.25 0 1 +0 0.5 0 1 + + +0 0.25 0 1 +0 0.25 0.25 1 + + +0.25 0.25 0 1 +0.25 0.5 0 1 + + +0.25 0.25 0 1 +0.25 0.25 0.25 1 + + +0 0.5 0 1 +0.25 0.5 0 1 + + +0 0.5 0 1 +0 0.5 0.25 1 + + +0.25 0.5 0 1 +0.25 0.5 0.25 1 + + +0 0.25 0.25 1 +0.25 0.25 0.25 1 + + +0 0.25 0.25 1 +0 0.5 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.5 0.25 1 + + +0 0.5 0.25 1 +0.25 0.5 0.25 1 + + +0.25 0.25 0 1 +0.5 0.25 0 1 + + +0.25 0.25 0 1 +0.25 0.5 0 1 + + +0.25 0.25 0 1 +0.25 0.25 0.25 1 + + +0.5 0.25 0 1 +0.5 0.5 0 1 + + +0.5 0.25 0 1 +0.5 0.25 0.25 1 + + +0.25 0.5 0 1 +0.5 0.5 0 1 + + +0.25 0.5 0 1 +0.25 0.5 0.25 1 + + +0.5 0.5 0 1 +0.5 0.5 0.25 1 + + +0.25 0.25 0.25 1 +0.5 0.25 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.5 0.25 1 + + +0.5 0.25 0.25 1 +0.5 0.5 0.25 1 + + +0.25 0.5 0.25 1 +0.5 0.5 0.25 1 + + +0 0 0.25 1 +0.25 0 0.25 1 + + +0 0 0.25 1 +0 0.25 0.25 1 + + +0 0 0.25 1 +0 0 0.5 1 + + +0.25 0 0.25 1 +0.25 0.25 0.25 1 + + +0.25 0 0.25 1 +0.25 0 0.5 1 + + +0 0.25 0.25 1 +0.25 0.25 0.25 1 + + +0 0.25 0.25 1 +0 0.25 0.5 1 + + +0.25 0.25 0.25 1 +0.25 0.25 0.5 1 + + +0 0 0.5 1 +0.25 0 0.5 1 + + +0 0 0.5 1 +0 0.25 0.5 1 + + +0.25 0 0.5 1 +0.25 0.25 0.5 1 + + +0 0.25 0.5 1 +0.25 0.25 0.5 1 + + +0.25 0 0.25 1 +0.5 0 0.25 1 + + +0.25 0 0.25 1 +0.25 0.25 0.25 1 + + +0.25 0 0.25 1 +0.25 0 0.5 1 + + +0.5 0 0.25 1 +0.5 0.25 0.25 1 + + +0.5 0 0.25 1 +0.5 0 0.5 1 + + +0.25 0.25 0.25 1 +0.5 0.25 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.25 0.5 1 + + +0.5 0.25 0.25 1 +0.5 0.25 0.5 1 + + +0.25 0 0.5 1 +0.5 0 0.5 1 + + +0.25 0 0.5 1 +0.25 0.25 0.5 1 + + +0.5 0 0.5 1 +0.5 0.25 0.5 1 + + +0.25 0.25 0.5 1 +0.5 0.25 0.5 1 + + +0 0.25 0.25 1 +0.25 0.25 0.25 1 + + +0 0.25 0.25 1 +0 0.5 0.25 1 + + +0 0.25 0.25 1 +0 0.25 0.5 1 + + +0.25 0.25 0.25 1 +0.25 0.5 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.25 0.5 1 + + +0 0.5 0.25 1 +0.25 0.5 0.25 1 + + +0 0.5 0.25 1 +0 0.5 0.5 1 + + +0.25 0.5 0.25 1 +0.25 0.5 0.5 1 + + +0 0.25 0.5 1 +0.25 0.25 0.5 1 + + +0 0.25 0.5 1 +0 0.5 0.5 1 + + +0.25 0.25 0.5 1 +0.25 0.5 0.5 1 + + +0 0.5 0.5 1 +0.25 0.5 0.5 1 + + +0.25 0.25 0.25 1 +0.5 0.25 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.5 0.25 1 + + +0.25 0.25 0.25 1 +0.25 0.25 0.5 1 + + +0.5 0.25 0.25 1 +0.5 0.5 0.25 1 + + +0.5 0.25 0.25 1 +0.5 0.25 0.5 1 + + +0.25 0.5 0.25 1 +0.5 0.5 0.25 1 + + +0.25 0.5 0.25 1 +0.25 0.5 0.5 1 + + +0.5 0.5 0.25 1 +0.5 0.5 0.5 1 + + +0.25 0.25 0.5 1 +0.5 0.25 0.5 1 + + +0.25 0.25 0.5 1 +0.25 0.5 0.5 1 + + +0.5 0.25 0.5 1 +0.5 0.5 0.5 1 + + +0.25 0.5 0.5 1 +0.5 0.5 0.5 1 + + diff --git a/tests/deal.II/data_out_postprocessor_vector_01.cc b/tests/deal.II/data_out_postprocessor_vector_01.cc new file mode 100644 index 0000000000..393d05c6cc --- /dev/null +++ b/tests/deal.II/data_out_postprocessor_vector_01.cc @@ -0,0 +1,197 @@ +//---------------------------- data_out.cc --------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2011 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------- data_out.cc --------------------------- + +// tests DataPostprocessor: create a FE field that has two components of +// the kind cos(something) and sin(something) and then have a postprocessor +// that computes the sum of squares. should always be equal to one +// +// this test uses the shortcut class DataPostprocessorVector to make +// writing postprocessors simpler + + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + + +std::ofstream logfile("data_out_postprocessor_vector_01/output"); + + +template +class LaplaceProblem +{ + public: + LaplaceProblem (); + void run (); + + private: + void make_grid_and_dofs (); + void solve (); + void output_results () const; + + Triangulation triangulation; + FESystem fe; + DoFHandler dof_handler; + + Vector solution; +}; + + +template +LaplaceProblem::LaplaceProblem () + : + fe (FE_Q(1),2), + dof_handler (triangulation) +{} + + + +template +void LaplaceProblem::make_grid_and_dofs () +{ + GridGenerator::hyper_cube (triangulation, 0, 1); + triangulation.refine_global (1); + triangulation.begin_active()->set_refine_flag (); + triangulation.execute_coarsening_and_refinement (); + + dof_handler.distribute_dofs (fe); + solution.reinit (dof_handler.n_dofs()); +} + + + +template +class SinesAndCosines : public Function +{ + public: + SinesAndCosines () + : + Function (2) + {} + + double value (const Point &p, + const unsigned int component) const + { + switch (component) + { + case 0: + return std::sin (p.norm()); + case 1: + return std::cos (p.norm()); + default: + Assert (false, ExcNotImplemented()); + return 0; + } + } +}; + + + +template +void LaplaceProblem::solve () +{ + // dummy solve. just insert some + // values as mentioned at the top + // of the file + VectorTools::interpolate (dof_handler, + SinesAndCosines(), + solution); +} + + +template +class MyPostprocessor : public DataPostprocessorVector +{ + public: + MyPostprocessor () + : + DataPostprocessorVector ("magnitude_times_d", update_values) + {} + + virtual + void + compute_derived_quantities_vector (const std::vector > &uh, + const std::vector > > &, + const std::vector > > &, + const std::vector > &, + const std::vector > &, + std::vector > &computed_quantities) const + { + for (unsigned int q=0; q +void LaplaceProblem::output_results () const +{ + MyPostprocessor p; + DataOut data_out; + data_out.attach_dof_handler (dof_handler); + data_out.add_data_vector (solution, p); + data_out.build_patches (); + data_out.write_gnuplot (logfile); +} + + + +template +void LaplaceProblem::run () +{ + make_grid_and_dofs(); + solve (); + output_results (); +} + + + +int main () +{ + deallog.depth_console (0); + logfile << std::setprecision(2); + deallog << std::setprecision(2); + + LaplaceProblem<2> laplace_problem_2d; + laplace_problem_2d.run (); + + LaplaceProblem<3> laplace_problem_3d; + laplace_problem_3d.run (); + + return 0; +} diff --git a/tests/deal.II/data_out_postprocessor_vector_01/cmp/generic b/tests/deal.II/data_out_postprocessor_vector_01/cmp/generic new file mode 100644 index 0000000000..6e914eca0c --- /dev/null +++ b/tests/deal.II/data_out_postprocessor_vector_01/cmp/generic @@ -0,0 +1,783 @@ +# This file was generated by the deal.II library. + + +# +# For a description of the GNUPLOT format see the GNUPLOT manual. +# +# +0.5 0 1 1 +1 0 1 1 + +0.5 0.5 1 1 +1 0.5 1 1 + + +0 0.5 1 1 +0.5 0.5 1 1 + +0 1 1 1 +0.5 1 1 1 + + +0.5 0.5 1 1 +1 0.5 1 1 + +0.5 1 1 1 +1 1 1 1 + + +0 0 1 1 +0.25 0 1 1 + +0 0.25 1 1 +0.25 0.25 1 1 + + +0.25 0 1 1 +0.5 0 1 1 + +0.25 0.25 1 1 +0.5 0.25 1 1 + + +0 0.25 1 1 +0.25 0.25 1 1 + +0 0.5 1 1 +0.25 0.5 1 1 + + +0.25 0.25 1 1 +0.5 0.25 1 1 + +0.25 0.5 1 1 +0.5 0.5 1 1 + + +# This file was generated by the deal.II library. + + +# +# For a description of the GNUPLOT format see the GNUPLOT manual. +# +# +0.5 0 0 1 1 1 +1 0 0 1 1 1 + + +0.5 0 0 1 1 1 +0.5 0.5 0 1 1 1 + + +0.5 0 0 1 1 1 +0.5 0 0.5 1 1 1 + + +1 0 0 1 1 1 +1 0.5 0 1 1 1 + + +1 0 0 1 1 1 +1 0 0.5 1 1 1 + + +0.5 0.5 0 1 1 1 +1 0.5 0 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 0.5 0.5 1 1 1 + + +1 0.5 0 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +1 0 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +1 0 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +0 0.5 0 1 1 1 +0.5 0.5 0 1 1 1 + + +0 0.5 0 1 1 1 +0 1 0 1 1 1 + + +0 0.5 0 1 1 1 +0 0.5 0.5 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 1 0 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0 1 0 1 1 1 +0.5 1 0 1 1 1 + + +0 1 0 1 1 1 +0 1 0.5 1 1 1 + + +0.5 1 0 1 1 1 +0.5 1 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0 1 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +0 1 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +0.5 0.5 0 1 1 1 +1 0.5 0 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 1 0 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 0.5 0.5 1 1 1 + + +1 0.5 0 1 1 1 +1 1 0 1 1 1 + + +1 0.5 0 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 1 0 1 1 1 +1 1 0 1 1 1 + + +0.5 1 0 1 1 1 +0.5 1 0.5 1 1 1 + + +1 1 0 1 1 1 +1 1 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +1 0.5 0.5 1 1 1 +1 1 0.5 1 1 1 + + +0.5 1 0.5 1 1 1 +1 1 0.5 1 1 1 + + +0 0 0.5 1 1 1 +0.5 0 0.5 1 1 1 + + +0 0 0.5 1 1 1 +0 0.5 0.5 1 1 1 + + +0 0 0.5 1 1 1 +0 0 1 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0 1 1 1 1 + + +0 0.5 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0 0.5 1 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 0.5 1 1 1 1 + + +0 0 1 1 1 1 +0.5 0 1 1 1 1 + + +0 0 1 1 1 1 +0 0.5 1 1 1 1 + + +0.5 0 1 1 1 1 +0.5 0.5 1 1 1 1 + + +0 0.5 1 1 1 1 +0.5 0.5 1 1 1 1 + + +0.5 0 0.5 1 1 1 +1 0 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0 1 1 1 1 + + +1 0 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +1 0 0.5 1 1 1 +1 0 1 1 1 1 + + +0.5 0.5 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 0.5 1 1 1 1 + + +1 0.5 0.5 1 1 1 +1 0.5 1 1 1 1 + + +0.5 0 1 1 1 1 +1 0 1 1 1 1 + + +0.5 0 1 1 1 1 +0.5 0.5 1 1 1 1 + + +1 0 1 1 1 1 +1 0.5 1 1 1 1 + + +0.5 0.5 1 1 1 1 +1 0.5 1 1 1 1 + + +0 0.5 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0 1 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0 0.5 1 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 0.5 1 1 1 1 + + +0 1 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +0 1 0.5 1 1 1 +0 1 1 1 1 1 + + +0.5 1 0.5 1 1 1 +0.5 1 1 1 1 1 + + +0 0.5 1 1 1 1 +0.5 0.5 1 1 1 1 + + +0 0.5 1 1 1 1 +0 1 1 1 1 1 + + +0.5 0.5 1 1 1 1 +0.5 1 1 1 1 1 + + +0 1 1 1 1 1 +0.5 1 1 1 1 1 + + +0.5 0.5 0.5 1 1 1 +1 0.5 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 1 0.5 1 1 1 + + +0.5 0.5 0.5 1 1 1 +0.5 0.5 1 1 1 1 + + +1 0.5 0.5 1 1 1 +1 1 0.5 1 1 1 + + +1 0.5 0.5 1 1 1 +1 0.5 1 1 1 1 + + +0.5 1 0.5 1 1 1 +1 1 0.5 1 1 1 + + +0.5 1 0.5 1 1 1 +0.5 1 1 1 1 1 + + +1 1 0.5 1 1 1 +1 1 1 1 1 1 + + +0.5 0.5 1 1 1 1 +1 0.5 1 1 1 1 + + +0.5 0.5 1 1 1 1 +0.5 1 1 1 1 1 + + +1 0.5 1 1 1 1 +1 1 1 1 1 1 + + +0.5 1 1 1 1 1 +1 1 1 1 1 1 + + +0 0 0 1 1 1 +0.25 0 0 1 1 1 + + +0 0 0 1 1 1 +0 0.25 0 1 1 1 + + +0 0 0 1 1 1 +0 0 0.25 1 1 1 + + +0.25 0 0 1 1 1 +0.25 0.25 0 1 1 1 + + +0.25 0 0 1 1 1 +0.25 0 0.25 1 1 1 + + +0 0.25 0 1 1 1 +0.25 0.25 0 1 1 1 + + +0 0.25 0 1 1 1 +0 0.25 0.25 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0 0.25 1 1 1 +0.25 0 0.25 1 1 1 + + +0 0 0.25 1 1 1 +0 0.25 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.25 0 0 1 1 1 +0.5 0 0 1 1 1 + + +0.25 0 0 1 1 1 +0.25 0.25 0 1 1 1 + + +0.25 0 0 1 1 1 +0.25 0 0.25 1 1 1 + + +0.5 0 0 1 1 1 +0.5 0.25 0 1 1 1 + + +0.5 0 0 1 1 1 +0.5 0 0.25 1 1 1 + + +0.25 0.25 0 1 1 1 +0.5 0.25 0 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.5 0.25 0 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.5 0 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.5 0 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0 0.25 0 1 1 1 +0.25 0.25 0 1 1 1 + + +0 0.25 0 1 1 1 +0 0.5 0 1 1 1 + + +0 0.25 0 1 1 1 +0 0.25 0.25 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.5 0 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0.5 0 1 1 1 +0.25 0.5 0 1 1 1 + + +0 0.5 0 1 1 1 +0 0.5 0.25 1 1 1 + + +0.25 0.5 0 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0 0.5 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0 0.5 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0.25 0.25 0 1 1 1 +0.5 0.25 0 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.5 0 1 1 1 + + +0.25 0.25 0 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.5 0.25 0 1 1 1 +0.5 0.5 0 1 1 1 + + +0.5 0.25 0 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0.5 0 1 1 1 +0.5 0.5 0 1 1 1 + + +0.25 0.5 0 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0.5 0.5 0 1 1 1 +0.5 0.5 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0.5 0.25 0.25 1 1 1 +0.5 0.5 0.25 1 1 1 + + +0.25 0.5 0.25 1 1 1 +0.5 0.5 0.25 1 1 1 + + +0 0 0.25 1 1 1 +0.25 0 0.25 1 1 1 + + +0 0 0.25 1 1 1 +0 0.25 0.25 1 1 1 + + +0 0 0.25 1 1 1 +0 0 0.5 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0 0.5 1 1 1 + + +0 0.25 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0 0.25 0.5 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0 0 0.5 1 1 1 +0.25 0 0.5 1 1 1 + + +0 0 0.5 1 1 1 +0 0.25 0.5 1 1 1 + + +0.25 0 0.5 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0 0.25 0.5 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0.25 0 0.25 1 1 1 +0.5 0 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0.25 0 0.25 1 1 1 +0.25 0 0.5 1 1 1 + + +0.5 0 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.5 0 0.25 1 1 1 +0.5 0 0.5 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0.5 0.25 0.25 1 1 1 +0.5 0.25 0.5 1 1 1 + + +0.25 0 0.5 1 1 1 +0.5 0 0.5 1 1 1 + + +0.25 0 0.5 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0.5 0 0.5 1 1 1 +0.5 0.25 0.5 1 1 1 + + +0.25 0.25 0.5 1 1 1 +0.5 0.25 0.5 1 1 1 + + +0 0.25 0.25 1 1 1 +0.25 0.25 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0 0.5 0.25 1 1 1 + + +0 0.25 0.25 1 1 1 +0 0.25 0.5 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0 0.5 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0 0.5 0.25 1 1 1 +0 0.5 0.5 1 1 1 + + +0.25 0.5 0.25 1 1 1 +0.25 0.5 0.5 1 1 1 + + +0 0.25 0.5 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0 0.25 0.5 1 1 1 +0 0.5 0.5 1 1 1 + + +0.25 0.25 0.5 1 1 1 +0.25 0.5 0.5 1 1 1 + + +0 0.5 0.5 1 1 1 +0.25 0.5 0.5 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.5 0.25 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.5 0.25 1 1 1 + + +0.25 0.25 0.25 1 1 1 +0.25 0.25 0.5 1 1 1 + + +0.5 0.25 0.25 1 1 1 +0.5 0.5 0.25 1 1 1 + + +0.5 0.25 0.25 1 1 1 +0.5 0.25 0.5 1 1 1 + + +0.25 0.5 0.25 1 1 1 +0.5 0.5 0.25 1 1 1 + + +0.25 0.5 0.25 1 1 1 +0.25 0.5 0.5 1 1 1 + + +0.5 0.5 0.25 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0.25 0.25 0.5 1 1 1 +0.5 0.25 0.5 1 1 1 + + +0.25 0.25 0.5 1 1 1 +0.25 0.5 0.5 1 1 1 + + +0.5 0.25 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + +0.25 0.5 0.5 1 1 1 +0.5 0.5 0.5 1 1 1 + + -- 2.39.5