1 个不稳定版本
0.1.0 | 2024年6月13日 |
---|
#109 in 模拟
345KB
2K SLoC
polymesh_rw
一个基本的Rust crate,用于读取和写入由OpenFOAM使用的polymesh格式的网格和模拟数据。
功能
此crate仍在开发中。 解析器仅在少量网格上进行了测试。 如果您的网格解析不正确,请通过打开问题并上传您的网格来贡献。
目前,实现了以下功能
- 读取网格
- 写入网格
- 读取结果
- 写入结果
- 解析更常见的OpenFoam数据类型(未识别的类型当前解析为字符串。)
- 二进制文件格式
- 数据一致性检查
贡献
请随时提出建议、测试用例和代码。
lib.rs
:
polymesh_rw
polymesh_rw 是一个用于读取和写入 OpenFOAM polyMesh 文件格式的网格和模拟数据的库。可以将完整案例文件读取到 Case
结构中,该结构包含网格和所有时间目录。
use polymesh_rw::*;
let case_file_path = std::path::Path::new("tests/test_cases/original/cylinder");
let mut case = Case::parse_file(case_file_path)?;
案例结构中的数据在 polymesh
结构中分开,该结构存储网格,以及一个 time_directories
结构,该结构存储模拟数据。例如,位于 constant/polyMesh/boundary
文件中的边界条件将在 case.polymesh.boundary
中找到。
let boundary = &mut case.polymesh.boundary;
数据文件存储在 FileContent
结构中,其中包含元数据(头)和数据。该结构还允许单独解析和写入文件。
let boundary_file_path = &case_file_path.join("constant/polyMesh/boundary");
let boundary_2 = FileContent::<BoundaryData>::parse_file(&boundary_file_path)?;
assert_eq!(*boundary, boundary_2);
所有数据和元数据容器实现了 std::fmt::Debug
,因此可以打印到控制台。
println!("{}", boundary);
底层数据以两种不同的方式存储:要么作为HashMaps,要么作为Vectors。这些数据类型的包装器,提供了解析和写入功能,也实现了Deref和DerefMut,以便于操作。在 FoamStructures (HashMaps) 中,数据存储为 FoamValues,它们指示数据类型
- 字符串
- 浮点数
- 整数
- 列表
- 结构
let FoamValue::Structure(ref mut down_bc) = boundary
.data
.get_mut("down")
.expect("\"down\" boundary condition not found.")
else {
panic!("\"down\" boundary condition is not a structure.");
};
println!("{}", down_bc);
*down_bc.get_mut("type").unwrap() = FoamValue::String("fixedValue".to_string());
println!("{}", down_bc);
文件可以使用write_file
方法写入,该方法将数据写入提供的路径。以下示例中,完整案例被写入一个新的目录。
let modified_case_file_path = std::path::Path::new("tests/test_cases/copy/cylinder");
case.write_file(modified_case_file_path)?;
我们还可以选择只写入boundary
文件,这是完整案例的一部分。
let modified_case_file_path = std::path::Path::new("tests/test_cases/copy/cylinder");
boundary.write_file(modified_case_file_path)?;
我们仍然提供案例目录的路径,但文件将被写入案例目录的正确位置。如果需要更改相对位置,可以通过将正确的相对路径赋值给boundary.meta.location
字段(相对于案例目录)来实现。
依赖项
~2MB
~33K SLoC