use xdmf::{CellType, DataAttribute, DataStorage, TimeSeriesWriter};
const COLUMNS: usize = 4;
fn point_index(row: usize, column: usize) -> u32 {
(row * COLUMNS + column) as u32
}
fn main() -> xdmf::Result<()> {
let mut points = Vec::new();
for row in 0..4 {
for column in 0..COLUMNS {
points.extend_from_slice(&[column as f64, row as f64, 0.0]);
}
}
points.extend_from_slice(&[0.5, 3.0, 1.5]);
points.extend_from_slice(&[2.5, 3.0, 1.5]);
let mut connectivity = Vec::new();
for row in 0..3 {
for column in 0..3 {
connectivity.extend_from_slice(&[
point_index(row, column),
point_index(row, column + 1),
point_index(row + 1, column + 1),
point_index(row + 1, column),
]);
}
}
connectivity.extend_from_slice(&[point_index(3, 0), point_index(3, 1), 16]);
connectivity.extend_from_slice(&[point_index(3, 2), point_index(3, 3), 17]);
let mut cell_types = vec![CellType::Quadrilateral; 9];
cell_types.extend_from_slice(&[CellType::Triangle, CellType::Triangle]);
let num_points = points.len() / 3;
let num_cells = cell_types.len();
let submeshes = [
("left_column", vec![0, 3, 6]),
("right_column", vec![2, 5, 8]),
("front_row", vec![0, 1, 2]),
("middle_row", vec![3, 4, 5]),
("fin", vec![9, 10]),
("top_row_with_fin", vec![6, 7, 8, 9, 10]),
];
let xdmf_writer = TimeSeriesWriter::new("submeshes_example/mesh", DataStorage::Ascii)?;
let mut ts_writer =
xdmf_writer.write_mesh_with_submeshes(&points, &connectivity, &cell_types, submeshes)?;
let mut height = vec![0.0; num_points];
let mut displacement = vec![0.0; num_points * 3];
let mut activity = vec![0.0; num_cells];
let cell_id: Vec<f64> = (0..num_cells).map(|cell| cell as f64).collect();
for step in 0..3 {
let time = step as f64;
for (index, value) in height.iter_mut().enumerate() {
let (x, y) = (points[index * 3], points[index * 3 + 1]);
*value = (time + x * 0.5 + y * 0.3).sin();
}
for index in 0..num_points {
displacement[index * 3 + 2] = 0.3 * (time + points[index * 3]).sin();
}
for (index, value) in activity.iter_mut().enumerate() {
*value = index as f64 + time * 10.0;
}
ts_writer.write_time_step(&time.to_string(), |step| {
step.point_data("height", DataAttribute::Scalar, &height)?;
step.point_data("displacement", DataAttribute::Vector, &displacement)?;
step.cell_data("cell_id", DataAttribute::Scalar, &cell_id)?;
step.cell_data("activity", DataAttribute::Scalar, &activity)
})?;
}
Ok(())
}