diff --git a/assets/pygmsh/ascii.vtk b/assets/pygmsh/ascii.vtk new file mode 100644 index 0000000..c864984 --- /dev/null +++ b/assets/pygmsh/ascii.vtk @@ -0,0 +1,181 @@ +# vtk DataFile Version 5.1 +written by meshio v5.3.0 +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 18 double +0.0 0.0 0.0 1.0 -0.2 0.0 1.1 1.2 0.0 0.1 0.7 0.0 0.3333333333325021 -0.06666666666650042 0.0 0.6666666666657866 -0.1333333333331573 0.0 1.0249999999999424 0.14999999999919245 0.0 1.0499999999998704 0.4999999999981836 0.0 1.074999999999934 0.8499999999990746 0.0 0.766666666667985 1.0333333333339925 0.0 0.433333333334733 0.8666666666673664 0.0 0.050000000000122564 0.3500000000008579 0.0 0.7444729167676052 0.3524793413776178 0.0 0.3781088913238718 0.4816987298113132 0.0 0.7412636346823331 0.6806963451979247 0.0 0.5070791452210437 0.16277273408010906 0.0 0.253704273975508 0.18556095944515594 0.0 0.7797139636550688 0.08823831456107314 0.0 +CELLS 39 94 +OFFSETS vtktypeint64 +0 +2 +4 +6 +8 +10 +12 +14 +16 +18 +20 +22 +24 +27 +30 +33 +36 +39 +42 +45 +48 +51 +54 +57 +60 +63 +66 +69 +72 +75 +78 +81 +84 +87 +90 +91 +92 +93 +94 +CONNECTIVITY vtktypeint64 +0 +4 +4 +5 +5 +1 +1 +6 +6 +7 +7 +8 +8 +2 +2 +9 +9 +10 +10 +3 +3 +11 +11 +0 +10 +13 +14 +13 +12 +14 +10 +3 +13 +8 +2 +9 +4 +5 +15 +9 +10 +14 +3 +11 +13 +6 +7 +12 +8 +9 +14 +7 +8 +14 +12 +7 +14 +15 +5 +17 +5 +1 +17 +1 +6 +17 +12 +13 +15 +13 +11 +16 +15 +13 +16 +11 +0 +16 +0 +4 +16 +6 +12 +17 +12 +15 +17 +4 +15 +16 +0 +1 +2 +3 +CELL_TYPES 38 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 diff --git a/assets/pygmsh/ascii.vtu b/assets/pygmsh/ascii.vtu new file mode 100644 index 0000000..0d879a2 --- /dev/null +++ b/assets/pygmsh/ascii.vtu @@ -0,0 +1,248 @@ + + + + + + + +0.00000000000e+00 +0.00000000000e+00 +0.00000000000e+00 +1.00000000000e+00 +-2.00000000000e-01 +0.00000000000e+00 +1.10000000000e+00 +1.20000000000e+00 +0.00000000000e+00 +1.00000000000e-01 +7.00000000000e-01 +0.00000000000e+00 +3.33333333333e-01 +-6.66666666665e-02 +0.00000000000e+00 +6.66666666666e-01 +-1.33333333333e-01 +0.00000000000e+00 +1.02500000000e+00 +1.49999999999e-01 +0.00000000000e+00 +1.05000000000e+00 +4.99999999998e-01 +0.00000000000e+00 +1.07500000000e+00 +8.49999999999e-01 +0.00000000000e+00 +7.66666666668e-01 +1.03333333333e+00 +0.00000000000e+00 +4.33333333335e-01 +8.66666666667e-01 +0.00000000000e+00 +5.00000000001e-02 +3.50000000001e-01 +0.00000000000e+00 +7.44472916768e-01 +3.52479341378e-01 +0.00000000000e+00 +3.78108891324e-01 +4.81698729811e-01 +0.00000000000e+00 +7.41263634682e-01 +6.80696345198e-01 +0.00000000000e+00 +5.07079145221e-01 +1.62772734080e-01 +0.00000000000e+00 +2.53704273976e-01 +1.85560959445e-01 +0.00000000000e+00 +7.79713963655e-01 +8.82383145611e-02 +0.00000000000e+00 + + + + + +0 +4 +4 +5 +5 +1 +1 +6 +6 +7 +7 +8 +8 +2 +2 +9 +9 +10 +10 +3 +3 +11 +11 +0 +10 +13 +14 +13 +12 +14 +10 +3 +13 +8 +2 +9 +4 +5 +15 +9 +10 +14 +3 +11 +13 +6 +7 +12 +8 +9 +14 +7 +8 +14 +12 +7 +14 +15 +5 +17 +5 +1 +17 +1 +6 +17 +12 +13 +15 +13 +11 +16 +15 +13 +16 +11 +0 +16 +0 +4 +16 +6 +12 +17 +12 +15 +17 +4 +15 +16 +0 +1 +2 +3 + + + +2 +4 +6 +8 +10 +12 +14 +16 +18 +20 +22 +24 +27 +30 +33 +36 +39 +42 +45 +48 +51 +54 +57 +60 +63 +66 +69 +72 +75 +78 +81 +84 +87 +90 +91 +92 +93 +94 + + + +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 + + + + + + diff --git a/assets/pygmsh/binary.vtk b/assets/pygmsh/binary.vtk new file mode 100644 index 0000000..a4151b9 Binary files /dev/null and b/assets/pygmsh/binary.vtk differ diff --git a/assets/pygmsh/gen.py b/assets/pygmsh/gen.py new file mode 100644 index 0000000..757ea34 --- /dev/null +++ b/assets/pygmsh/gen.py @@ -0,0 +1,25 @@ +import pygmsh + +with pygmsh.geo.Geometry() as geom: + p = geom.add_polygon( + [ + [0.0, 0.0], + [1.0, -0.2], + [1.1, 1.2], + [0.1, 0.7], + ], + mesh_size=0.4, + ) + geom.add_physical(p.lines[0], label="bottom") + geom.add_physical(p.lines[1], label="right") + geom.add_physical(p.lines[2], label="top") + geom.add_physical(p.lines[3], label="left") + + mesh = geom.generate_mesh() + +mesh.write("no-compression.vtu", compression=None) +mesh.write("lzma.vtu", compression="lzma") +mesh.write("zlib.vtu", compression="zlib") +mesh.write("ascii.vtu", binary=False) +mesh.write("binary.vtk") +mesh.write("ascii.vtk", binary=False) diff --git a/assets/pygmsh/lzma.vtu b/assets/pygmsh/lzma.vtu new file mode 100644 index 0000000..c7327e8 --- /dev/null +++ b/assets/pygmsh/lzma.vtu @@ -0,0 +1,24 @@ + + + + + + + +AQAAAACAAACwAQAALAEAAA==/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4AGvAOldAABuFTfD5hQGEWOiYOj3Slyvfg1L/Z3iyRycR0v7+mOn0ba3Qa6+uxHTkBa13rJ9UW0iFhj//utywp06/cuuBp7r/6RF/0kQoQF1wJmUOfjtXDwO7oyM72B1k1bOtSrX7Q0EP0RdrG6mYpB8fY3uRXcPLRuV7F4NlhoBsuNcKUphVnWEjbr0xN4z91QfOD8gJGvTgxj+c6oSBQZKgdtigQALByl5tf4xMtymx21LFrFg6zcv9wiCzWeolkrsvIzWHJ/1DV9+aqDd8NNsMoPJ8LbmXclBx+HI8VRh4JKcNhXg+zXNCDzMd6RhAAAAAPixvspGiUmFAAGFArADAAAV8tzoscRn+wIAAAAABFla + + + + +AQAAAACAAADwAgAAsAAAAA==/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4ALvAG5dAABqf4CGWT3j9Uqwil2OUtsCHzHFFrl+aqabptUzL9SOe39SAvCK7iPawz8fvDCpSHkBzp1bECAXygDmyLZ4X/nMqID8Eqbc4azCjU2G0AEMSPklcaC2HvsDEIGliAwrSJ1nUyGCUcs8KhCW/QesAAAAi+NSyjXe5WYAAYoB8AUAAJ8es8GxxGf7AgAAAAAEWVo= + + +AQAAAACAAAAwAQAAgAAAAA==/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4AEvAD9dAAEAOcG2vwm8gB0fh9y6FkceUbXO4HhwUvGjyt0gZdVKBz8EkkpMcf8iDB+6wFXI0nHkq4NBKD80x7XEniAEygAAlCvKhF26m8oAAVuwAgAAAHbs0h+xxGf7AgAAAAAEWVo= + + +AQAAAACAAAAwAQAAUAAAAA==/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4AEvAA9dAAGAOfWXBWQaoCCI8wHgAAAA85sVNsk6+VAAASuwAgAAALfh8BSxxGf7AgAAAAAEWVo= + + + + + diff --git a/assets/pygmsh/no-compression.vtu b/assets/pygmsh/no-compression.vtu new file mode 100644 index 0000000..a168c8c --- /dev/null +++ b/assets/pygmsh/no-compression.vtu @@ -0,0 +1,24 @@ + + + + + + + +sAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/mpmZmZmZyb8AAAAAAAAAAJqZmZmZmfE/MzMzMzMz8z8AAAAAAAAAAJqZmZmZmbk/ZmZmZmZm5j8AAAAAAAAAANcaVVVVVdU/RuIQERERsb8AAAAAAAAAAF42VVVVVeU/S/gQERERwb8AAAAAAAAAAGNlZmZmZvA/jMEyMzMzwz8AAAAAAAAAAIXKzMzMzPA/L4D/////3z8AAAAAAAAAAAoyMzMzM/E/pBIzMzMz6z8AAAAAAAAAAOu2iIiIiOg/IZSIiIiI8D8AAAAAAAAAADoevLu7u9s/WtS7u7u76z8AAAAAAAAAAJnemZmZmak/xaJmZmZm1j8AAAAAAAAAAHrJyN240uc/FuHuggWP1j8AAAAAAAAAALIFpKLvMtg//R3E6CbU3j8AAAAAAAAAAD6XlYNuuOc/0Deks0PI5T8AAAAAAAAAABSoJgv+OeA/QPzGqLzVxD8AAAAAAAAAAIAi5dmwPNA/IJwdJnbAxz8AAAAAAAAAAPlBxLJq8+g/mkFLQ8mWtj8AAAAAAAAAAA== + + + + +8AIAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAUAAAAAAAAABQAAAAAAAAABAAAAAAAAAAEAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAcAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAkAAAAAAAAACQAAAAAAAAAKAAAAAAAAAAoAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAoAAAAAAAAADQAAAAAAAAAOAAAAAAAAAA0AAAAAAAAADAAAAAAAAAAOAAAAAAAAAAoAAAAAAAAAAwAAAAAAAAANAAAAAAAAAAgAAAAAAAAAAgAAAAAAAAAJAAAAAAAAAAQAAAAAAAAABQAAAAAAAAAPAAAAAAAAAAkAAAAAAAAACgAAAAAAAAAOAAAAAAAAAAMAAAAAAAAACwAAAAAAAAANAAAAAAAAAAYAAAAAAAAABwAAAAAAAAAMAAAAAAAAAAgAAAAAAAAACQAAAAAAAAAOAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAOAAAAAAAAAAwAAAAAAAAABwAAAAAAAAAOAAAAAAAAAA8AAAAAAAAABQAAAAAAAAARAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAARAAAAAAAAAAEAAAAAAAAABgAAAAAAAAARAAAAAAAAAAwAAAAAAAAADQAAAAAAAAAPAAAAAAAAAA0AAAAAAAAACwAAAAAAAAAQAAAAAAAAAA8AAAAAAAAADQAAAAAAAAAQAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAQAAAAAAAAAAYAAAAAAAAADAAAAAAAAAARAAAAAAAAAAwAAAAAAAAADwAAAAAAAAARAAAAAAAAAAQAAAAAAAAADwAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMAAAAAAAAA + + +MAEAAAIAAAAAAAAABAAAAAAAAAAGAAAAAAAAAAgAAAAAAAAACgAAAAAAAAAMAAAAAAAAAA4AAAAAAAAAEAAAAAAAAAASAAAAAAAAABQAAAAAAAAAFgAAAAAAAAAYAAAAAAAAABsAAAAAAAAAHgAAAAAAAAAhAAAAAAAAACQAAAAAAAAAJwAAAAAAAAAqAAAAAAAAAC0AAAAAAAAAMAAAAAAAAAAzAAAAAAAAADYAAAAAAAAAOQAAAAAAAAA8AAAAAAAAAD8AAAAAAAAAQgAAAAAAAABFAAAAAAAAAEgAAAAAAAAASwAAAAAAAABOAAAAAAAAAFEAAAAAAAAAVAAAAAAAAABXAAAAAAAAAFoAAAAAAAAAWwAAAAAAAABcAAAAAAAAAF0AAAAAAAAAXgAAAAAAAAA= + + +MAEAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAA= + + + + + diff --git a/assets/pygmsh/zlib.vtu b/assets/pygmsh/zlib.vtu new file mode 100644 index 0000000..d1f6794 --- /dev/null +++ b/assets/pygmsh/zlib.vtu @@ -0,0 +1,24 @@ + + + + + + + +AQAAAACAAACwAQAABQEAAA==eJxjYMAHPtjPmgkCJ/fDRCD8j/bGYPDZHlV8p30aGDyDi1+XCgWCq/ZujwQEBQU3ws2JMwOJP7X3/gESPwgXT04F6f9g33PQCGj+Ybg5rafOAMEHe/2G/0BwHy7OBVJm/NF+iRCIfg0Xf72tAwhe2CtOAdEf4OJWcnt279592z7qCpDajVA/8x7I/Svtjy4C2X8NLl518sTdHZee24s9fNfE2o8Q38S6ZNF7oxv2f2WPvFC7cg8ubjd9anPejuf2F8yXbHY+8RQuLrJCjfuf5QN7hz/HVuy5egQu3qD09OYGmwv2CnNk1coOHIeL/3Q8sinr8wv7WY7ezienbYOLAwDOhYjK + + + + +AQAAAACAAADwAgAAfAAAAA==eJx1kUEOgCAMBEFRUBHw/5/1oHOZhF4mXZploSF8lcRNjOIuZrGIi3iIp7iKl0gxf/9s6qt0+zPnnOTyf/RJbvydF3//E7m4F7+muSK96hydXOR81Efp3iM6/uTu6nnXmJwPzQXpVJJODu53ni49Sbc/72Of7OUFXXQDPw== + + +AQAAAACAAAAwAQAAWAAAAA==eJwtxdEGgwAAAMDJJMlkMhEjRsQYI8YYMSJGRKza/3/GHrp7uWC32Tt05NiJD059dOaTcxc+u/TFlWtfffPdjR9++uXWb3fu/fHg0ZO/nr149c9/z+4HFg== + + +AQAAAACAAAAwAQAAFQAAAA==eJxjZoAAZhrRrEOMZiRAAwBbWACX + + + + + diff --git a/tests/pygmsh.rs b/tests/pygmsh.rs new file mode 100644 index 0000000..9d09221 --- /dev/null +++ b/tests/pygmsh.rs @@ -0,0 +1,187 @@ +//! This test module tests against simple files generated by the pygmsh package. + +use nom::IResult; +use vtkio::model::*; +use vtkio::parser::*; +use vtkio::writer::*; +use vtkio::Error; + +macro_rules! test_b { + ($fn:ident ($in:expr, $($args:expr),*) => $out:expr) => { + assert_eq!($fn($in, $($args),*), IResult::Done("".as_bytes(), $out.clone())); + }; + ($fn:ident ($in:expr) => $out:expr) => { + assert_eq!($fn($in), IResult::Done("".as_bytes(), $out.clone())); + }; +} + +macro_rules! test_ignore_rem { + ($fn:ident ($in:expr, $($args:expr),*) => $out:expr) => { + { + let result = $fn($in, $($args),*); + assert!(result.is_done()); + assert_eq!(result.unwrap().1, $out.clone()); + } + }; + ($fn:ident ($in:expr) => $out:expr) => { + { + let result = $fn($in); + assert!(result.is_done()); + assert_eq!(result.unwrap().1, $out.clone()); + } + }; +} + +type Result = std::result::Result<(), Error>; + +// Helper functions to convert between endianness. + +fn ne(vtk: &Vtk) -> Vtk { + Vtk { + byte_order: ByteOrder::native(), + ..vtk.clone() + } +} + +fn le(vtk: &Vtk) -> Vtk { + Vtk { + byte_order: ByteOrder::LittleEndian, + ..vtk.clone() + } +} + +fn make_test_file() -> Vtk { + Vtk { + version: Version::new((5, 1)), + byte_order: ByteOrder::BigEndian, + title: String::from("written by meshio v5.3.0"), + file_path: None, + data: DataSet::inline(UnstructuredGridPiece { + points: vec![ + 0.0f64, + 0.0, + 0.0, + 1.0, + -0.2, + 0.0, + 1.1, + 1.2, + 0.0, + 0.1, + 0.7, + 0.0, + 0.3333333333325021, + -0.06666666666650042, + 0.0, + 0.6666666666657866, + -0.1333333333331573, + 0.0, + 1.0249999999999424, + 0.14999999999919245, + 0.0, + 1.0499999999998704, + 0.4999999999981836, + 0.0, + 1.074999999999934, + 0.8499999999990746, + 0.0, + 0.766666666667985, + 1.0333333333339925, + 0.0, + 0.433333333334733, + 0.8666666666673664, + 0.0, + 0.050000000000122564, + 0.3500000000008579, + 0.0, + 0.7444729167676052, + 0.3524793413776178, + 0.0, + 0.3781088913238718, + 0.4816987298113132, + 0.0, + 0.7412636346823331, + 0.6806963451979247, + 0.0, + 0.5070791452210437, + 0.16277273408010906, + 0.0, + 0.253704273975508, + 0.18556095944515594, + 0.0, + 0.7797139636550688, + 0.08823831456107314, + 0.0, + ] + .into(), + cells: Cells { + cell_verts: VertexNumbers::XML { + offsets: vec![ + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 42, 45, + 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 91, 92, 93, 94, + ], + connectivity: vec![ + 0, 4, 4, 5, 5, 1, 1, 6, 6, 7, 7, 8, 8, 2, 2, 9, 9, 10, 10, 3, 3, 11, 11, 0, + 10, 13, 14, 13, 12, 14, 10, 3, 13, 8, 2, 9, 4, 5, 15, 9, 10, 14, 3, 11, 13, + 6, 7, 12, 8, 9, 14, 7, 8, 14, 12, 7, 14, 15, 5, 17, 5, 1, 17, 1, 6, 17, 12, + 13, 15, 13, 11, 16, 15, 13, 16, 11, 0, 16, 0, 4, 16, 6, 12, 17, 12, 15, 17, + 4, 15, 16, 0, 1, 2, 3, + ], + }, + types: vec![ + vec![CellType::Line; 12], + vec![CellType::Triangle; 22], + vec![CellType::Vertex; 4], + ] + .into_iter() + .flatten() + .collect::>(), + }, + data: Attributes { + point: vec![], + cell: vec![], + }, + }), + } +} + +#[test] +fn legacy_ascii() -> Result { + let input = include_str!("../assets/pygmsh/ascii.vtk").as_bytes(); + let out1 = make_test_file(); + assert!(parse_be(input).is_done()); + test_ignore_rem!(parse_be(input) => out1); + let mut outtest = String::new(); + outtest.write_vtk_ne(out1.clone())?; + println!("{}", outtest); + test_b!(parse_ne(String::new().write_vtk_ne(out1.clone())?.as_bytes()) => ne(&out1)); + test_b!(parse_ne(Vec::::new().write_vtk_ne(out1.clone())?) => ne(&out1)); + test_b!(parse_le(Vec::::new().write_vtk_le(out1.clone())?) => le(&out1)); + test_b!(parse_be(Vec::::new().write_vtk_be(out1.clone())?) => out1); + Ok(()) +} + +#[test] +fn legacy_binary() -> Result { + let input = include_bytes!("../assets/pygmsh/binary.vtk"); + let out1 = make_test_file(); + assert!(parse_be(input).is_done()); + test_ignore_rem!(parse_be(input) => out1); + let mut outtest = String::new(); + outtest.write_vtk_ne(out1.clone())?; + println!("{}", outtest); + test_b!(parse_ne(String::new().write_vtk_ne(out1.clone())?.as_bytes()) => ne(&out1)); + test_b!(parse_ne(Vec::::new().write_vtk_ne(out1.clone())?) => ne(&out1)); + test_b!(parse_le(Vec::::new().write_vtk_le(out1.clone())?) => le(&out1)); + test_b!(parse_be(Vec::::new().write_vtk_be(out1.clone())?) => out1); + Ok(()) +} + +#[test] +#[ignore] +fn xml_ascii() -> Result { + let mut vtu = Vtk::import("./assets/pygmsh/ascii.vtu")?; + vtu.file_path = None; // Reset file path to satisfy comparison + assert_eq!(vtu, make_test_file()); + Ok(()) +}