<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
// @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
// 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
// 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
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
// $|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
* 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
*/
public:
/**
* Virtual desctructor for safety. Does not
- * do anything so far.
+ * do anything.
*/
virtual ~DataPostprocessor ();
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
DEAL_II_NAMESPACE_OPEN
+
+// -------------------------- DataPostprocessor ---------------------------
+
template <int dim>
DataPostprocessor<dim>::~DataPostprocessor()
{}
}
+// -------------------------- 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"
for (deal_II_dimension : DIMENSIONS)
{
template class DataPostprocessor<deal_II_dimension>;
+ template class DataPostprocessorScalar<deal_II_dimension>;
+ template class DataPostprocessorVector<deal_II_dimension>;
}
--- /dev/null
+//---------------------------- 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;
+}
--- /dev/null
+# 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
+
+
--- /dev/null
+//---------------------------- 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;
+}
--- /dev/null
+# 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
+
+