use quick_xml::Writer;
use xdmf::xdmf_elements::{
Domain, XDMF_TAG, Xdmf,
attribute::{Attribute, AttributeType, Center},
data_item::{DataItem, NumberType},
dimensions::Dimensions,
geometry::{Geometry, GeometryType},
grid::{CollectionType, Grid, Time},
topology::{Topology, TopologyType},
};
#[test]
fn basic_grid() {
let xdmf = Xdmf::new(Domain::new(Grid::new_uniform(
"Grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![4, 3])),
data: "0 0 0 0 1 0 1 1 0 1 0 0.5".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Triangle,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![6])),
number_type: Some(NumberType::Int),
data: "0 1 2 0 2 3".into(),
..Default::default()
},
},
)));
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
writer.write_serializable(XDMF_TAG, &xdmf).unwrap();
let expected_xdmf = r#"
<Xdmf Version="2.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<Domain>
<Grid Name="Grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="4 3" NumberType="Float" Format="XML" Precision="4">0 0 0 0 1 0 1 1 0 1 0 0.5</DataItem>
</Geometry>
<Topology TopologyType="Triangle" NumberOfElements="2">
<DataItem Dimensions="6" NumberType="Int" Format="XML" Precision="4">0 1 2 0 2 3</DataItem>
</Topology>
</Grid>
</Domain>
</Xdmf>"#;
pretty_assertions::assert_eq!(expected_xdmf, String::from_utf8(buffer).unwrap());
}
#[test]
fn hierarchical_tree_grid() {
let xdmf = Xdmf::new(Domain::new(Grid::new_tree(
"hierarchical_tree_grid",
Some(vec![
Grid::new_tree(
"grid_level_1",
Some(vec![
Grid::new_uniform(
"sub_grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 1 0 0 1.5 0 0.5 1.5 0.5 1 1.5 0 1 1 0".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Triangle,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![6])),
number_type: Some(NumberType::Int),
data: "0 1 2 2 3 4".into(),
..Default::default()
},
},
),
Grid::new_uniform(
"sub_grid_2",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![6, 3])),
data: "1 1.5 0 1 1 0 1 0 0 1.3 1.5 0 1.3 1 0 1.3 0 0".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Quadrilateral,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![8])),
number_type: Some(NumberType::Int),
data: "0 1 4 3 1 2 5 4".into(),
..Default::default()
},
},
),
]),
),
Grid::new_uniform(
"Grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![9])),
number_type: Some(NumberType::Int),
data: "5 0 1 2 3 4 1 2 4".into(),
..Default::default()
},
},
),
]),
)));
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
writer.write_serializable(XDMF_TAG, &xdmf).unwrap();
let expected_xdmf = r#"
<Xdmf Version="2.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<Domain>
<Grid Name="hierarchical_tree_grid" GridType="Tree">
<Grid Name="grid_level_1" GridType="Tree">
<Grid Name="sub_grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 1 0 0 1.5 0 0.5 1.5 0.5 1 1.5 0 1 1 0</DataItem>
</Geometry>
<Topology TopologyType="Triangle" NumberOfElements="2">
<DataItem Dimensions="6" NumberType="Int" Format="XML" Precision="4">0 1 2 2 3 4</DataItem>
</Topology>
</Grid>
<Grid Name="sub_grid_2" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="6 3" NumberType="Float" Format="XML" Precision="4">1 1.5 0 1 1 0 1 0 0 1.3 1.5 0 1.3 1 0 1.3 0 0</DataItem>
</Geometry>
<Topology TopologyType="Quadrilateral" NumberOfElements="2">
<DataItem Dimensions="8" NumberType="Int" Format="XML" Precision="4">0 1 4 3 1 2 5 4</DataItem>
</Topology>
</Grid>
</Grid>
<Grid Name="Grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Dimensions="9" NumberType="Int" Format="XML" Precision="4">5 0 1 2 3 4 1 2 4</DataItem>
</Topology>
</Grid>
</Grid>
</Domain>
</Xdmf>"#;
pretty_assertions::assert_eq!(expected_xdmf, String::from_utf8(buffer).unwrap());
}
#[test]
fn mixed_grid() {
let xdmf = Xdmf::new(Domain::new(Grid::new_uniform(
"Grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![9])),
number_type: Some(NumberType::Int),
data: "5 0 1 2 3 4 1 2 4".into(),
..Default::default()
},
},
)));
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
writer.write_serializable(XDMF_TAG, &xdmf).unwrap();
let expected_xdmf = r#"
<Xdmf Version="2.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<Domain>
<Grid Name="Grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Dimensions="9" NumberType="Int" Format="XML" Precision="4">5 0 1 2 3 4 1 2 4</DataItem>
</Topology>
</Grid>
</Domain>
</Xdmf>"#;
pretty_assertions::assert_eq!(expected_xdmf, String::from_utf8(buffer).unwrap());
}
#[test]
fn spatial_collection_grid() {
let xdmf = Xdmf::new(Domain::new(Grid::new_collection(
"spatial_collection_grid",
CollectionType::Spatial,
Some(vec![
Grid::new_uniform(
"sub_grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 1 0 0 1.5 0 0.5 1.5 0.5 1 1.5 0 1 1 0".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Triangle,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![6])),
number_type: Some(NumberType::Int),
data: "0 1 2 2 3 4".into(),
..Default::default()
},
},
),
Grid::new_uniform(
"sub_grid_2",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![6, 3])),
data: "1 1.5 0 1 1 0 1 0 0 1.3 1.5 0 1.3 1 0 1.3 0 0".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Quadrilateral,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![8])),
number_type: Some(NumberType::Int),
data: "0 1 4 3 1 2 5 4".into(),
..Default::default()
},
},
),
Grid::new_uniform(
"Grid_1",
Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem {
dimensions: Some(Dimensions(vec![9])),
number_type: Some(NumberType::Int),
data: "5 0 1 2 3 4 1 2 4".into(),
..Default::default()
},
},
),
]),
)));
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
writer.write_serializable(XDMF_TAG, &xdmf).unwrap();
let expected_xdmf = r#"
<Xdmf Version="2.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<Domain>
<Grid Name="spatial_collection_grid" GridType="Collection" CollectionType="Spatial">
<Grid Name="sub_grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 1 0 0 1.5 0 0.5 1.5 0.5 1 1.5 0 1 1 0</DataItem>
</Geometry>
<Topology TopologyType="Triangle" NumberOfElements="2">
<DataItem Dimensions="6" NumberType="Int" Format="XML" Precision="4">0 1 2 2 3 4</DataItem>
</Topology>
</Grid>
<Grid Name="sub_grid_2" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="6 3" NumberType="Float" Format="XML" Precision="4">1 1.5 0 1 1 0 1 0 0 1.3 1.5 0 1.3 1 0 1.3 0 0</DataItem>
</Geometry>
<Topology TopologyType="Quadrilateral" NumberOfElements="2">
<DataItem Dimensions="8" NumberType="Int" Format="XML" Precision="4">0 1 4 3 1 2 5 4</DataItem>
</Topology>
</Grid>
<Grid Name="Grid_1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Dimensions="9" NumberType="Int" Format="XML" Precision="4">5 0 1 2 3 4 1 2 4</DataItem>
</Topology>
</Grid>
</Grid>
</Domain>
</Xdmf>"#;
pretty_assertions::assert_eq!(expected_xdmf, String::from_utf8(buffer).unwrap());
}
#[test]
fn temporal_collection_grid() {
let data_items = vec![
DataItem {
name: Some("coords".into()),
dimensions: Some(Dimensions(vec![5, 3])),
data: "0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5".into(),
number_type: Some(NumberType::Float),
..Default::default()
},
DataItem {
name: Some("connectivity".into()),
dimensions: Some(Dimensions(vec![9])),
number_type: Some(NumberType::Int),
data: "5 0 1 2 3 4 1 2 4".into(),
..Default::default()
},
];
let xdmf = Xdmf::new(Domain {
grids: vec![Grid::new_collection(
"temporal_collection_grid",
CollectionType::Temporal,
Some(vec![
Grid {
name: "Grid_t1".into(),
geometry: Some(Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem::new_reference(
&data_items[0],
"/Xdmf/Domain/DataItem",
)],
}),
topology: Some(Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem::new_reference(&data_items[1], "/Xdmf/Domain/DataItem"),
}),
grid_type: xdmf::xdmf_elements::grid::GridType::Uniform,
time: Some(Time {
value: "1.0".into(),
}),
attributes: Some(vec![
Attribute {
name: String::from("Pressure"),
attribute_type: AttributeType::Scalar,
center: Center::Node,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5])),
data: "1 2 2 3 9".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Attribute {
name: String::from("Temperature"),
attribute_type: AttributeType::Scalar,
center: Center::Cell,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![2])),
data: "1 2".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
]),
collection_type: None,
grids: None,
},
Grid {
name: "Grid_t2".into(),
geometry: Some(Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem::new_reference(
&data_items[0],
"/Xdmf/Domain/DataItem",
)],
}),
topology: Some(Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem::new_reference(&data_items[1], "/Xdmf/Domain/DataItem"),
}),
grid_type: xdmf::xdmf_elements::grid::GridType::Uniform,
time: Some(Time {
value: "2.0".into(),
}),
attributes: Some(vec![
Attribute {
name: String::from("Pressure"),
attribute_type: AttributeType::Scalar,
center: Center::Node,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5])),
data: "1 2 3 4 7".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Attribute {
name: String::from("Temperature"),
attribute_type: AttributeType::Scalar,
center: Center::Cell,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![2])),
data: "2 3".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
]),
collection_type: None,
grids: None,
},
Grid {
name: "Grid_t3".into(),
geometry: Some(Geometry {
geometry_type: GeometryType::XYZ,
data_items: vec![DataItem::new_reference(
&data_items[0],
"/Xdmf/Domain/DataItem",
)],
}),
topology: Some(Topology {
topology_type: TopologyType::Mixed,
nodes_per_element: None,
number_of_elements: "2".into(),
data_item: DataItem::new_reference(&data_items[1], "/Xdmf/Domain/DataItem"),
}),
grid_type: xdmf::xdmf_elements::grid::GridType::Uniform,
time: Some(Time {
value: "3.0".into(),
}),
attributes: Some(vec![
Attribute {
name: String::from("Pressure"),
attribute_type: AttributeType::Scalar,
center: Center::Node,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![5])),
data: "3 2 2 3 8".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
Attribute {
name: String::from("Temperature"),
attribute_type: AttributeType::Scalar,
center: Center::Cell,
data_items: vec![DataItem {
dimensions: Some(Dimensions(vec![2])),
data: "3 4".into(),
number_type: Some(NumberType::Float),
..Default::default()
}],
},
]),
collection_type: None,
grids: None,
},
]),
)],
data_items,
});
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
writer.write_serializable(XDMF_TAG, &xdmf).unwrap();
let expected_xdmf = r#"
<Xdmf Version="2.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<Domain>
<Grid Name="temporal_collection_grid" GridType="Collection" CollectionType="Temporal">
<Grid Name="Grid_t1" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="coords"]</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="connectivity"]</DataItem>
</Topology>
<Time Value="1.0"/>
<Attribute Name="Pressure" AttributeType="Scalar" Center="Node">
<DataItem Dimensions="5" NumberType="Float" Format="XML" Precision="4">1 2 2 3 9</DataItem>
</Attribute>
<Attribute Name="Temperature" AttributeType="Scalar" Center="Cell">
<DataItem Dimensions="2" NumberType="Float" Format="XML" Precision="4">1 2</DataItem>
</Attribute>
</Grid>
<Grid Name="Grid_t2" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="coords"]</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="connectivity"]</DataItem>
</Topology>
<Time Value="2.0"/>
<Attribute Name="Pressure" AttributeType="Scalar" Center="Node">
<DataItem Dimensions="5" NumberType="Float" Format="XML" Precision="4">1 2 3 4 7</DataItem>
</Attribute>
<Attribute Name="Temperature" AttributeType="Scalar" Center="Cell">
<DataItem Dimensions="2" NumberType="Float" Format="XML" Precision="4">2 3</DataItem>
</Attribute>
</Grid>
<Grid Name="Grid_t3" GridType="Uniform">
<Geometry GeometryType="XYZ">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="coords"]</DataItem>
</Geometry>
<Topology TopologyType="Mixed" NumberOfElements="2">
<DataItem Reference="XML">/Xdmf/Domain/DataItem[@Name="connectivity"]</DataItem>
</Topology>
<Time Value="3.0"/>
<Attribute Name="Pressure" AttributeType="Scalar" Center="Node">
<DataItem Dimensions="5" NumberType="Float" Format="XML" Precision="4">3 2 2 3 8</DataItem>
</Attribute>
<Attribute Name="Temperature" AttributeType="Scalar" Center="Cell">
<DataItem Dimensions="2" NumberType="Float" Format="XML" Precision="4">3 4</DataItem>
</Attribute>
</Grid>
</Grid>
<DataItem Name="coords" Dimensions="5 3" NumberType="Float" Format="XML" Precision="4">0 0 0 0 1 0 1 1 0 1 0 0 0.5 1.5 0.5</DataItem>
<DataItem Name="connectivity" Dimensions="9" NumberType="Int" Format="XML" Precision="4">5 0 1 2 3 4 1 2 4</DataItem>
</Domain>
</Xdmf>"#;
pretty_assertions::assert_eq!(expected_xdmf, String::from_utf8(buffer).unwrap());
}