3个版本

0.4.2 2020年6月25日
0.4.1 2020年6月22日
0.4.0 2020年6月22日

#1388 in 解析器实现

Download history 9/week @ 2024-03-11 20/week @ 2024-03-18 43/week @ 2024-03-25 83/week @ 2024-04-01 6/week @ 2024-04-08 5/week @ 2024-04-15 8/week @ 2024-04-22 9/week @ 2024-04-29 15/week @ 2024-05-06 22/week @ 2024-05-13 28/week @ 2024-05-20 19/week @ 2024-05-27 53/week @ 2024-06-03 26/week @ 2024-06-10 30/week @ 2024-06-17 23/week @ 2024-06-24

134 每月下载量
用于 6 个crate(直接使用3个)

MIT 许可证

105KB
2K SLoC

mshio

On crates.io On docs.rs Build Status

用于解析Gmsh MSH文件格式(版本4.1)的解析器库

该库支持解析符合Gmsh文档中指定的MSH文件格式版本4.1的ASCII和二进制编码的MSH文件。

use std::error::Error;
use std::fs;

fn main() -> Result<(), Box<dyn Error>> {
    // Try to read and parse a MSH file
    let msh_bytes = fs::read("tests/data/sphere_coarse.msh")?;
    let parser_result = mshio::parse_msh_bytes(msh_bytes.as_slice());

    // Note that the a parser error cannot be propagated directly using the ?-operator, as it
    // contains a reference into the u8 slice where the error occurred.
    let msh = parser_result.map_err(|e| format!("Error while parsing:\n{}", e))?;
    assert_eq!(msh.total_element_count(), 891);

    Ok(())
}

如果解析成功,函数 parse_msh_bytes 返回一个 MshFile 实例。结构体 MshFile 的结构紧密遵循MSH格式规范。例如,与 MshFile 相关的 MeshData 可能包含一个可选的 Elements 部分。此 Elements 部分可以包含任意数量的 ElementBlock 实例,其中每个 ElementBlock 只包含相同类型和维度的元素。

目前,仅解析MSH文件的以下部分: EntitiesNodesElements。所有其他部分如果按照MSH格式规范由 $SectionName$EndSectionName 定界,则会被静默忽略。

请注意,实际的值不会在MSH格式规范定义的范围之外进行一致性检查。这意味着,解析的元素可能引用节点部分中不存在的节点索引(如果MSH文件已经包含这种不一致)。将来可能会添加检查此的实用函数。

尽管《MshFile》结构体及其所有相关结构体都是泛型类型,但parse_msh_bytes函数强制使用u64i32f64作为输出值类型,分别对应于MSH输入值类型size_tintdouble(当然,size_t值将仍然按照文件头中指定的尺寸解析)。我们没有遇到过使用不同类型(例如64位整数或32位浮点数)的MSH文件,因此无法进行测试。此外,MSH格式规范没有指定浮点数和整数类型的大小。如果用户希望进行类型缩小转换,则应在解析文件后手动进行。

注意,当加载元素/节点和其他实体集合时,解析器会检查这些对象的数目是否可以用系统的usize类型表示。如果不能,则返回错误,因为在这种情况下它们不能存储在Vec中。

什么已经工作?

  • 解析ASCII和二进制(大端/小端)MSH文件。
  • 解析EntitiesNodesElements部分。
  • 支持Gmsh目前支持的所有具有固定节点数的元素类型。

问题

  • 库中包含一些剩余的不再必要的unimplemented!/.expect调用,应该用错误代替。但这些很少,并且几乎所有错误原因都导致实际的Err返回值。
  • 不支持的部分被静默忽略。将来,MshData应该存储一个包含忽略部分名称的列表,以便方便/调试。
  • MSH格式规范允许存在多个相同类型的部分。目前,解析此类MSH文件会导致错误。将它们连接起来需要在解析器中添加更多逻辑,但也可以将相同类型的所有部分存储在Vec中。我们已经决定了一个解决方案,因为我们没有实际世界的示例文件来测试这一点。
  • 库的某些部分需要更多的内部代码文档,解析器可能也需要简化。
  • 需要更多针对特定错误情况的测试用例。

未来工作

  • 目前不支持写入MSH文件,并且在我们优先级列表中非常低,因为我们没有用例。请随时贡献!
  • 解析其他MSH部分。同样,我们目前没有这个用例。
  • 实用函数,用于检查不一致性或帮助将数据转换为更常见的网格表示形式。

依赖项

~3MB
~63K SLoC