]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Introduce DataPostprocessorScalar/Vector.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Wed, 14 Dec 2011 19:52:27 +0000 (19:52 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Wed, 14 Dec 2011 19:52:27 +0000 (19:52 +0000)
git-svn-id: https://svn.dealii.org/trunk@24827 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/doc/news/changes.h
deal.II/examples/step-29/step-29.cc
deal.II/include/deal.II/numerics/data_postprocessor.h
deal.II/source/numerics/data_postprocessor.cc
deal.II/source/numerics/data_postprocessor.inst.in
tests/deal.II/data_out_postprocessor_scalar_01.cc [new file with mode: 0644]
tests/deal.II/data_out_postprocessor_scalar_01/cmp/generic [new file with mode: 0644]
tests/deal.II/data_out_postprocessor_vector_01.cc [new file with mode: 0644]
tests/deal.II/data_out_postprocessor_vector_01/cmp/generic [new file with mode: 0644]

index 0ff3d38a6908723bd77b16ff432bdd687a4cdbb7..4fd0d9b8eb65019b8fb4ff9d73995712215ad53d 100644 (file)
@@ -73,14 +73,23 @@ enabled due to a missing include file in file
 <h3>Specific improvements</h3>
 
 <ol>
+<li> 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.
+<br>
+(Wolfgang Bangerth, 2011/12/14)
+
 <li> 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.
 <br>
-(Wolfgang Bangerth, 2011/12/15)
+(Wolfgang Bangerth, 2011/12/14)
 
 <li> Improved: Objects of the type LogStream::Prefix can now be used
 as a safe implementation of the push and pop mechanism for log
index 593131e39d3b3dde59856384fa1d4b02e2617a3f..923406c6c2f840efe724c4c18281b0d6f7cf264e 100644 (file)
@@ -345,7 +345,7 @@ namespace Step29
                                   // @sect3{The <code>ComputeIntensity</code> 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
                                   // <code>ComputeIntensity</code>
-                                  // class is about.  Notice that all
-                                  // its member functions are
-                                  // implementations of virtual
-                                  // functions defined by the interface
-                                  // class DataPostprocessor.
+                                  // class does:
   template <int dim>
-  class ComputeIntensity : public DataPostprocessor<dim>
+  class ComputeIntensity : public DataPostprocessorScalar<dim>
   {
     public:
+      ComputeIntensity ();
 
       virtual
       void
@@ -419,29 +426,20 @@ namespace Step29
                                         const std::vector< Point< dim > > &normals,
                                         const std::vector<Point<dim> > &evaluation_points,
                                         std::vector< Vector< double > > &computed_quantities) const;
-
-      virtual std::vector<std::string> get_names () const;
-      virtual UpdateFlags              get_needed_update_flags () const;
   };
 
-                                  // The <code>get_names</code>
-                                  // 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 <int dim>
-  std::vector<std::string>
-  ComputeIntensity<dim>::get_names() const
-  {
-    return std::vector<std::string> (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 <int dim>
-  UpdateFlags
-  ComputeIntensity<dim>::get_needed_update_flags () const
-  {
-    return update_values;
-  }
+  ComputeIntensity<dim>::ComputeIntensity ()
+                 :
+                 DataPostprocessorScalar<dim> ("Intensity",
+                                               update_values)
+  {}
 
 
                                   // The actual prostprocessing happens
index 8554319922e469ed6359e034acee79f6f9b807e7..08114a1ed7927aec3f4c1974316891a02782f7c9 100644 (file)
@@ -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
- * <tt>DataOut::add_data_vector</tt> 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.
  *
+ * 
+ * <h3>Use in simpler cases</h3>
+ * 
+ * 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 <int dim>
+class DataPostprocessorScalar : public DataPostprocessor<dim>
+{
+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<std::string> 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<DataComponentInterpretation::DataComponentInterpretation>
+    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 <int dim>
+class DataPostprocessorVector : public DataPostprocessor<dim>
+{
+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<std::string> 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<DataComponentInterpretation::DataComponentInterpretation>
+    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
index 281b84c61b5624735447ff197e253ea3e8c71fdb..9892892364255429639550480c15ed5ce9c843ce 100644 (file)
@@ -15,6 +15,9 @@
 DEAL_II_NAMESPACE_OPEN
 
 
+
+// -------------------------- DataPostprocessor ---------------------------
+
 template <int dim>
 DataPostprocessor<dim>::~DataPostprocessor()
 {}
@@ -93,6 +96,92 @@ DataPostprocessor<dim>::get_data_component_interpretation () const
 }
 
 
+// -------------------------- DataPostprocessorScalar ---------------------------
+
+template <int dim>
+DataPostprocessorScalar<dim>::
+DataPostprocessorScalar (const std::string &name,
+                        const UpdateFlags  update_flags)
+:
+name (name),
+update_flags (update_flags)
+{}
+
+template <int dim>
+std::vector<std::string> 
+DataPostprocessorScalar<dim>::
+get_names () const
+{
+  return std::vector<std::string> (1, name);
+}
+
+
+
+template <int dim>
+std::vector<DataComponentInterpretation::DataComponentInterpretation>
+DataPostprocessorScalar<dim>::
+get_data_component_interpretation () const
+{
+  return 
+  std::vector<DataComponentInterpretation::DataComponentInterpretation> 
+  (1, DataComponentInterpretation::component_is_scalar);
+}
+
+
+template <int dim>
+UpdateFlags 
+DataPostprocessorScalar<dim>::
+get_needed_update_flags () const
+{
+  return update_flags;
+}
+
+
+
+  // -------------------------- DataPostprocessorVector ---------------------------
+
+template <int dim>
+DataPostprocessorVector<dim>::
+DataPostprocessorVector (const std::string &name,
+                        const UpdateFlags  update_flags)
+:
+name (name),
+update_flags (update_flags)
+{}
+
+template <int dim>
+std::vector<std::string> 
+DataPostprocessorVector<dim>::
+get_names () const
+{
+  return std::vector<std::string> (dim, name);
+}
+
+
+
+template <int dim>
+std::vector<DataComponentInterpretation::DataComponentInterpretation>
+DataPostprocessorVector<dim>::
+get_data_component_interpretation () const
+{
+  return 
+  std::vector<DataComponentInterpretation::DataComponentInterpretation> 
+  (dim, DataComponentInterpretation::component_is_part_of_vector);
+}
+
+
+template <int dim>
+UpdateFlags 
+DataPostprocessorVector<dim>::
+get_needed_update_flags () const
+{
+  return update_flags;
+}
+
 
 // explicit instantiation
 #include "data_postprocessor.inst"
index 3cf15e87788bccefd2b8c983e779740a55d2e008..3a1304c683598dd1cc91747dec6fcb953ac7e93a 100644 (file)
@@ -14,4 +14,6 @@
 for (deal_II_dimension : DIMENSIONS)
 {
   template class DataPostprocessor<deal_II_dimension>;
+  template class DataPostprocessorScalar<deal_II_dimension>;
+  template class DataPostprocessorVector<deal_II_dimension>;
 }
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 (file)
index 0000000..abcd03f
--- /dev/null
@@ -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 <deal.II/grid/tria.h>
+#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/grid/tria_accessor.h>
+#include <deal.II/grid/tria_iterator.h>
+#include <deal.II/dofs/dof_accessor.h>
+#include <deal.II/fe/fe_q.h>
+#include <deal.II/fe/fe_system.h>
+#include <deal.II/base/function.h>
+#include <deal.II/numerics/vectors.h>
+#include <deal.II/numerics/matrices.h>
+#include <deal.II/lac/vector.h>
+
+#include <deal.II/numerics/data_out.h>
+#include <deal.II/numerics/data_postprocessor.h>
+#include <fstream>
+
+#include <deal.II/base/logstream.h>
+
+
+std::ofstream logfile("data_out_postprocessor_scalar_01/output");
+
+
+template <int dim>
+class LaplaceProblem
+{
+  public:
+    LaplaceProblem ();
+    void run ();
+
+  private:
+    void make_grid_and_dofs ();
+    void solve ();
+    void output_results () const;
+
+    Triangulation<dim>   triangulation;
+    FESystem<dim>            fe;
+    DoFHandler<dim>      dof_handler;
+
+    Vector<double>       solution;
+};
+
+
+template <int dim>
+LaplaceProblem<dim>::LaplaceProblem ()
+               :
+               fe (FE_Q<dim>(1),2),
+               dof_handler (triangulation)
+{}
+
+
+
+template <int dim>
+void LaplaceProblem<dim>::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 <int dim>
+class SinesAndCosines : public Function<dim>
+{
+  public:
+    SinesAndCosines ()
+                   :
+                   Function<dim> (2)
+      {}
+
+    double value (const Point<dim> &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 <int dim>
+void LaplaceProblem<dim>::solve ()
+{
+                                  // dummy solve. just insert some
+                                  // values as mentioned at the top
+                                  // of the file
+  VectorTools::interpolate (dof_handler,
+                           SinesAndCosines<dim>(),
+                           solution);
+}
+
+
+template <int dim>
+class MyPostprocessor : public DataPostprocessorScalar<dim>
+{
+  public:
+    MyPostprocessor ()
+                   :
+                   DataPostprocessorScalar<dim> ("magnitude", update_values)
+      {}
+
+    virtual
+    void
+    compute_derived_quantities_vector (const std::vector<Vector<double> >              &uh,
+                                      const std::vector<std::vector<Tensor<1,dim> > > &,
+                                      const std::vector<std::vector<Tensor<2,dim> > > &,
+                                      const std::vector<Point<dim> >                  &,
+                                      const std::vector<Point<dim> >                  &,
+                                      std::vector<Vector<double> >                    &computed_quantities) const
+      {
+       for (unsigned int q=0; q<uh.size(); ++q)
+         {
+           Assert (computed_quantities[q].size() == 1,
+                   ExcInternalError());
+
+           computed_quantities[q](0) = uh[q](0)*uh[q](0) + uh[q](1)*uh[q](1);
+           Assert (std::fabs(computed_quantities[q](0)-1) < 1e-12,
+                   ExcInternalError());
+         }
+      }
+};
+
+
+
+template <int dim>
+void LaplaceProblem<dim>::output_results () const
+{
+  MyPostprocessor<dim> p;
+  DataOut<dim> 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 <int dim>
+void LaplaceProblem<dim>::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 (file)
index 0000000..5df4e5c
--- /dev/null
@@ -0,0 +1,783 @@
+# This file was generated by the deal.II library.
+
+
+#
+# For a description of the GNUPLOT format see the GNUPLOT manual.
+#
+# <x> <y> <magnitude> 
+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.
+#
+# <x> <y> <z> <magnitude> 
+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 (file)
index 0000000..393d05c
--- /dev/null
@@ -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 <deal.II/grid/tria.h>
+#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/grid/tria_accessor.h>
+#include <deal.II/grid/tria_iterator.h>
+#include <deal.II/dofs/dof_accessor.h>
+#include <deal.II/fe/fe_q.h>
+#include <deal.II/fe/fe_system.h>
+#include <deal.II/base/function.h>
+#include <deal.II/numerics/vectors.h>
+#include <deal.II/numerics/matrices.h>
+#include <deal.II/lac/vector.h>
+
+#include <deal.II/numerics/data_out.h>
+#include <deal.II/numerics/data_postprocessor.h>
+#include <fstream>
+
+#include <deal.II/base/logstream.h>
+
+
+std::ofstream logfile("data_out_postprocessor_vector_01/output");
+
+
+template <int dim>
+class LaplaceProblem
+{
+  public:
+    LaplaceProblem ();
+    void run ();
+
+  private:
+    void make_grid_and_dofs ();
+    void solve ();
+    void output_results () const;
+
+    Triangulation<dim>   triangulation;
+    FESystem<dim>            fe;
+    DoFHandler<dim>      dof_handler;
+
+    Vector<double>       solution;
+};
+
+
+template <int dim>
+LaplaceProblem<dim>::LaplaceProblem ()
+               :
+               fe (FE_Q<dim>(1),2),
+               dof_handler (triangulation)
+{}
+
+
+
+template <int dim>
+void LaplaceProblem<dim>::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 <int dim>
+class SinesAndCosines : public Function<dim>
+{
+  public:
+    SinesAndCosines ()
+                   :
+                   Function<dim> (2)
+      {}
+
+    double value (const Point<dim> &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 <int dim>
+void LaplaceProblem<dim>::solve ()
+{
+                                  // dummy solve. just insert some
+                                  // values as mentioned at the top
+                                  // of the file
+  VectorTools::interpolate (dof_handler,
+                           SinesAndCosines<dim>(),
+                           solution);
+}
+
+
+template <int dim>
+class MyPostprocessor : public DataPostprocessorVector<dim>
+{
+  public:
+    MyPostprocessor ()
+                   :
+                   DataPostprocessorVector<dim> ("magnitude_times_d", update_values)
+      {}
+
+    virtual
+    void
+    compute_derived_quantities_vector (const std::vector<Vector<double> >              &uh,
+                                      const std::vector<std::vector<Tensor<1,dim> > > &,
+                                      const std::vector<std::vector<Tensor<2,dim> > > &,
+                                      const std::vector<Point<dim> >                  &,
+                                      const std::vector<Point<dim> >                  &,
+                                      std::vector<Vector<double> >                    &computed_quantities) const
+      {
+       for (unsigned int q=0; q<uh.size(); ++q)
+         {
+           Assert (computed_quantities[q].size() == dim,
+                   ExcInternalError());
+
+           for (unsigned int d=0; d<dim; ++d)
+             computed_quantities[q](d) = uh[q](0)*uh[q](0) + uh[q](1)*uh[q](1);
+           Assert (std::fabs(computed_quantities[q](0)-1) < 1e-12,
+                   ExcInternalError());
+         }
+      }
+};
+
+
+
+template <int dim>
+void LaplaceProblem<dim>::output_results () const
+{
+  MyPostprocessor<dim> p;
+  DataOut<dim> 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 <int dim>
+void LaplaceProblem<dim>::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 (file)
index 0000000..6e914ec
--- /dev/null
@@ -0,0 +1,783 @@
+# This file was generated by the deal.II library.
+
+
+#
+# For a description of the GNUPLOT format see the GNUPLOT manual.
+#
+# <x> <y> <magnitude_times_d> <magnitude_times_d> 
+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.
+#
+# <x> <y> <z> <magnitude_times_d> <magnitude_times_d> <magnitude_times_d> 
+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
+
+

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.