]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix write_hdf5_parallel without MPI 4666/head
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Wed, 26 Jul 2017 16:39:09 +0000 (18:39 +0200)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Wed, 26 Jul 2017 20:46:46 +0000 (22:46 +0200)
doc/news/changes/minor/20170726DanielArndt [new file with mode: 0644]
source/base/data_out_base.cc
tests/mpi/data_out_hdf5_01.cc
tests/mpi/data_out_hdf5_02.cc
tests/numerics/data_out_hdf5_01.cc [new file with mode: 0644]
tests/numerics/data_out_hdf5_01.with_hdf5=true.output [new file with mode: 0644]
tests/numerics/data_out_hdf5_02.cc [new file with mode: 0644]
tests/numerics/data_out_hdf5_02.with_hdf5=true.output [new file with mode: 0644]

diff --git a/doc/news/changes/minor/20170726DanielArndt b/doc/news/changes/minor/20170726DanielArndt
new file mode 100644 (file)
index 0000000..42648f2
--- /dev/null
@@ -0,0 +1,4 @@
+Fixed: DataOutBase::write_hdf5_parallel() can also be used in case deal.II 
+and HDF5 are not compiled with MPI support.
+<br>
+(Daniel Arndt, 2017/07/26)
index 7bdb0a58d7c6dc215765e9f68917ee587063867a..0b9cfe9733cbd64eaedae8b2a015b615aab005ca 100644 (file)
@@ -6554,6 +6554,7 @@ create_xdmf_entry (const DataOutBase::DataOutFilter &data_filter,
   ierr = MPI_Allreduce(local_node_cell_count, global_node_cell_count, 2, MPI_UNSIGNED, MPI_SUM, comm);
   AssertThrowMPI(ierr);
 #else
+  (void)comm;
   myrank = 0;
   global_node_cell_count[0] = local_node_cell_count[0];
   global_node_cell_count[1] = local_node_cell_count[1];
@@ -6780,8 +6781,7 @@ void DataOutBase::write_hdf5_parallel (const std::vector<Patch<dim,spacedim> > &
   int ierr;
   (void)ierr;
 #ifndef DEAL_II_WITH_HDF5
-  // throw an exception, but first make
-  // sure the compiler does not warn about
+  // throw an exception, but first make sure the compiler does not warn about
   // the now unused function arguments
   (void)data_filter;
   (void)write_mesh_file;
@@ -6791,21 +6791,16 @@ void DataOutBase::write_hdf5_parallel (const std::vector<Patch<dim,spacedim> > &
   AssertThrow(false, ExcMessage ("HDF5 support is disabled."));
 #else
 #ifndef DEAL_II_WITH_MPI
-  // verify that there are indeed
-  // patches to be written out. most
-  // of the times, people just forget
-  // to call build_patches when there
-  // are no patches, so a warning is
-  // in order. that said, the
-  // assertion is disabled if we
-  // support MPI since then it can
-  // happen that on the coarsest
-  // mesh, a processor simply has no
-  // cells it actually owns, and in
-  // that case it is legit if there
-  // are no patches
+  // verify that there are indeed patches to be written out.
+  // most of the times, people just forget to call build_patches when there
+  // are no patches, so a warning is in order. that said, the assertion is
+  // disabled if we support MPI since then it can happen that on the coarsest
+  // mesh, a processor simply has no cells it actually owns, and in that case
+  // it is legit if there are no patches
   Assert (data_filter.n_nodes() > 0, ExcNoPatches());
-#else
+  (void)comm;
+#endif
+
   hid_t           h5_mesh_file_id=-1, h5_solution_file_id, file_plist_id, plist_id;
   hid_t           node_dataspace, node_dataset, node_file_dataspace, node_memory_dataspace;
   hid_t           cell_dataspace, cell_dataset, cell_file_dataspace, cell_memory_dataspace;
@@ -6852,6 +6847,8 @@ void DataOutBase::write_hdf5_parallel (const std::vector<Patch<dim,spacedim> > &
   global_node_cell_offsets[0] -= local_node_cell_count[0];
   global_node_cell_offsets[1] -= local_node_cell_count[1];
 #else
+  global_node_cell_count[0] = local_node_cell_count[0];
+  global_node_cell_count[1] = local_node_cell_count[1];
   global_node_cell_offsets[0] = global_node_cell_offsets[1] = 0;
 #endif
 
@@ -7051,7 +7048,6 @@ void DataOutBase::write_hdf5_parallel (const std::vector<Patch<dim,spacedim> > &
   status = H5Fclose(h5_solution_file_id);
   AssertThrow(status >= 0, ExcIO());
 #endif
-#endif
 }
 
 
index 5a3cf4a4b4028016532b8fa86e3653315548b712..2fd9033eae60eae09aa368c7aa8d1e614eb5b442 100644 (file)
@@ -60,9 +60,14 @@ test ()
 
 
   // Sadly hdf5 is binary and we can not use hd5dump because it might
-  // not be in the path. At least we can look at the xdmf:
+  // not be in the path. At least we can look at the xdmf
+  // and make sure that the h5 file is created:
   if (0==Utilities::MPI::this_mpi_process (MPI_COMM_WORLD))
-    cat_file("out.xdmf");
+    {
+      cat_file("out.xdmf");
+      std::ifstream f("out.h5");
+      AssertThrow(f.good(), ExcIO());
+    }
 }
 
 
index 03f00927fedd8e448424996d212364e438519a55..2615c554b7a110edaafa214da141b051a02d164f 100644 (file)
@@ -137,14 +137,19 @@ void check()
   xdmf_file.close();
 
   // Sadly hdf5 is binary and we can not use hd5dump because it might
-  // not be in the path. At least we can look at the xdmf:
+  // not be in the path. At least we can look at the xdmf
+  // and make sure that the h5 file is created:
   deallog << "\n==============================\n"
           << output_basename + ".xdmf"
           << "\n=============================="
           << std::endl;
 
   if (0==Utilities::MPI::this_mpi_process (MPI_COMM_WORLD))
-    cat_file((output_basename+".xdmf").c_str());
+    {
+      cat_file((output_basename+".xdmf").c_str());
+      std::ifstream f((output_basename+".h5").c_str());
+      AssertThrow(f.good(), ExcIO());
+    }
 
   deallog << std::flush;
 }
diff --git a/tests/numerics/data_out_hdf5_01.cc b/tests/numerics/data_out_hdf5_01.cc
new file mode 100644 (file)
index 0000000..d9511c1
--- /dev/null
@@ -0,0 +1,104 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2003 - 2017 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// tests DataOut with HDF5
+
+#include "../tests.h"
+#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/grid/tria.h>
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/fe/fe_q.h>
+#include <deal.II/lac/sparsity_pattern.h>
+#include <deal.II/numerics/data_out.h>
+
+
+
+
+template <int dim>
+void
+test ()
+{
+  Triangulation<dim> tria;
+  GridGenerator::hyper_cube(tria, 0., 1.);
+  tria.refine_global (1);
+
+  FE_Q<dim> fe1(1);
+
+  DoFHandler<dim> dof1(tria);
+  dof1.distribute_dofs(fe1);
+
+  Vector<double> v1(dof1.n_dofs());
+  for (unsigned int i=0; i<v1.size(); ++i) v1(i) = i;
+
+  DataOut<dim> data_out;
+  data_out.add_data_vector (dof1, v1, "linear");
+  data_out.build_patches (2);
+
+  DataOutBase::DataOutFilter data_filter
+  (DataOutBase::DataOutFilterFlags (false, false));
+  data_out.write_filtered_data (data_filter);
+  data_out.write_hdf5_parallel (data_filter, "out.h5", MPI_COMM_SELF);
+  std::vector<XDMFEntry> xdmf_entries;
+  xdmf_entries.push_back
+  (data_out.create_xdmf_entry (data_filter, "out.h5", 0, MPI_COMM_SELF));
+
+  data_out.write_xdmf_file (xdmf_entries, "out.xdmf", MPI_COMM_SELF);
+
+  deallog << "ok" << std::endl;
+
+
+  // Sadly hdf5 is binary and we can not use hd5dump because it might
+  // not be in the path. At least we can look at the xdmf
+  // and make sure that the h5 file is created:
+  cat_file("out.xdmf");
+  std::ifstream f("out.h5");
+  AssertThrow(f.good(), ExcIO());
+}
+
+
+int main(int argc, char *argv[])
+{
+  initlog();
+
+  try
+    {
+      test<2>();
+
+      return 0;
+    }
+  catch (std::exception &exc)
+    {
+      deallog << std::endl << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      deallog << "Exception on processing: " << std::endl
+              << exc.what() << std::endl
+              << "Aborting!" << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      return 1;
+    }
+  catch (...)
+    {
+      deallog << std::endl << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      deallog << "Unknown exception!" << std::endl
+              << "Aborting!" << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      return 1;
+    };
+}
diff --git a/tests/numerics/data_out_hdf5_01.with_hdf5=true.output b/tests/numerics/data_out_hdf5_01.with_hdf5=true.output
new file mode 100644 (file)
index 0000000..911d9ff
--- /dev/null
@@ -0,0 +1,29 @@
+
+DEAL::ok
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XY">
+          <DataItem Dimensions="36 2" NumberType="Float" Precision="8" Format="HDF">
+            out.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Quadrilateral" NumberOfElements="16">
+          <DataItem Dimensions="16 4" NumberType="UInt" Format="HDF">
+            out.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="linear" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="36 1" NumberType="Float" Precision="8" Format="HDF">
+            out.h5:/linear
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
diff --git a/tests/numerics/data_out_hdf5_02.cc b/tests/numerics/data_out_hdf5_02.cc
new file mode 100644 (file)
index 0000000..36f1c00
--- /dev/null
@@ -0,0 +1,195 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// tests DataOut with HDF5 and zero-dimensional output (i.e. points)
+
+#include "../tests.h"
+
+#include <deal.II/base/data_out_base.h>
+#include <deal.II/base/logstream.h>
+
+#include <vector>
+#include <string>
+#include <iomanip>
+#include <fstream>
+#include <string>
+#include <stdio.h>
+
+double cell_coordinates [3][8] =
+{
+  { 0, 1, 0, 1, 0, 1, 0, 1 },
+  { 0, 0, 1, 1, 0, 0, 1, 1 },
+  { 0, 0, 0, 0, 1, 1, 1, 1 }
+};
+
+
+// This function is a copy from tests/base/patches.h, included here
+// to not introduce dependencies between different test targets
+template <int dim, int spacedim>
+void
+create_patches(std::vector<DataOutBase::Patch<dim, spacedim> > &patches)
+{
+  for (unsigned int p=0; p<patches.size(); ++p)
+    {
+      DataOutBase::Patch<dim, spacedim> &patch = patches[p];
+
+      const unsigned int nsub = p+1;
+      const unsigned int nsubp = nsub+1;
+
+      patch.n_subdivisions = nsub;
+      for (unsigned int v=0; v<GeometryInfo<dim>::vertices_per_cell; ++v)
+        for (unsigned int d=0; d<spacedim; ++d)
+          patch.vertices[v](d) = p+cell_coordinates[d][v]
+                                 + ((d>=dim) ? v : 0);
+
+      unsigned int n1 = (dim>0) ? nsubp : 1;
+      unsigned int n2 = (dim>1) ? nsubp : 1;
+      unsigned int n3 = (dim>2) ? nsubp : 1;
+      unsigned int n4 = (dim>3) ? nsubp : 1;
+      patch.data.reinit(5, n1*n2*n3*n4);
+
+      for (unsigned int i4=0; i4<n4; ++i4)
+        for (unsigned int i3=0; i3<n3; ++i3)
+          for (unsigned int i2=0; i2<n2; ++i2)
+            for (unsigned int i1=0; i1<n1; ++i1)
+              {
+                const unsigned int i = i1+nsubp*(i2+nsubp*(i3+nsubp*i4));
+                const float x1 = 1.*i1/nsub;
+                const float x2 = 1.*i2/nsub;
+                const float x3 = 1.*i3/nsub;
+                const float x4 = 1.*i4/nsub;
+
+                patch.data(0,i) = p+x1;
+                patch.data(1,i) = p+x2;
+                patch.data(2,i) = p+x3;
+                patch.data(3,i) = p+x4;
+                patch.data(4,i) = i;
+              }
+      patch.patch_index = p;
+    }
+}
+
+
+
+template <int dim, int spacedim>
+void check()
+{
+  const unsigned int np = 4;
+
+  std::vector<DataOutBase::Patch<dim, spacedim> > patches(np);
+
+  create_patches(patches);
+
+  std::vector<std::string> names(5);
+  names[0] = "x1";
+  names[1] = "x2";
+  names[2] = "x3";
+  names[3] = "x4";
+  names[4] = "i";
+  std::vector<std::tuple<unsigned int, unsigned int, std::string> > vectors;
+
+  DataOutBase::DataOutFilter data_filter
+  (DataOutBase::DataOutFilterFlags (false, false));
+
+  DataOutBase::write_filtered_data (patches,names,vectors,data_filter);
+
+  std::string output_basename = std::to_string(dim) + std::to_string(spacedim);
+
+  DataOutBase::write_hdf5_parallel(patches, data_filter, output_basename+".h5", MPI_COMM_SELF);
+
+  const double current_time = 0.0;
+  XDMFEntry       entry(output_basename+".h5", output_basename+".h5", current_time, data_filter.n_nodes(), data_filter.n_cells(), dim, spacedim);
+  unsigned int  n_data_sets = data_filter.n_data_sets();
+
+  // The vector names generated here must match those generated in the HDF5 file
+  for (unsigned int i=0; i<n_data_sets; ++i)
+    {
+      entry.add_attribute(data_filter.get_data_set_name(i), data_filter.get_data_set_dim(i));
+    }
+
+  std::ofstream xdmf_file((output_basename+".xdmf").c_str());
+
+  xdmf_file << "<?xml version=\"1.0\" ?>\n";
+  xdmf_file << "<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []>\n";
+  xdmf_file << "<Xdmf Version=\"2.0\">\n";
+  xdmf_file << "  <Domain>\n";
+  xdmf_file << "    <Grid Name=\"CellTime\" GridType=\"Collection\" CollectionType=\"Temporal\">\n";
+
+  // Write out the entry
+  xdmf_file << entry.get_xdmf_content(3);
+
+  xdmf_file << "    </Grid>\n";
+  xdmf_file << "  </Domain>\n";
+  xdmf_file << "</Xdmf>\n";
+
+  xdmf_file.close();
+
+  // Sadly hdf5 is binary and we can not use hd5dump because it might
+  // not be in the path. At least we can look at the xdmf
+  // and make sure that the h5 file is created:
+  deallog << "\n==============================\n"
+          << output_basename + ".xdmf"
+          << "\n=============================="
+          << std::endl;
+
+  cat_file((output_basename+".xdmf").c_str());
+  std::ifstream f((output_basename+".h5").c_str());
+  AssertThrow(f.good(), ExcIO());
+
+  deallog << std::flush;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+  initlog();
+
+  try
+    {
+      check<0,2>();
+      check<1,2>();
+      check<2,2>();
+      check<0,3>();
+      check<1,3>();
+      check<2,3>();
+      check<3,3>();
+
+      return 0;
+    }
+  catch (std::exception &exc)
+    {
+      deallog << std::endl << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      deallog << "Exception on processing: " << std::endl
+              << exc.what() << std::endl
+              << "Aborting!" << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      return 1;
+    }
+  catch (...)
+    {
+      deallog << std::endl << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      deallog << "Unknown exception!" << std::endl
+              << "Aborting!" << std::endl
+              << "----------------------------------------------------"
+              << std::endl;
+      return 1;
+    };
+}
diff --git a/tests/numerics/data_out_hdf5_02.with_hdf5=true.output b/tests/numerics/data_out_hdf5_02.with_hdf5=true.output
new file mode 100644 (file)
index 0000000..a636cc7
--- /dev/null
@@ -0,0 +1,359 @@
+
+DEAL::
+==============================
+02.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XY">
+          <DataItem Dimensions="4 2" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Polyvertex" NumberOfElements="4" NodesPerElement="1">
+          <DataItem Dimensions="4 1" NumberType="UInt" Format="HDF">
+            02.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            02.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+12.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XY">
+          <DataItem Dimensions="14 2" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Polyline" NumberOfElements="10" NodesPerElement="2">
+          <DataItem Dimensions="10 2" NumberType="UInt" Format="HDF">
+            12.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            12.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+22.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XY">
+          <DataItem Dimensions="54 2" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Quadrilateral" NumberOfElements="30">
+          <DataItem Dimensions="30 4" NumberType="UInt" Format="HDF">
+            22.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            22.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+03.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XYZ">
+          <DataItem Dimensions="4 3" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Polyvertex" NumberOfElements="4" NodesPerElement="1">
+          <DataItem Dimensions="4 1" NumberType="UInt" Format="HDF">
+            03.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="4 1" NumberType="Float" Precision="8" Format="HDF">
+            03.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+13.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XYZ">
+          <DataItem Dimensions="14 3" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Polyline" NumberOfElements="10" NodesPerElement="2">
+          <DataItem Dimensions="10 2" NumberType="UInt" Format="HDF">
+            13.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="14 1" NumberType="Float" Precision="8" Format="HDF">
+            13.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+23.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XYZ">
+          <DataItem Dimensions="54 3" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Quadrilateral" NumberOfElements="30">
+          <DataItem Dimensions="30 4" NumberType="UInt" Format="HDF">
+            23.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="54 1" NumberType="Float" Precision="8" Format="HDF">
+            23.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
+==============================
+33.xdmf
+==============================
+<?xml version="1.0" ?>
+<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
+<Xdmf Version="2.0">
+  <Domain>
+    <Grid Name="CellTime" GridType="Collection" CollectionType="Temporal">
+      <Grid Name="mesh" GridType="Uniform">
+        <Time Value="0"/>
+        <Geometry GeometryType="XYZ">
+          <DataItem Dimensions="224 3" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/nodes
+          </DataItem>
+        </Geometry>
+        <Topology TopologyType="Hexahedron" NumberOfElements="100">
+          <DataItem Dimensions="100 8" NumberType="UInt" Format="HDF">
+            33.h5:/cells
+          </DataItem>
+        </Topology>
+        <Attribute Name="i" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="224 1" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/i
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x1" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="224 1" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/x1
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x2" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="224 1" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/x2
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x3" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="224 1" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/x3
+          </DataItem>
+        </Attribute>
+        <Attribute Name="x4" AttributeType="Scalar" Center="Node">
+          <DataItem Dimensions="224 1" NumberType="Float" Precision="8" Format="HDF">
+            33.h5:/x4
+          </DataItem>
+        </Attribute>
+      </Grid>
+    </Grid>
+  </Domain>
+</Xdmf>
+
+DEAL::
\ No newline at end of file

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.