--- /dev/null
+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)
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];
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;
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;
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
status = H5Fclose(h5_solution_file_id);
AssertThrow(status >= 0, ExcIO());
#endif
-#endif
}
// 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());
+ }
}
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;
}
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// 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;
+ };
+}
--- /dev/null
+
+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>
+
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// 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;
+ };
+}
--- /dev/null
+
+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